我想讓這個程序運行多個線程。爲什麼OpenMP程序每次都給我不同的答案?
#include <stdio.h>
#include <time.h>
#include <omp.h>
#define NUM_THREADS 4
static long num_steps = 1000000000;
int main()
{
int i;
double x, pi, sum = 0.0;
double step = 1.0/(double)num_steps;
clock_t start = clock(), diff;
#pragma omp parallel for num_threads(NUM_THREADS) reduction (+:sum)
for (i = 0; i < num_steps; i++)
{
x = (i+0.5)*step;
sum += 4.0/(1.0 + x*x);
}
#pragma omp ordered
pi = step*sum;
printf("pi = %.15f\n %d iterations\n", pi, num_steps);
diff = clock() - start;
int msec = diff * 1000/CLOCKS_PER_SEC;
printf("Time taken %d seconds %d milliseconds", msec/1000, msec%1000);
return 0;
}
加入#pragma omp parallel for num_threads(NUM_THREADS) reduction (+:sum)
。在for循環之後我也有#pragma omp ordered
,我不認爲我真的需要它,因爲沒有線程應該繼續,直到所有線程都完成for循環。它是否正確?這也是爲什麼我僅僅將性能作爲一個單線程程序運行的第二次增長的原因?這是6秒,而我的7秒。
我不能回答的是,爲什麼本計劃給我一個不同的答案PI我每次運行時的事情嗎?
我在vs2015測試程序,它給了我pi的每一次 – HDJEMAI
很奇怪的值相同。只是複製並粘貼它並跑了兩次。第一次我得到3.141737761473218,然後第二次得到3.141576654805244。如果這意味着什麼,我在Windows上。也許我應該在Linux中嘗試它。 – rangeme
我得到所有的時間3.141592653589971女巫看起來不錯 – HDJEMAI