C ++编译指示OMP分割错误(数据竞争?)与数组

c++ pragma omp segmentation fault (data race?) with arrays

本文关键字:竞争 数据 数组 错误 编译 指示 OMP 分割      更新时间:2023-10-16

我使用 #pragma 指令来并行化我的程序。没有它,一切正常。

不幸的是,我使用必须全局声明的复杂数组,因为它们用于并行化中的多个函数。据我了解,从技术上讲,这没有什么区别,因为它们无论如何都是全局存储的。

但是,有问题的数组是私下使用的。根据我从其他讨论中了解到的情况,我必须在并行化开始之前为数组分配内存,以确保程序为每个线程正确保留内存。在线程中,我再次分配内存。大小(矩阵大小)不会更改。

但即使我设置了 num_threads(1) 来测试线程中的数据(数组"度")最终也会损坏。

在早期版本中,我在线程中声明了数组,并且没有使用任何函数。一切也很好,但现在变得太混乱了。

我试图减少代码。希望可以理解。我使用 gcc 来编译它。

抱歉,我无法找出问题所在。我将不胜感激一些建议。

最好 马蒂亚斯

#include <omp.h>
int matrixsize=200;
vector<int> degree;
vector<list<int> >adjacency;
vector<vector<bool> >admatrix;
vector<vector<float> > geopos;
\[...]
void netgen();
void runanalyses();
\[...]
int main(int argc, char *argv[])
{
\[...]
adjacency.assign(matrixsize,list<int>());
admatrix.assign(matrixsize, vector<bool>(matrixsize, 0));
degree.assign(matrixsize,0);
geopos.assign(matrixsize,vector<float> (dim,0));
#pragma omp parallel for shared(degdist,ADC,ADCnorm,ACC,ACCnorm,its,matrixsize) private(adjacency,admatrix,degree,geopos) num_threads(1)
for (int a=0;a<its;a++)
{
adjacency.assign(matrixsize,list<int>());
admatrix.assign(matrixsize, vector<bool>(matrixsize, 0));
degree.assign(matrixsize,0);
geopos.assign(matrixsize,vector<float> (dim,0));
netgen();
runanalyses();
} // for parallelization
\[...]
}

不幸的是,我使用必须全局声明的复杂数组,因为它们用于并行化中的多个函数。据我了解,从技术上讲,这没有什么区别,因为它们无论如何都是全局存储的。

你真的不应该那样做!修改并行区域内的全局数据结构使得推理数据竞争变得非常困难。相反,定义适当的内部面,例如通过(const)引用传递向量。例如,您可以安全地在并行区域中的const std::vector&上运行。

摆脱全局状态后,仍然遇到问题,请随时提出适当的后续问题,但请确保包括一个最小、完整和可验证的示例(非常仔细地阅读该页面)以及您遇到的特定错误和调试它的尝试的描述。