c++ - 使用 OpenMP 对集成进行并行计算

标签 c++ parallel-processing default openmp

我想用 OpenMP 并行化 C++ 代码。 代码不是很简单,但在我看来并行化应该不难,因为我有一个独立系统的集合,我想并行化跨越包含系统的 std::vector 的 for 循环。

集合的维度是 DIM_ENSEMBLE

这是代码中有趣的部分,我尝试进行并行化。这当然行不通。

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

System 是一个包含一些 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 子句中的变量列表。

关于c++ - 使用 OpenMP 对集成进行并行计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18108765/

相关文章:

c++ - 如何提高C或C++中的多维位数组比较性能

c++ - 除以 sizeof(void *) 是什么意思?

c++ - 通过共享对象线程进行的迭代安全吗?

python - 在 IPython 中并行化嵌套 for 循环

ios - 使用 NSUserDefaults 通过首次启动应用程序将开关位置设置为 ON

c++ - 由于非 Ascii 字符,顶点着色器无法编译?

android - qt 传感器上的未定义引用

c++ - 并行计算大 vector 的总和

c++ - 模板类默认类型和条件

javascript - 默认 CSS 设计,使用 Javascript 将下拉菜单选择保存为 Cookie