簡単な OpenMP プログラム:
#include <omp.h>
#include <iostream>
int main() {
int var = 0;
int var2 = 0;
#pragma omp parallel private(var) shared(var2)
{
var = 1;
int tid = omp_get_thread_num();
printf("Inside the parallel region, var gets modified by thread #%d to %d\n",tid,var);
if(tid == 0)
var2 = var;
}
printf("Outside the parallel region, var = %d\n", var);
printf("Outside the parallel region, var2 = %d\n", var2);
}
結果:
Inside the parallel region, var gets modified by thread #3 to 1
Inside the parallel region, var gets modified by thread #0 to 1
Inside the parallel region, var gets modified by thread #6 to 1
Inside the parallel region, var gets modified by thread #1 to 1
Inside the parallel region, var gets modified by thread #5 to 1
Inside the parallel region, var gets modified by thread #7 to 1
Inside the parallel region, var gets modified by thread #2 to 1
Inside the parallel region, var gets modified by thread #4 to 1
Outside the parallel region, var = 0
Outside the parallel region, var2 = 1
私がやりたいことは、 の値var
を、並列領域内で最後に変更された値に設定することです。
#pragma omp for
ループではないのでlastprivate
無効です。
並列領域の外でvar
は、元の値 0 を取得します。共有変数を使用してvar2
、マスター スレッドから変更された値を格納するのがコツです。
しかし、これはオーバーヘッドを増加させ、エレガントなアプローチではないようです。マスターではなく最後のスレッドによって変更された値を取得したい場合(たとえば、どのスレッドが最後に終了したかを調べるため)、このトリックはうまくいかない。
私は OpenMP にまったく慣れていないので、何かが欠けている可能性があります。そうでない場合、このトリッキーなことを乗り越える方法はありますか?
どうもありがとうございました。
編集:私の質問は、並列領域が終了した後、プライベート変数の最後の値を維持する方法についてです。lastprivate
または、概念的に での使用が無効である理由を説明できれば#pragma omp parallel
、それを完璧な答えと見なします。