我编写了一个平滑粒子流体动力学代码,在使用OpenMP的静态计划时可以产生正确的结果。当我说出正确的结果时,我的意思是我已经根据分析解决方案验证了它们。
但是,我想切换到动态时间表,因为每次迭代要完成的工作不是一成不变的。据我所知,在这种情况下,动态计划会导致更快的计算。实际上,它运行得更快但结果现在不正确,导致看起来IMO成为竞争条件。
我应用OpenMP的循环的简化版本如下:
array1 = 0.0 ! Array of size N
array2 = 0.0 ! Array of size N
array3 = something ! Array of size N, will not change through the loop
!$OMP PARALLEL DO SHARED(array1, array2, array3) FIRSTPRIVATE(N) PRIVATE(i, j, N2, temp) SCHEDULE(runtime) DEFAULT(none)
do i=1,N
N2 = function1(i) ! Reading from array3 and some math
do j=1,N2
temp = 0.0
temp = function2(i,j) ! No writing here, just reading stuff from array3, doing math and storing the result in temp
array1(i) = array1(i) + temp
end do
array2(i) = function3(array1(i)) ! Some math on array1(i), just reading
end do
!$OMP END PARALLEL DO
我调查了"虚假分享"问题,但它似乎只是一个性能问题意味着它不会影响结果(如果我是正确的)。
有人已经遇到过这样的问题吗?我错过了竞争条件吗?