【发布时间】:2021-12-09 11:13:11
【问题描述】:
在运行大量线程时,我的程序出现了不可预知的错误,我试图通过插入关键部分来找出问题所在。现在我要进行以下操作
void A::func()
{
#pragma omp parallel for
for (int i=0; i<100; ++i)
{
#pragma omp critical
results[i] = compute(i);
}
}
这仍然给我带来了我正在努力寻找的问题。我可以让它消失的唯一方法是删除 for 循环的并行化(不是很理想!)。
注意compute 函数很复杂,实际上使用了一些缓存。如果该代码中存在问题,我不会感到惊讶,但由于整个事情现在处于关键部分,我无法理解发生了什么。
我正在尝试调试的实际 for 循环位于 https://github.com/UCL/STIR/blob/49c65340a2116834fea6a9a5cb17f73eb4a6f259/src/scatter_buildblock/ScatterSimulation.cxx#L179-L198。仍然有问题的测试版本(接近上例)是here
注意:我首先在一个更复杂的场景中发布了这个,但我删除了that post,因为 1)我的简单示例没有显示问题,2)这个场景更加令人费解。
添加了更多信息。我正在使用 Ryzen 9 5900 在 Windows 10 上尝试此操作。我的测试代码显示 WSL2/Ubuntu 20.04 上的 gcc-8 和 gcc-9 偶尔出现问题。 (我观察到 Windows 上的 VS 2019 和 WSL2/Ubuntu 20.04 上的 clang-13 都没有问题,但我猜这并不意味着太多)。
【问题讨论】:
标签: openmp race-condition