【发布时间】:2016-05-13 13:00:06
【问题描述】:
我想通过部分简单代码将循环性能与 openmp 进行比较。但结果是错误的。
我已经使用归约来避免竞争条件,但从来没有工作过。
这是我的代码:感谢您的任何建议
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 < MP_TEST_NUM; k++) // just for delay你希望那是一个空循环吗?那么你最后需要一个;。 -
@Johnny Mopp 感谢您的通知。但在添加“;”之后对于延迟循环。结果还是不匹配。
-
我手动计算结果是 49995000 和 sumNoMP = 49992896 sum = 49994736.....
-
如果你想避免四舍五入,你可以使用 double
-
考虑使用 Kahan 求和。
标签: visual-c++ floating-point openmp reduction