我有一个问题,我想针对非并行系统测试并行系统。
在系统 1 中,我这样建立内存:
std::vector<double>* p_val_vec_main = new std::vector<double>(*mpStages);
std::vector<double>* p_val_vec_slave = new std::vector<double>(*mpStages-1);
std::vector<std::vector<double> >* p_mat_cache =
new std::vector<std::vector<double> >(3, std::vector<double>());
这些 vector 被传递,并在重复的 RAII 系统中使用,因此产生了指针和新语法。
在系统 2(并行系统)中,我试图建立并行的 3 个 vector ,因为没有 - 假定 - 重叠:
#pragma omp parallel
{
std::vector<double>* p_val_vec_main = new std::vector<double>(*mpStages);
std::vector<double>* p_val_vec_slave = new std::vector<double>(*mpStages-1);
std::vector<std::vector<double> >* p_mat_cache =
new std::vector<std::vector<double> >(3, std::vector<double>());
}
然而,我第一次在 pragma block 外引用“p_val_vec_main”,但在 pragma block 所在的方法内,在系统 2 中的有效元素上,我收到错误代码:
error: 'p_val_vec_main' was not declared in this scope
想知道是否有人知道为什么会这样?关于这可能是什么,我唯一的想法可能是本地/全局冲突。
最佳答案
您遇到的问题是您仅在系统 2 上使用的 #pragma omp parallel
block 创建了一个隐藏指针的附加作用域级别(在左大括号和右大括号之间)变量 p_val_vec_main
(和其他变量)来自它前后的任何语句。这是使用 omp parallel
的必要部分,因为 OpenMP 在内部将 parallel
block 内的语句转换为函数,因此在该 block 内声明的任何变量都成为函数局部变量。
如果您想在 omp parallel
block 内初始化 vector 但在 block 外使用它们,则需要在更高级别的范围内声明指针,如下所示:
std::vector<double>* p_val_vec_main;
std::vector<double>* p_val_vec_slave;
std::vector<std::vector<double> >* p_mat_cache;
#pragma omp parallel
{
p_val_vec_main = new std::vector<double>(*mpStages);
p_val_vec_slave = new std::vector<double>(*mpStages-1);
p_mat_cache =
new std::vector<std::vector<double> >(3, std::vector<double>());
}
//p_val_vec_main can be used here
关于c++ - 在并行 C++ 中建立内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40772353/