2017-01-09 4 views
0

自動並列化 - 私はAbsoftのプロのFortranを使用していますが、次のように私は、コードの一部を持っているメモリ参照が複雑すぎ

program test1 

INTEGER :: q, CAPQ, ingrid(1:6), outgrid(1:10) 

ingrid = (/1,2,3,4,5,6/) 
outgrid = 0 
CAPQ = 6 

DO q=1,CAPQ 
     outgrid(q) = ingrid(q) 
ENDDO 

END 

しかし、私はそれは文句を言わない自動並列化、IT構築する際に理由:

インデックス変数Qを持つループは、分析には複雑すぎる間接的なメモリ参照が含まれているため、並列化できません。

これは非常に単純なメモリアクセスですが、配列から数値を呼び出して別のメモリに配置するだけです。それはどんな順序で起こっても問題ではないので、並列化することができます。

+0

コンパイラは、誤った共有が発生するように、128バイト以内に格納されているスレッドとの並列化を避ける必要があります。 – tim18

+0

は、並列化を禁止しないように、回避する方法がありますか? –

+0

OpenMPへの参照を削除しました。OpenMPは自動並列化をカバーしていないため、absoft proが自動並列化のためにOpenMPを使用しているという参照が見つかりません。本当にOpenMPに関係していると思うかどうかを明確にしてください。 – Zulan

答えて

0

私はAbsoft Fortranに精通していませんが、自動並列化に関して素晴らしい仕事をするコンパイラをまだ見つけていないことがわかります。それはとにかく難しい作業です。あなたが自分でそれを行うなら、達成できるものにも近いコードを並列化できるコンパイラを待っていません。私は、OpenMP(またはあなたが選んだ並列化ライブラリ)を使ってコードを並列化することを強くお勧めします。それは困難ではないし、特にあなたのコードの "ボトルネック"をパラレル化する場合には、本当に効果的です。私はprintステートメントを追加

program test1 
use omp_lib 
implicit none 

integer :: q, CAPQ, ingrid(1:6), outgrid(1:6) 

ingrid=(/1,2,3,4,5,6/) 
outgrid=0 
CAPQ=6 

!$omp parallel do private(q) 
do q=1,CAPQ 
    outgrid(q)=ingrid(q) 
    print "(2(a,i0))","q=",q," processed by thread ",omp_get_thread_num() 
end do 
!$omp end parallel do 

end program test1 

注意実行が実際に並列にDOループを実行していることを確認するために、この特定の例では、コードを容易paralellizedすることができます。コンパイルし、2つの!#ompステートメントの有無を指定してサンプルをコンパイルして実行してください。並列化を有効にすると、並列化が無効になっている場合、

q=6 processed by thread 5 
q=4 processed by thread 3 
q=5 processed by thread 4 
q=2 processed by thread 1 
q=3 processed by thread 2 
q=1 processed by thread 0 

などのようになり、スレッドはすべてゼロになるはずです。

上記の例はgfortranにあり、-fopenmpディレクティブでコンパイルする必要があります。 使用するコンパイラによっては、use omp_libの文を同様のものに置き換える必要があり、コンパイラ指令もわずかに異なる場合があります。私がオンラインで見つけたAbsoft Pro Fortranユーザーズガイドによれば、コンパイラ指令は-openmpです。ユーザーズガイドには、 "積極的なOpenMP"並列化のオプションも記載されています。

+0

誤解を避けるために、doループを並列化することは、Laurence_jjが掲載したテスト例のように必ずしも簡単ではありません。 doループの中の実際のコードは単純な割り当て(doループを削除し、単純な 'outgrid(1:CAPQ)= ingrid(1:CAPQ) 'とにかく)。ループの内容に応じて、他のOpenMP機能を含む特別な注意が必要になることがあります。さらに悪化する可能性があります。場合によっては、doループをまったく並列化できません。 – Pap

関連する問題