外側のループを parallel for ディレクティブでラップする単純な並列化が機能するはずです。行を挿入する
#pragma omp parallel for
あなたの最初のfor
声明の前に。私は C ではなく Fortran を書いているので、構文が正しいことは保証できませんが、理解できるはずです。i
OpenMP は、設定したスケジュール、または明示的に設定していない場合はデフォルトのスケジュールに従って反復を分散します。
これに関する問題は、ループ オーバーのj
トリップ カウントが非常に異なることです。最初 ( の場合i==0
) にはsize
反復があり、最後の ( の場合i==size-1
) には 0 があります。したがって、静的なスケジュールを使用した単純な実装は、プログラムのバランスが著しく悪くなります。このように動的なスケジュールを使用します
#pragma omp parallel for schedule(dynamic, CHUNKSIZE)
CHUNKSIZE
は整数です。適切な値を見つけてください。
あなたの関数呼び出しには、私が概説したアプローチを台無しにする副作用や反復の依存関係がないことを前提としています。