OpenMP の lastprivate コンストラクトの機能を理解するために、次のコードを実行しようとしています。lastprivate の定義によると、変数 lastprivate を宣言すると、すべてのスレッドに対してプライベートになり、並列ループの最後の反復を順番に実行しているスレッドの値が領域外の変数にコピーされます。コードは次のとおりです。
int main(void)
{
omp_set_num_threads(5);
int i;
int k =3;
#pragma omp parallel private(i)
{
#pragma omp for lastprivate(k)
for(i=0; i< 5; i++ )
{
int iam = omp_get_thread_num();
k = iam;
printf("k=%d, iam=%d\t",k, iam);
}
}
printf("\n k = %d", k);
}
次のような出力が生成されます。
k=0, iam=0 k=4, iam=4 k=3, iam=3 k=2, iam=2 k=1, iam=1
k = 4
「for」で作業するスレッドのチームがある場合、どのスレッドが最後に実行されるかを実際に保証することはできません。したがって、最後のスレッドの値がグローバル 'k' に反映されるはずです。ただし、コードを何回実行しても、「k」の値は全体的に (つまり、並列セクションが終了した後) 4 のままです。
出力された値からも、スレッド 1 が最後に実行されたことがわかります。プリントがスレッドの正確な実行シーケンスを取得する信頼性がないと仮定したとしても、スレッド 4 が常に最後に実行され、その値が「k」に反映されることは明らかではないようです。
この問題に関するヘルプをいただければ幸いです。ありがとう。