0

私は些細な問題に見えるもので立ち往生しています(おそらくそれは一日の早い段階です)。領域内で呼び出される関数から、 (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;
}

しかし、確かに、より良い解決策があるはずです。

4

1 に答える 1

2

解決策は非常に単純です-まさにそれを行う句を追加するだけです-それは他のスレッドcopyprivate(x)に構成で使用されるリストされたプライベート変数のインスタンスの値をブロードキャストします:single

int func(vector<int>&args)
{
  int x;
#pragma omp single copyprivate(x)
  x = foo(args);    // foo() must be called in single block
                    // would need to broadcast x to all threads here
  return x;
}
于 2013-03-08T12:56:38.787 に答える