我对OpenMP很新。我想使用OpenMP线程将大矩阵的所有元素写入向量中以加快速度。
在我的序列码中,我只是执行以下操作:
m=1
DO k=1,n_lorentz
DO i=1,n_channels
DO p=1,n_lorentz
DO j=1,n_channels
vector(m) = Omega(j,p,i,k)
m=m+1
END DO
END DO
END DO
END DO
现在我想使用OMP循环以并行方式将Omega的元素写入向量:
!$OMP PARALLEL DO PRIVATE(k,i,p,j)
! bla bla
!$OMP END PARALLEL DO
问题是如何跟踪当前向量索引,因为在这种情况下,串行代码中的m
参数将由不同的线程递增,从而导致完全混乱。
答案 0 :(得分:4)
答案是:您不需要跟踪m
。相反,分析循环,我们发现:
j
增加1,m
增加1; p
增加1,m
增加n_channels
; i
增加1,m
增加n_channels*n_lorentz
; k
增加1,m
增加n_channels*n_lorentz*n_channels
。根据这些观察,您可以为m
编写一个显式表达式:
m = j + n_channels*((p-1) + n_lorentz*((i-1) + n_channels*(k-1)))
能够明确计算索引应解决您的问题:)。