当我使用 OpenACC 时输出错误
output is wrong when i use 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);
}
您的 OpenACC 指令有两个问题。
首先,由于 "A" 在 "copyout" 子句中,因此未在设备上初始化。但是您在等式的两边都使用 "A",因此需要将 "A" 放在 "copy" 指令中。
其次,您的数据区域跨越 "p" 循环,因此直到循环结束后才被复制回来。但是,您要为 "p" 的每次迭代打印 "A"。因此,您不会从设备打印更新的值。要修复,请在打印值之前添加“#pragma acc update self(A)”。
我打算通过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);
}
您的 OpenACC 指令有两个问题。
首先,由于 "A" 在 "copyout" 子句中,因此未在设备上初始化。但是您在等式的两边都使用 "A",因此需要将 "A" 放在 "copy" 指令中。
其次,您的数据区域跨越 "p" 循环,因此直到循环结束后才被复制回来。但是,您要为 "p" 的每次迭代打印 "A"。因此,您不会从设备打印更新的值。要修复,请在打印值之前添加“#pragma acc update self(A)”。