вывод неправильный, когда я использую 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 4int 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);
}

0

Решение

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]