【问题标题】:OpenACC - Private 2D arrayOpenACC - 私有二维数组
【发布时间】: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矩阵,ANB块组成。

标签: c++ multidimensional-array openacc


【解决方案1】:

抱歉,不支持在私有子句中使用指针数组。问题是编译器运行时必须为每个 gang、worker 或 vector 动态创建一个 private(取决于带有 private 子句的循环)并填写所有设备指针。这将带来极高的间接费用。

如果“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;

【讨论】:

    猜你喜欢
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 2020-07-24
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多