该问题来自社区帖: https://bbs.csdn.net/topics/616853342.为符合问答规范, 该问题经过ChatGPT优化
// 开启omp并行, float计算误差累积到了0.2.
{
std::cout.precision(14);
std::array<float, 100000> da;
for (size_t i = 0; i < da.size(); i++)
da[i] = 1.0f * i / da.size();
long cnt = 0;
float cf = 0;
double cdb = 0;
#pragma omp parallel for
for (int i = 0; i < 100000; i++)
{
#pragma omp critical
{
cnt++;
cf += da[i];
cdb += da[i];
}
}
// x86 debug 输出: 100000 49999.6953125 49999.5 (49999.6953125这个值, 还每次都不一样)
// x86 release 输出: 100000 49999.54296875 49999.5 (49999.54296875这个值, 还每次同样不一样)
std::cout << cnt << " " << cf << " " << cdb << std::endl;
cnt = 0;
cf = 0;
cdb = 0;
for (int i = 0; i < 100000; i++)
{
cnt++;
cf += da[i];
cdb += da[i];
}
// x86 debug 输出: 100000 49999.51171875 49999.5
// x86 release 输出: 100000 49999.51171875 49999.5
std::cout << cnt << " " << cf << " " << cdb << std::endl;
}