はい、できます。reduction 句は、個々のワークシェアリング構造だけでなく、並列領域全体にも適用できますfor
。これにより、たとえば、異なる並列セクションで実行される計算の削減が可能になります (コードを再構築するための推奨される方法)。
#pragma omp parallel sections private(val) reduction(+:sum)
{
#pragma omp section
{
bla bla code
sum += val;
}
#pragma omp section
{
bla bla code
sum += val;
}
}
for
セクションを使用して再実装する代わりに、OpenMPワークシェアリング コンストラクトを使用して、チーム内のスレッド間でループの反復を自動的に分散することもできます。
#pragma omp parallel for private(val) reduction(+:sum)
for (row = 0; row < Rows; row++)
{
bla bla code
sum += val;
}
リダクション変数は非公開であり、それらの中間値 (つまり、parallel
領域の最後でのリダクションの前に保持される値) は部分的なものであり、あまり有用ではないことに注意してください。たとえば、次のシリアル ループは (簡単に?) リダクション操作を使用してパラレル ループに変換することはできません。
for (row = 0; row < Rows; row++)
{
bla bla code
sum += val;
if (sum > threshold)
yada yada code
}
ここではyada yada code
、 の累積値が の値を超えると、各反復で を実行sum
する必要がありますthreshold
。ループが並列に実行されると、合計が到達しても、 のプライベート値が にsum
到達しない可能性がありthreshold
ます。