ループのパフォーマンスをopenmpと単純なコードの一部で比較したい。しかし結果は間違っています。OpenMP forループで間違った結果が発生する
私は既にレースコンディションを避けるためにリダクションを使用していますが、動作しません。
は、ここに私のコードです:
void TestMP_1(){
float afValueTmp[MP_TEST_NUM] = { 0 }; // MP_TEST_NUM = 10000
float sum = 0, sumNoMP = 0;
float fDiff = 0;
double eTDiff = 0;
double t0 = 0;
double t1 = 0;
for (int i = 0; i < MP_TEST_NUM; i++)
{
afValueTmp[i] = i;
}
t0 = (double)getTickCount();
for (int i = 0; i < MP_TEST_NUM; i++)
{
for (int k = 0; k < MP_TEST_NUM; k++); // just for delay
sumNoMP += afValueTmp[i]; // equation 4
}
t0 = ((double)getTickCount() - t0)/getTickFrequency();
t1 = (double)getTickCount();
#pragma omp parallel for reduction(+:sum)
for (int i = 0; i < MP_TEST_NUM; i++)
{
for (int k = 0; k < MP_TEST_NUM; k++); // just for delay
sum += afValueTmp[i];
}
t1 = ((double)getTickCount() - t1)/getTickFrequency();
eTDiff = t0 - t1; // time improve
fDiff = sum - sumNoMP; // check result
printf("%.3f\n", eTDiff);
}
for(int k = 0; k
@ Johnny Moppは通知のために感謝します。しかし、 ";"遅延ループのために。結果はまだ一致しません。 –
私は手動で結果が49995000 であり、sumNoMP = 49992896 sum = 49994736 ..... –