【发布时间】:2021-03-18 21:51:06
【问题描述】:
我需要将向量指针的向量元素传递给#pragma acc host_data use_device():
static double *send_bufL[3];
static double *recv_bufL[3];
send_bufL[IDIR] = ARRAY_1D(NVAR*grid->nghost[IDIR]*nx2*nx3, double);
recv_bufL[IDIR] = ARRAY_1D(NVAR*grid->nghost[IDIR]*nx2*nx3, double);
#pragma acc enter data copyin(send_bufL[IDIR:1][:NVAR*grid->nghost[IDIR]*nx2*nx3], \
recv_bufL[IDIR:1][:NVAR*grid->nghost[IDIR]*nx2*nx3])
#pragma acc parallel loop collapse(4) present(d, grid, send_bufL[1:1][:NVAR*grid->nghost[JDIR]*nx1*nx3])
for (nv = 0; nv < NVAR; nv++){
for (k = kbeg; k <= kend; k++){
for (i = ibeg; i <= iend; i++){
for (j = 0; j < grid->nghost[JDIR]; j++){
index = nv*nx3*nx1*grid->nghost[JDIR]+(k-kbeg)*nx1*grid->nghost[JDIR]+(i-ibeg)*grid->nghost[JDIR]+j;
send_bufL[JDIR][index] = d->Vc[nv][k][jbeg+j][i];
}}}}
count = NVAR*nx3*nx2*nghost;
#pragma acc host_data use_device(send_bufL, recv_bufL)
{
MPI_Isend (send_bufL[IDIR], count, MPI_DOUBLE, nrnks[IDIR][0], 0, MPI_COMM_WORLD, &req[0]);
MPI_Irecv (recv_bufL[IDIR], count, MPI_DOUBLE, nrnks[IDIR][0], 0, MPI_COMM_WORLD, &req[1]);
}
这样写,只有我得到send_bufL, recv_bufL:
[marco-Inspiron-7501:41130:0:41130] 捕获信号 11(分段错误:地址 0x7f7f4fafa608 处映射对象的权限无效)
[marco-Inspiron-7501:41131:0:41131] 捕获信号 11(分段错误:地址 0x7fd697afa608 处映射对象的权限无效)*
尝试添加维度时出现编译错误。我能做什么?
我必须添加显然,对于指针向量的某些元素,不需要使用#pragma acc host_data use_device()。编译器似乎能够正确使用设备缓冲区。无论如何,对于其他元素,这不起作用,它使用主机缓冲区,产生错误的结果。
【问题讨论】: