私は些細な問題に見えるもので立ち往生しています(おそらくそれは一日の早い段階です)。領域内で呼び出される関数から、 (1)すべてのスレッドで同じでなければならないが、(2)ブロックomp parallel
で計算される値を返したい。omp single
どうやってやるの?小さなコードスニペットは次のとおりです。
// must work correctly when called from within omp parallel region
// this version is flawed. please suggest corrections
int func(vector<int>&args)
{
int x;
#pragma omp single
x = foo(args); // foo() must be called in single block
// would need to broadcast x to all threads here
return x; // error: x only set for thread which executed foo()
}
// possible usage (elsewhere, you're not allowed to change this code)
#pragma omp parallel
{
/* ... */
int y = func(args);
/* ... */
}
かなりエレガントでない解決策の1つは、single
ブロックを次のparallel for
ようにキャストすることreduction
です。
int func(types args)
{
int x=0;
#pragma omp for reduction(+:x)
for(int i=0; i<1; ++i)
x = foo(args);
return x;
}
しかし、確かに、より良い解決策があるはずです。