C ++ OpenMP:意外竞赛[关闭]

问题描述 投票:-1回答:1
我在使用OpenMP时遇到了意外问题。以下代码产生不正确的结果:

#pragma omp parallel for for (size_t q = 0; q < dividend.size(); ++q) { dividend[q] += (1 / divisor[q]) * delta[q]; }

如果使用std::cout,一切正常:

#pragma omp parallel for for (size_t q = 0; q < dividend.size(); ++q) { std::cout << dividend[q] << divisor[q] << delta[q] << std::endl; dividend[q] += (1 / divisor[q]) * delta[q]; }

为什么?    
c++ openmp race-condition
1个回答
0
投票
(1 / divisor[q]) * delta[q]是没有用的。它包含1个除法和1个乘法。只需delta[q] / divisor[q],您会更好。数字错误也更少。 (此外,这可能是错误的来源,因为对于整数divisor[q] > 1,语句(1 / divisor[q]) * delta[q]的总值将为0。)

另外,请养成在OpenMP语句中指定捕获的习惯。对于哪些变量隐式私有或共享,不同的编译器有不同的想法。在开发过程中,default(none)是您的朋友。

#pragma omp parallel for default(none) shared(dividend, delta, divisor) for (size_t q = 0; q < dividend.size(); ++q) { dividend[q] = delta[q] / divisor[q]; }

除此之外,还不清楚您要实现的目标以及预期的结果。    
© www.soinside.com 2019 - 2024. All rights reserved.