2

私はこのような非常に簡単なコードを持っています:

for(int i=0; i<size; ++i)
  for(int j=i; j<size; ++j)
      Function(a[i][j]) 

Function()は非常に時間がかかると想定しているので、OpenMPを使用してコードを並列化したいと思います。jも0から始めれば簡単です。ただし、jは対称行列のようにiから始まります。問題は、このスタイルでコードを並列化する方法です。誰かがこの経験と感謝を前もって持っているに違いないと思います。

4

1 に答える 1

2

外側のループを parallel for ディレクティブでラップする単純な並列化が機能するはずです。行を挿入する

#pragma omp parallel for

あなたの最初のfor声明の前に。私は C ではなく Fortran を書いているので、構文が正しいことは保証できませんが、理解できるはずです。iOpenMP は、設定したスケジュール、または明示的に設定していない場合はデフォルトのスケジュールに従って反復を分散します。

これに関する問題は、ループ オーバーのjトリップ カウントが非常に異なることです。最初 ( の場合i==0) にはsize反復があり、最後の ( の場合i==size-1) には 0 があります。したがって、静的なスケジュールを使用した単純な実装は、プログラムのバランスが著しく悪くなります。このように動的なスケジュールを使用します

#pragma omp parallel for schedule(dynamic, CHUNKSIZE)

CHUNKSIZEは整数です。適切な値を見つけてください。

あなたの関数呼び出しには、私が概説したアプローチを台無しにする副作用や反復の依存関係がないことを前提としています。

于 2013-01-24T08:51:40.323 に答える