3

C++ コードを OpenMP で並列化したいと考えています。コードはそれほど単純ではありませんが、独立したシステムのアンサンブルがあり、システムを含む std::vector にまたがる for ループを並列化したいので、並列化は難しくないと思います。

アンサンブルの次元は DIM_ENSEMBLE です

ここにコードの興味深い部分があり、並列化を試みています。もちろん、これは機能しません。

vector<Systems> system(DIM_ENSEMBLE);
vector<double> current(100);

システムは、いくつかの std::vector を含む構造体です

/* do things
...
*/

while (time < T){
/*154*/ #pragma omp parallel for default(none) shared(r, DIM_ENSEMBLE, system, current) private(i, max_rate, time_increment, R, j, status)
    for  (i =0; i< DIM_ENSEMBLE; i++) {
     max_rate = function_A_of(i);
     time_increment = function_B_of(r,max_rate);
     R = function_C_of(r,max_rate);
     j = function_D_of(System, i, R);
     status = update_the_system(&system[0], i, time_increment, j, &current[0]);
     if (status!=1) {
      #pragma omp critical
      {
/*173*/ cout << "ERROR " << i << " " << time_increment <<  " " << j <<endl;
      }
     }
    update_time(time);
    } //end for loop 

/* now calculate some averages and distributions from the ensemble
....
 */
} //end while loop 

ここにコンパイルエラーがあります:

  one-node-hirsch-parallel.cpp:173: error: ‘cout’ not specified in enclosing parallel
  one-node-hirsch-parallel.cpp:154: error: enclosing parallel
4

1 に答える 1

8

cout標準 C++ ライブラリで宣言されたextern変数で、通常は出力ストリーム クラス ( ostream) のインスタンスであり、場合によっては で特化されたテンプレート型ですchar。他の C++ 変数と同様に、OpenMPparallel領域のスコープ内でのデータ共有属性は、暗黙的に決定されるか、明示的に指定される必要があります。句が与えられるとdefault(none)、暗黙の決定はオフになります。その結果、 のデータ共有属性を明示的に宣言する必要がありますcout。についても同様endlです。

問題の解決: coutand endl(または場合によってはstd::coutand ) を節std::endlの変数のリストに追加します。shared

于 2013-08-07T20:14:27.667 に答える