这是在F90中,但这个问题适用于任何支持OpenMP的语言。对于需要多个存储阵列的模拟代码结构数据的典型方式进行时间积分会(2维现在):告诉阵列的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
,因为它可能不知道没有线程依赖性问题,但实际上没有?我知道有一些方法可以告诉它某些东西不是线程安全的并且需要锁定,但有没有一种方法可以指定反转而不为每个线程创建副本?