我正在使用intel C ++编译器并在16个线程上运行该程序。我希望第一个循环并行运行。我想,“计数”的结果应该是30000000。然而,事实证明它不到30000000.这个错误在哪里?谢谢!
#include <stdio.h>
#include <omp.h>
int main(){
long count = 0;
#pragma omp parallel
{
#pragma omp for
for (long i = 0; i < 10000000; i++){
for (int j = 0; j < 3; j++){
count++;
}
}
}
printf("%d", count);
}
答案 0 :(得分:2)
您已编写了规范的数据竞赛。程序中的所有线程都在争用更新变量count
,并且无法保证每个线程读取,更新,然后将值写入变量的顺序。无论您怎么认为C ++都不能保证++
原子应用。
您应该继续阅读OpenMP教程,了解共享(和私有)变量,以及减少。
如果你在这里搜索SO,你应该找到类似的问题,其中一些问题包括代码,以告诉你如何做你想做的事。
答案 1 :(得分:0)
您还可以通过插入以下内容来指示omp以原子方式执行增量:
#pragma omp atomic
在计算++行之前。然后,您可以避免以前HPM描述的竞争条件。请参阅http://msdn.microsoft.com/en-us/library/8ztckdts.aspx或https://computing.llnl.gov/tutorials/openMP/#ATOMIC