我试图将 openacc 与指向包含动态分配成员的结构的指针结合起来。下面的代码失败了
线程失败:1 调用 cuStreamSynchronize 返回错误 700:内核执行期间地址非法
使用 nvc 编译时(“x86-64 Linux -tp haswell 上的 nvc 20.9-0 LLVM 64 位目标”)。据我所知,我正在遵循例如 OpenACC“入门”指南中建议的方法。但不知何故,指针可能不会粘在设备上(?)。有谁知道这里出了什么问题?
#include <stdlib.h>
#include <stdio.h>
typedef struct grid
{
int N;
double *X;
} grid;
void allocate(grid* g, int N)
{
g->N = N;
g->X = (double*) malloc(sizeof(double) * g->N);
#pragma acc enter data create(g[0:1])
#pragma acc enter data create(g->X[0:N])
}
void release(grid* g)
{
#pragma acc exit data delete(g->X[0:g->N])
#pragma acc exit data delete(g[0:1])
free(g->X);
}
void fill(grid * g)
{
int i;
#pragma acc parallel loop
for (i = 0; i < g->N; i++)
{
g->X[i] = 42; // the cuprit, commenting this removes the error too
}
}
int main()
{
grid g;
allocate(&g, 10);
fill(&g);
release(&g);
return 0;
}```