OpenACC - 私有 2D 阵列
OpenACC - Private 2D array
我正在处理块对角矩阵(每个块的大小相同(,当我使用动态分配的 2D 数组时private
我有一个illegal address error
......
// NB is the number of block
// N is the block size
// A is the main matrix (block diagonal)
double** B; // a block
B = new double*[N];
for (unsigned int i = 0; i < N; i++)
B[i] = new double[N];
#pragma acc parallel loop private(B[:N][:N]) copyin(A[:NB*N][:NB*N])
for (unsigned int b = 0; b < NB; b++) {
#pragma acc loop
for (unsigned int i = 0; i < N; i++) {
#pragma acc loop
for (unsigned int j = 0; j < N; j++) {
B[i][j] = A[b*N+i][b*N+j];
}
}
// process B
}
for (unsigned int i = 0; i < N; i++)
delete[] B[i];
delete[] B;
我得到的错误是:
call to cuStreamSynchronize returned error 700: Illegal address during kernel execution
如果我将数组展平为一维数组并使用词典索引或静态二维数组,它工作正常,但我使用的是需要double**
作为参数的函数,所以我宁愿坚持使用动态 2D 数组......
我已经阅读了规范中的 private
条款,但它并没有说不支持动态 2D 数组,所以我想我做错了什么......
抱歉,不支持在私有子句中使用指针数组。 问题在于编译器运行时必须为每个组、工作线程或向量动态创建一个私有(取决于带有私有子句的循环(并填写所有设备指针。 这将带来极高的间接成本。
如果 "B" 是一个固定大小的静态数组,"double B[N][N]",那么你可以在私有子句中使用它。
否则,我建议通过添加第三个维度来手动私有化数组。
// NB is the number of block
// N is the block size
// A is the main matrix (block diagonal)
double*** B; // a block
B = new double**[NB];
for (unsigned int i = 0; i < NB; i++) {
B[i] = new double*[N];
for (unsigned int j = 0; j < N; j++) {
B[i][j] = new double[N];
}}
#pragma acc parallel loop create(B[:NB][:N][:N]) copyin(A[:NB*N][:NB*N])
for (unsigned int b = 0; b < NB; b++) {
#pragma acc loop
for (unsigned int i = 0; i < N; i++) {
#pragma acc loop
for (unsigned int j = 0; j < N; j++) {
B[b][i][j] = A[b*N+i][b*N+j];
}
}
// process B
}
for (unsigned int i = 0; i < NB; i++) {
for (unsigned int j = 0; j < N; j++) {
delete[] B[i][j];
}
delete[] B[i];
}
delete[] B;
相关文章:
- C++动态安全 2D 交错阵列
- 库特<<恩德尔;不适用于打印 2D 阵列
- 具有可变尺寸的 C++ 2D 阵列
- 如何通过Boost.MPI发送2d Boost.MultiArray的子阵列?
- 如何从2d Boost.MultiArray获取子阵列?
- 基于用户输入的 2D 动态阵列
- 2D 动态阵列被视为特洛伊木马?
- 如何遍历 2D 阵列?
- 超级对撞机2D阵列:生成嵌套:包装/尺寸问题
- 动态 2D 阵列.为什么分段错误?
- 尝试使用2D阵列
- 分配给阵列时出现分段错误?黑客排名 2D 阵列 - DS.
- 如何将1D阵列访问为2D阵列
- 分配/访问2d阵列,使得2d子块是连续的
- 重新分配2D阵列并删除旧阵列
- 不使用新的动态2D阵列
- 我正在为2D阵列参数而挣扎
- 特征和巨大的密集 2D 阵列
- 全球字符阵列(2D)
- 如何将内存映像分配给DLIB阵列2d或映像