21

OpenMP は、配列を表す変数の削減をネイティブにサポートしていますか?

これは次のように機能します...

float* a = (float*) calloc(4*sizeof(float));
omp_set_num_threads(13);
#pragma omp parallel reduction(+:a)
for(i=0;i<4;i++){
   a[i] += 1;  // Thread-local copy of a incremented by something interesting
}
// a now contains [13 13 13 13]

理想的には、omp parallel for にも同様のものがあり、それが意味を成すのに十分な数のスレッドがある場合、累積はバイナリ ツリーを介して行われます。

4

5 に答える 5

9

C および C++ の OpenMP 4.5 で配列の縮小が可能になりました。次に例を示します。

#include <iostream>

int main()
{

  int myArray[6] = {};

  #pragma omp parallel for reduction(+:myArray[:6])
  for (int i=0; i<50; ++i)
  {
    double a = 2.0; // Or something non-trivial justifying the parallelism...
    for (int n = 0; n<6; ++n)
    {
      myArray[n] += a;
    }
  }
  // Print the array elements to see them summed   
  for (int n = 0; n<6; ++n)
  {
    std::cout << myArray[n] << " " << std::endl;
  } 
}

出力:

100
100
100
100
100
100

これをGCC 6.2でコンパイルしました。OpenMP 4.5 機能をサポートする一般的なコンパイラのバージョンは、https ://www.openmp.org/resources/openmp-compilers-tools/ で確認できます。

上記のコメントから、これは便利な構文ですが、各スレッドの各配列セクションのコピーを作成することにより、多くのオーバーヘッドが発生する可能性があることに注意してください。

于 2016-11-07T17:14:25.567 に答える
3

OpenMP 3.0 の Fortran でのみ、おそらく特定のコンパイラでのみ。

次の最後の例 (例 3) を参照してください。

http://wikis.sun.com/display/openmp/Fortran+Allocatable+Arrays

于 2010-10-24T17:37:41.757 に答える
1

OpenMPは、配列または構造体型変数の削減を実行できません(制限を参照)。

privateまた、 andshared句 を読みたいと思うかもしれません。private変数を各スレッドに対してプライベートであるとshared宣言しますが、変数をすべてのスレッド間で共有することを宣言します。また、OpenMPとアレイに関して、この質問への回答が非常に役立つことがわかりました。

于 2010-10-22T01:38:01.223 に答える