通过集成与OpenMP并行计算
Parallelize computation over ensemble with OpenMP
我想将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, ¤t[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
也是如此。
问题解决方案:将cout
和endl
(或者可能是std::cout
和std::endl
)添加到shared
子句中的变量列表中。
相关文章:
- OpenMP:并行更新数组总是需要减少数组吗
- 如何使用OpenMP并行这两个循环
- 如何使用OpenMP并行化此矩阵时间矢量运算
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 如何使用 OpenMP 并行化最近邻搜索
- OpenMP并行发送哪些元素
- 对于openMP来说,有什么建议可以将以下代码与openMP并行
- 是否可以使用OpenMP并行化一个列表,该列表可以在每次迭代中添加新元素
- std::lock_guard 在 OpenMP 并行中
- 使用与 openmp C++并行的循环计算矩阵中每一行的最小值
- 在 Vulkan 中执行并行计算着色器?
- 嵌套循环 OpenMP 并行化、私有索引还是公共索引?
- C++ openmp 并行计算计算错误的结果
- 在 C++ 中使用 OpenMP 并行化两个 for 循环不会提供更好的性能
- 使用 OpenMP 并行执行比串行执行 c++ 花费更长的时间,我计算执行时间是否正确?
- 尝试使用 OpenMP 并行化递归函数的冗余计算
- 使用OpenMP C++并行计算程序的积分
- 通过集成与OpenMP并行计算
- pi 计算的 OpenMP 并行化要么慢,要么错误
- 简单的OpenMP并行for循环比串行计算慢