C ++编译指示OMP分割错误(数据竞争?)与数组
c++ pragma omp segmentation fault (data race?) with arrays
我使用 #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&
上运行。
摆脱全局状态后,仍然遇到问题,请随时提出适当的后续问题,但请确保包括一个最小、完整和可验证的示例(非常仔细地阅读该页面)以及您遇到的特定错误和调试它的尝试的描述。
相关文章:
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- OpenMP:for 循环避免数据竞争,而无需使用关键
- std::weak_ptr 和相应的 std::shared_ptr 之间是否存在数据竞争?
- 在使用 std::cout 和多线程程序中如何避免数据竞争<iomanip>?
- 为什么将 operator() 的定义从 .h 移动到.cpp文件会导致数据竞争?
- 如何避免与"asio::ip::tcp::iostream"的数据竞争?
- C ++编译指示OMP分割错误(数据竞争?)与数组
- 可能的数据竞争在内存中写入相同地址之间
- 为什么在以下情况下没有数据竞争
- 是什么导致了 std::async 中的数据竞争
- 原子线程围栏:为什么在这个非原子变量上存在数据竞争?这有关系吗
- 数据与C++ std::future竞争.编译器重新排序
- ThreadSanitizer说我的Atomic Inc / Dec有数据竞争,误报
- Qt的moveToThread和数据竞争
- 如何在一个套接字上实现并行请求和响应的非阻塞客户端-服务器通信模型,而不存在数据竞争
- 这段代码中是否存在数据竞争?
- 这个并行循环会导致数据竞争吗?
- 使用std::unordered_map进行数据竞争,尽管使用互斥锁插入