вывод неверен, когда я использую OpenACC

Я собираюсь оптимизировать этот код с помощью openacc, но выходные вычисления нулевые. Я был бы признателен за возможность помочь мне таким образом и использовать ваши рекомендации для достижения успеха и решения моей проблемы.

С нетерпением, я с нетерпением жду, чтобы услышать вас в ближайшее время. Король с уважением,

Саджад Мохаммади

  #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);
}

person sajad    schedule 20.03.2018    source источник
comment
Вы знаете, что индексы массива отсчитываются от нуля? Итак, если вы объявите массив, например. 3 элементов (например, NX-1), затем начните индексировать 1, тогда ваши массивы фактически будут иметь только два элемента с индексами 1 и 2. Это довольно много (в процентах) потраченного впустую места в вашем случае.   -  person Some programmer dude    schedule 20.03.2018


Ответы (1)


Есть две проблемы с вашими директивами OpenACC.

Во-первых, поскольку «A» находится в предложении «copyout», он не инициализируется на устройстве. Но вы используете «A» с обеих сторон уравнения, поэтому вместо этого нужно поместить «A» в директиву «copy».

Во-вторых, ваша область данных охватывает цикл «p», поэтому не копируется обратно до конца цикла. Однако вы печатаете «A» для каждой итерации «p». Следовательно, вы не печатаете обновленное значение с устройства. Чтобы исправить это, добавьте «#pragma acc update self(A)» перед печатью значения.

person Mat Colgrove    schedule 20.03.2018
comment
Спасибо за вашу помощь. - person sajad; 21.03.2018