2017-02-20 5 views
0

私はむしろ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ループを使用したい:

!$OMP PARALLEL DO PRIVATE(k,i,p,j) 
    ! bla bla 
!$OMP END PARALLEL DO 

問題は、現在のベクトルインデックスを追跡する方法です。この場合、シリアルコードのmパラメータが異なるスレッドによって増分され、結果的に全体が混乱するためです。

答えて

4

答えは1つです:mを追跡する必要はありません。代わりに、ループを分析し、我々はそれを見つける:

  • たびに一つずつ、m増加によってj増加します。
  • pが1つずつ増加するたびに、mは、n_channelsで増加します。
  • iが1つ増加するたびに、mは、n_channels*n_lorentzで増加します。
  • kが1つ増加するたびに、mn_channels*n_lorentz*n_channelsだけ増加します。これらの観察から、

、あなたはmのための明示的な表現書くことができます。

m = j + n_channels*((p-1) + n_lorentz*((i-1) + n_channels*(k-1))) 

が明示的に指数を計算することができることを:)あなたの問題を解決する必要があります。

+0

ありがとうございます!これは確かに仕事をしています:) – Cooliofan

関連する問題