Openmp 可重现缩减 [重复]

Openmp reproducible reduction [duplicate]

提问人:nadavhalahmi 提问时间:1/23/2023 更新时间:1/24/2023 访问量:159

问:

我有以下示例代码:

!$omp threadpriavate(var)
!$omp parallel do reduction(+:var)
do
    var = var + compilated_floating_point_computation()
end do
!$omp end parallel do
print *,var

即使我使用相同数量的线程,每次运行的 var 结果也略有不同。我尝试添加openmp子句,但出现以下编译错误: .order(reproducible:concurrent)Error: threadprivate variable 'var' used in a region with 'order(concurrent)' clause

有没有办法使用约简,同时在相同数量的线程上仍然保持浮点可重复性?

浮点 Fortran OpenMP 精度 降低

评论

0赞 Ian Bush 1/23/2023
如果你想通过OMP缩减来利用并行性,你不必关心数字的加起来顺序 - 这意味着你会得到结果的变化。如果你确实在乎,你将不得不找到一种方法来对结果进行排序,虽然从理论上讲,出于性能原因,OMP 减少的实现可能会在实践中给你带来好处,但我怀疑实际上没有人这样做。您可能不得不自己旋转。
2赞 Jérôme Richard 1/24/2023
这回答了你的问题吗?并行约简的浮点数相关数值稳定性问题,为什么 OpenMP 约简子句对于静态调度循环是不确定的?以及浮点数学是否被破坏?以及为什么这个 OpenMP 程序每次都给我不同的答案?。这当然不是唯一的。在发布新答案之前,请阅读过去的答案。
0赞 johncampbell 1/27/2023
假设 “compilated_floating_point_computation()” 中没有竞争条件,则解释可能是 var 的浮点溢出。您尚未指示 DO 循环计数或 var 的精度。这可能是 real*4 :: var 和大循环计数的常见问题。实际上,通过使用还原,这可以缓解这种溢出问题,但唯一实用的解决方案是更高精度的累加器。
0赞 PierU 1/27/2023
@johncampbell不需要溢出,浮点计算的不可复制性是约简所固有的

答:

1赞 Victor Eijkhout 1/24/2023 #1

如果你的计算比加法约简要高得多,你可以用计算结果创建一个数组,并按顺序求和。

否则,不同的结果是并行性的内在副作用。接受它的本质,使用稳定的算法,这样它就无关紧要了,或者使用各种集成来获得具有统计意义的结果。