#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]; }
为什么?
(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];
}
除此之外,还不清楚您要实现的目标以及预期的结果。