最简单的循环累加器给出了不正确的结果
OpenMP - simplest accumulator in loops gives incorrect result
我使用英特尔c++编译器并在16线程上运行程序。我想让第一个循环并行运行。count的结果应该是30000000,我猜。然而,结果是少于3000万。虫子在哪里?谢谢!
#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);
}
您已经编写了一个规范的数据竞赛。程序中的所有线程都在争着更新变量count
,并且不能保证每个线程读取、更新然后将值写入变量的顺序。不管你怎么想,c++并不能保证自动地应用++
。
您应该继续阅读OpenMP教程,了解共享(和私有)变量,以及减少。
如果你在这里搜索SO,你应该会发现类似的问题,其中一些问题的答案包括代码,向你展示如何做你正在尝试做的事情。
您还可以通过插入:
命令omp自动执行增量操作 #pragma omp atomic
在你的count++行之前。这样就避免了前面HPM描述的竞态条件。参见http://msdn.microsoft.com/en-us/library/8ztckdts.aspx或https://computing.llnl.gov/tutorials/openMP/#ATOMIC
相关文章:
- 密码登录程序将永远循环并显示不正确的结果
- 特征 LLT 模块给出不正确的结果?
- 计算幂级数的数学结果不正确
- wcslen() 在使用编译指示包时返回不正确的结果
- 使用动态分配的数组进行矩阵乘法;结果不正确
- CMake 查找特征不正确的结果
- 将函数的地址转换为UINTPTR_T给我不正确的结果
- 使用 C++ 中的运算符重载显示不正确的结果
- 简单的程序比较阵列运行但给出不正确的结果
- 在运行libtorch的模型时获得的结果是不正确的,该模型经过训练并从Pytorch出口
- 当我输入分数值时,它返回不正确的结果
- time_t提高日期转换,给出不正确的结果
- 为什么隐式类型转换在此代码中结果不正确
- 排序向量不断修改数据并打印不正确的结果
- 使用Boost Polygon的减法结果不正确
- 脑解释器在C++产生不正确的结果
- 具有OFN_ALLOWMULTISELECT不正确的快捷方式结果的 CFileDialog
- 递归阶乘函数在"22!"上产生不正确的结果
- GLM 矩阵乘法向量给出不正确的结果
- 浮点数和由于舍入行为导致的不正确结果