使用OpenACC时输出错误

时间:2018-03-20 06:51:08

标签: c++ cuda gpu openacc pgi

我将通过openacc优化此代码,但输出计算为零。我很高兴有机会以这种方式帮助我,并用你的指导来取得成功并解决我的问题。

我不耐烦地期待很快听到你的声音。 金问候,

Sajjad Mohammadi

  #include <stdio.h>
  #include <math.h>
  #include <stdlib.h>
  #include <assert.h>
  #include <openacc.h>
  #include<time.h>
  #include <string.h>
  #include <malloc.h>
 // #include <cuda_runtime_api.h>

  #define NX 4
  #define NY 4
  #define NZ 4


  int main(void)
  {
  int i, j,p, k;

  static double A[NX-1][NY-1][NZ-1]={10.} ,B[NX-1][NY-1][NZ-1]={10.},C[NX-1][NY-1][NZ-1]={10.};
  FILE *file;
  file = fopen("B-and-A.csv", "w");


    #pragma acc data copyin(B,C),copyout(A)
    {
for (p = 0; p <=2; p++) {
#pragma acc kernels  loop private(i,j,k)
 for ( i = 1; i < NX - 1; i++ ) {

        for ( j = 0; j < NY - 1; j++ ) {
            for ( k = 0; k < NZ - 1; k++ ) {
        A[i][j][k] = A[i][j][k]+2.
         + 1.*( B[i][j+1][k] + C[i][j][k] )
         + 1.*( C[i][j][k+1] + B[i][j][k] );
}
}
}

fprintf(file,"%e\n",A[2][2][2]);
}
}
  fclose(file);
}

1 个答案:

答案 0 :(得分:1)

您的OpenACC指令存在两个问题。

首先,由于“A”在“copyout”子句中,因此它未在设备上初始化。但是你在等式的两边都使用“A”,所以需要将“A”放在“复制”指令中。

其次,您的数据区域跨越“p”循环,因此直到循环结束后才会复制回来。但是,您为“p”的每次迭代打印“A”。因此,您不是从设备打印更新的值。要修复,请在打印值之前添加“#pragma acc update self(A)”。