簡體   English   中英

多線程搜索素數

[英]multithreaded search of prime numbers

我有這個代碼計算輸入數字以下的素數數:

#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。

他說我必須考慮一下,因為在第一個核心上運行2-50時存在基本錯誤,而在第二個核心上運行51-99則為x等於100。

有人知道他是對的嗎? 如果是這樣,那么為多核架構做這件事的正確方法是什么?

一般來說,計算is_prime(n + k)的工作量大於計算is_prime(n)的工作量。 你將所有最簡單的工作交給一個核心,把所有最艱苦的工作交給另一個核心,這意味着你不可能達到理想的2倍速度,如果你把它分得更均勻(例如天真,一個偶數,一個奇數,所以工作量大致均勻分開。除非不這樣做;我希望你抓住明顯的缺陷,那里:)

我這樣做的方式是這樣的:

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

然后基本上只需要運行盡可能多的這些。

一些問題是printf不是線程安全的,即使printf是線程安全的,它也可能無序地輸出數字。 因此,您需要修復這些問題 - 例如,在數組中使用原子存儲,並在執行結束時簡單地打印它們。

通過使用素數定理,即π(x)~x / ln(x),可以得到小於N的素數的非常接近的近似值

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM