通过集成与OpenMP并行计算

Parallelize computation over ensemble with OpenMP

本文关键字:OpenMP 并行计算 集成      更新时间:2023-10-16

我想将c++代码与OpenMP并行。代码并不简单,但在我看来,并行化应该不难,因为我有一个独立系统的集成,我想并行化跨越包含系统的std::向量的for循环。

ensamble的尺寸为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

cout是一个extern变量,在标准C++库中声明,通常是输出流类(ostream)的实例,可能是专门用于char的模板类型。与任何其他C++变量一样,它在OpenMP parallel区域范围内的数据共享属性必须隐式确定或显式指定。给定default(none)子句,隐式确定被关闭。因此,您必须显式声明cout的数据共享属性。endl也是如此。

问题解决方案:将coutendl(或者可能是std::coutstd::endl)添加到shared子句中的变量列表中。