2013-06-01 60 views
3

我有這樣的代碼,計數下面的輸入數量質數數量:多線程搜索素數

挑戰的
#include<stdio.h> 
#include<Math.h> 

int is_prime(long num) 
{ 
    int k = 1, a = 0, b = 0; 
    long sr; 
    switch(num) 
     { 
     case 1: return 0; 
     case 2: return 1; 
     case 3: return 1; 
     case 4: return 0; 
     case 5: return 1; 
     case 6: return 0; 
     case 7: return 1; 
    } 
    if (num % 2 == 0) return 0; 
    if (num % 3 == 0) return 0; 
    sr = (int) sqrt(num); 
    while (b < sr) { 
     a = (6 * k) - 1; 
     b = (6 * k) + 1; 
     if (num % a == 0) 
      return 0; 
     if (num % b == 0) 
      return 0; 
     k += 1; 
    } 
    return 1; 
} 

void main() 
{ 
    int j; 
    long num=0; 
    printf("insert your number to check for prime numbers\n"); 
    scanf("%ld",&num); 
    for (j = 0; j<num; j++){ 
     if (is_prime(j)) 
      printf("%d is a prime\n", j); 
    } 
} 

部分 - 有人問我,如果我可以通過多內核加速我的計算處理,我回答說是的。例如,如果我想檢查100以下的素數,那麼使用第一個線程計算2-50,第二個線程計算51-99。

他說,我得好好考慮一下,因爲在1號核心運行2-50基本的故障,以及51-99對X等於第二個內核100

有誰知道他是否正確?如果是這樣,那麼多核架構的正確方法是什麼?

回答

4

一般來說,計算is_prime(n + k)的工作量大於計算is_prime(n)的工作量。你將所有最簡單的工作都交給一個核心,所有最難的工作都交給另一個核心,這意味着如果你將它分成更均勻的分量,你不可能達到理想的2倍加速的理想速度(例如,天真, 。即使是在一個,奇另一方面,這樣的工作量大致平分秋色除了不這樣做,數字,我希望你能趕上明顯缺陷,那裏:)

0

我做的方式它是沿着這些路線的東西:

void threadfunction() 
    { 
     for(;;) 
     { 
      number = pick_next_number(); // Should be atomic. 
      if (number > maxnumber) 
       return; 
      if (is_prime(number)) 
       printf("%d\n", number); 
     } 
    } 

然後基本上只運行儘可能多的這些,因爲你需要。

一些問題是printf不是線程安全的,即使printf是線程安全的,它也可能會輸出數字。因此,您需要解決這些問題 - 例如,通過在數組中使用原子存儲,並在執行結束時將其打印出來。

0

您可以通過使用素數定理是π得到N多素少的數量非常接近的近似(X)〜X/LN(x)的

π(x)是素數計數函數與pi常量無關。