【发布时间】:2017-05-18 06:35:00
【问题描述】:
我正在处理块对角矩阵(每个块的大小相同),当我使用 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** 作为参数的函数,所以我更愿意坚持使用动态二维数组...
我已经阅读了规范中的 private 子句,但它并没有说不支持动态二维数组,所以我想我做错了什么......
【问题讨论】:
-
A的尺寸是多少? -
@tobi303
A是一个N*NBxN*NB矩阵。抱歉A是 块对角线,我刚刚编辑了它。每个块是一个NxN矩阵,A由NB块组成。
标签: c++ multidimensional-array openacc