这是在 F90 中,但问题适用于任何支持 OpenMP 的语言。为需要多个存储阵列进行时间集成的模拟代码构建数据的典型方法是(目前为二维):
REAL, DIMENSION(imax,jmax,n_sub_timesteps) :: vars
然后将使用以下内容进行更新:
DO J = 1, jmax
DO I = 1, imax
vars(I,J,2) = func(vars(:,:,1))
END DO
END DO
根据我的经验,OpenMP 实际上不会并行化这些循环,因为它认为vars
不是线程安全的。但对程序员来说,显然是这样。
让我们假设进一步的实际情况,使vars
线程本地化太昂贵而无法将数据复制到其中。
那么,有没有办法温和地暗示(又名强制)OpenMP 不锁定vars
,因为它可能无法确定没有线程依赖问题但实际上没有?我知道有办法告诉它某些东西不是线程安全的并且需要锁定,但是有没有办法在不为每个线程制作副本的情况下指定逆向?