MPI + OpenACC:#pragma acc host_data use_device如何工作?

问题描述

  #pragma acc parallel loop present(phi[:ny_tot][:nx_tot],send_buf[:NX_GLOB+2*NGHOST],recv_buf[NX_GLOB+2*NGHOST]) 
  for (i = ibeg; i <= iend; i++) send_buf[i] = phi[j][i];

  #pragma acc host_data use_device(send_buf,recv_buf)
  {
    MPI_Sendrecv (send_buf,iend+1,MPI_DOUBLE,procR[1],recv_buf,MPI_COMM_WORLD,MPI_STATUS_IGnorE);
  }

  #pragma acc parallel loop present(phi[:ny_tot][:nx_tot],recv_buf[NX_GLOB+2*NGHOST])
  for (i = ibeg; i <= iend; i++) phi[j+1][i] = recv_buf[i];

我需要这部分代码在GPU上运行,并且我也希望MPI消息仅涉及设备。为此,我看到#pragma acc host_data use_device()应该是完美的,但是编译器似乎看不到它(-Minfo = accel),并且在运行该应用程序时出现错误

您的应用程序之一的终止终止
PID 36444在Inspiron-7501上运行
出口码:139
清理剩余过程
您可以忽略下面的清理消息
您的应用程序以退出字符串终止:分段错误(信号11)

将其删除效果很好,但是很慢:

  #pragma acc parallel loop present(phi[:ny_tot][:nx_tot],recv_buf[NX_GLOB+2*NGHOST]) 
  for (i = ibeg; i <= iend; i++) send_buf[i] = phi[j][i];

  #pragma acc update self(send_buf[:NX_GLOB+2*NGHOST])
  MPI_Sendrecv (send_buf,MPI_STATUS_IGnorE);
  #pragma acc update device(recv_buf[NX_GLOB+2*NGHOST])

  #pragma acc parallel loop present(phi[:ny_tot][:nx_tot],recv_buf[NX_GLOB+2*NGHOST])
  for (i = ibeg; i <= iend; i++) phi[j+1][i] = recv_buf[i];



  

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)