【问题标题】:#pragma acc host_data use_device() with complex variables#pragma acc host_data use_device() 与复杂变量
【发布时间】: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()。编译器似乎能够正确使用设备缓冲区。无论如何,对于其他元素,这不起作用,它使用主机缓冲区,产生错误的结果。

【问题讨论】:

    标签: cuda openacc


    【解决方案1】:

    问题在于“send_bufL[IDIR]”和“recv_bufL[IDIR]”。由于这些是设备指针,因此在主机上取消引用它们会导致段错误。

    我认为这里最好的解决方案是使用临时指针指向缓冲区中的正确元素。比如:

    double * sbtmp;
    double * rbtmp;
    ...
    sbtmp = send_bufL[IDIR];
    rbtmp = recv_bufL[IDIR];
    
    #pragma acc host_data use_device(sbtmp, rbtmp)
    {
    MPI_Isend (sbtmp, count, MPI_DOUBLE, nrnks[IDIR][0], 0, MPI_COMM_WORLD, &req[0]);
    MPI_Irecv (rbtmp, count, MPI_DOUBLE, nrnks[IDIR][0], 0, MPI_COMM_WORLD, &req[1]);
    }
    

    如果这不起作用,请发布一个小的复制示例,我会看看我们是否能找到解决方案。

    【讨论】:

      猜你喜欢
      • 2021-02-16
      • 2018-05-07
      • 2020-05-14
      • 2020-12-18
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      相关资源
      最近更新 更多