我正在寫一個c腳本來平行pi近似與OpenMp。我認爲我的代碼工作正常,有一個令人信服的輸出。我現在用4個線程運行它。我不確定的是,如果這段代碼容易受到競爭狀況的影響?如果是這樣,我如何協調此代碼中的線程操作?蒙特卡羅pi逼近的並行化
的代碼如下:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <omp.h>
double sample_interval(double a, double b) {
double x = ((double) rand())/((double) RAND_MAX);
return (b-a)*x + a;
}
int main (int argc, char **argv) {
int N = atoi(argv[1]); // convert command-line input to N = number of points
int i;
int NumThreads = 4;
const double pi = 3.141592653589793;
double x, y, z;
double counter = 0;
#pragma omp parallel firstprivate(x, y, z, i) reduction(+:counter) num_threads(NumThreads)
{
srand(time(NULL));
for (int i=0; i < N; ++i)
{
x = sample_interval(-1.,1.);
y = sample_interval(-1.,1.);
z = ((x*x)+(y*y));
if (z<= 1)
{
counter++;
}
}
}
double approx_pi = 4.0 * counter/ (double)N;
printf("%i %1.6e %1.6e\n ", N, 4.0 * counter/ (double)N, fabs(4.0 * counter/ (double)N - pi)/pi);
return 0;
}
此外,我在想,如果隨機數種子應內部或外部並行申報。我的輸出如下所示:
10 3.600000e+00 1.459156e-01
100 3.160000e+00 5.859240e-03
1000 3.108000e+00 1.069287e-02
10000 3.142400e+00 2.569863e-04
100000 3.144120e+00 8.044793e-04
1000000 3.142628e+00 3.295610e-04
10000000 3.141379e+00 6.794439e-05
100000000 3.141467e+00 3.994585e-05
1000000000 3.141686e+00 2.971945e-05
現在看起來不錯。你對種族條件和種子安置的建議是最受歡迎的。
什麼的'文檔'rand()''和''srand()''說?如果他們說,數字發生器的狀態保存在線程本地存儲中,至少這不會是一個問題。但他們是這麼說的嗎?這裏:http://www.cplusplus.com/reference/cstdlib/rand/他們說那些比賽可能會發生。 – BitTickler