使用OpenMP

时间:2017-02-20 23:16:17

标签: fortran openmp

我对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参数将由不同的线程递增,从而导致完全混乱。

1 个答案:

答案 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)))

能够明确计算索引应解决您的问题:)。