[英]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.