具有动态数组分配的OpenMP嵌套循环
OpenMP nested loop with dynamic array assignment
如果这是一个愚蠢的问题,但我没有找到任何类似的问题,请原谅我。
我想在第一个循环中(在C++中(将值分配给一个具有OpenMP并行的三维动态数组。
int i, j, k;
int ***data;
const int NEL = 100;
const int NINT = 2;
data = new int**[NEL];
for (i = 0; i < NEL; i++) {
data[i] = new int*[NINT*NINT*NINT];
for (j = 0; j < NINT*NINT*NINT; j++) {
data[i][j] = new int[NINT*NINT*NINT];
}
}
#pragma omp parallel for
for (i = 0; i < NEL; i++) {
for (j = 0; j < NINT*NINT*NINT; j++) {
for (k = 0; k < NINT*NINT*NINT; k++) {
data[i][j][k] = 1;
}
}
}
我只想让最外层的循环(I(与嵌套的循环(j和k(并行执行。但是编译器每次都抛出访问冲突错误。
如果我将动态数组更改为本地数组,它将不会有任何问题。
int i, j, k;
const int NINT = 2;
const int NEL = 100;
int data[NEL][NINT*NINT*NINT][NINT*NINT*NINT];
#pragma omp parallel for
for (i = 0; i < NEL; i++) {
for (j = 0; j < NINT*NINT*NINT; j++) {
for (k = 0; k < NINT*NINT*NINT; k++) {
data[i][j][k] = 123;
}
}
}
我使用的是启用了OpenMP功能的Visual Studio 2015。是因为VS 2015中的OpenMP版本只有2.0吗?或者我没有正确使用OpenMP的动态数组?
您需要在并行区域内声明循环变量,最好执行
#pragma omp parallel for
for (int i = 0; i < NEL; i++) {
for (int j = 0; j < NINT*NINT*NINT; j++) {
for (int k = 0; k < NINT*NINT*NINT; k++) {
data[i][j][k] = 1;
}
}
}
否则,循环变量将默认共享,可能导致对data
的越界访问
通常,这里最好使用std::vector
:
std::vector<std::vector<std::vector<int > > > data;
如果你选择性能,你想使用连续内存
std::vector<int> data;
然后通过建立动态索引来访问CCD_ 3
data[k+pow(NINT,3)*j+pow(NINT,6)*i] = 1;
最好在这里使用小型索引功能,使更容易访问数据
int dataIndex(int i, int j, int k, int NINT){return k+pow(NINT,3)*j+pow(NINT,6)*i;}
然后作为访问CCD_ 4
data[dataIndex(i,j,k,NINT)]=1;
编译器很可能会内联函数,这样函数调用就不会有额外的开销。
尝试将pramga更改为;
#pragma omp parallel for shared(data) private(i,j,k)
然而,为了扩展我的评论,您正在对大量线程进行并行化,但给每个线程都提供了少量的工作,这意味着与实际好处相比,调度它们的开销将非常大。
最重要的是,在大多数系统上,2*2*2*sizeof(int(可能小于缓存行,这意味着两个线程可能会同时尝试写入同一行,从而导致错误冲突并在缓存之间对该行进行ping。
相关文章:
- 如何使用 OpenMP 减少嵌套循环?
- 具有动态数组分配的OpenMP嵌套循环
- OpenMP 和不平衡嵌套循环
- OpenMP 嵌套循环处理性能
- 嵌套循环 OpenMP 并行化、私有索引还是公共索引?
- 用于在一维数组上嵌套循环操作的正确 openmp 指令
- 在 C 中并行化嵌套循环的几种方法之间的差异,C++使用 OpenMP
- OpenMP,嵌套循环设计策略
- OpenMP 嵌套循环,每个"for"循环之间都有代码
- Openmp:嵌套循环和分配
- OpenMP:嵌套的 for 循环,执行时间几乎没有任何差异
- 将OpenMP应用于C++中的特定嵌套循环
- C++中用于嵌套循环的OpenMP编程的锁定策略
- 具有嵌套循环和函数调用的 OpenMP
- 嵌套循环中的 OpenMP 数组索引
- OpenMP - 并行化嵌套循环
- openMP 嵌套并行用于循环与内部并行
- 如何为嵌套循环配置openMP以保持内部循环不并行
- OpenMP嵌套循环索引依赖项
- 使用OpenMP并行嵌套循环