Mpi “pragma acc主机数据使用”设备出现问题

Mpi “pragma acc主机数据使用”设备出现问题,mpi,openacc,Mpi,Openacc,我希望MPI函数MPI\u Sendrecv()在GPU上运行。通常情况下,我会使用以下内容: #pragma acc host_data use_device(send_buf, recv_buf) { MPI_Sendrecv (send_buf, N, MPI_DOUBLE, proc[0], 0, recv_buf, N, MPI_DOUBLE, proc[0], 0, MPI_COMM_WORLD, MPI_S

我希望MPI函数
MPI\u Sendrecv()
在GPU上运行。通常情况下,我会使用以下内容:

  #pragma acc host_data use_device(send_buf, recv_buf)
  {
  MPI_Sendrecv (send_buf, N, MPI_DOUBLE, proc[0], 0,
                recv_buf, N, MPI_DOUBLE, proc[0], 0,
                MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  }
而且效果很好。但是现在,我在循环中调用
MPI\u Sendrecv()
。如果我试图加速这个循环(使用
#pragma acc parallel loop
)或者甚至加速循环和MPI调用所在的整个例程(
#pragma acc routine
),我会得到一个错误:

64,加速器限制:循环包含不支持的语句类型
78,加速器限制:不支持的语句类型:操作码=ACCHOSTDATA

如果呼叫处于加速区域(如本例中),如何在设备上运行呼叫?
另一种选择可能是不加速例程和循环,单独使用
#pragma acc host_data use_设备(send_buf,recv_buf)
,但在gpu上实现所有功能的目标将失败

编辑

我删除了#pragma。无论如何,应用程序运行速度要慢几百倍,我不知道为什么。
我使用nsight sys来检查:你知道为什么MPI_Sendrecv会减慢应用程序的速度吗?现在所有调用它的例程都在主机上运行。如果我在NVTX(MPI)部分移动鼠标指针,它会打印“这一行上的范围已从GPU上的CPU投影”。这是什么意思?
抱歉,如果这不清楚,但我缺乏nsight的实用性,我不知道如何正确分析结果。如果您需要更多详细信息,我很乐意提供给您。

然而,在我看来,MPI调用出现在GPU部分似乎很奇怪。

您不能在设备代码中进行MPI调用

此外,“主机数据”表示在主机代码中使用设备指针,因此不能在设备代码中使用。默认情况下,设备代码中使用设备指针,因此不需要“主机数据”构造

编辑后的问题:

你知道为什么MPI_Sendrecv会减慢应用程序的速度吗

对不起,不知道。我不知道你在拿什么做比较,也不知道你的应用有什么让我很难说的。尽管Sendrecv是一个阻塞调用,因此在循环中插入将导致所有发送和接收在继续之前等待前面的发送和接收。您是否能够重写代码以改用ISend和IRecv

“此行上的范围是从GPU上的CPU投影的”。什么 这意味着什么


我以前没有见过这种情况,但假设这只是意味着即使这些是主机调用,NVTX检测也能够将它们投射到GPU时间线上。最有可能的情况是,CUDA感知的MPI设备到设备数据传输将与MPI区域关联。

谢谢Mat,一如既往。我编辑了这个问题,因为在删除主机数据结构时遇到了一些问题。谢谢。关于最后一点,,当代码在主机上运行时,以及MPI调用中的缓冲区属于主机时,为什么要谈论设备到设备的数据传输?数据传输更有可能通过同一节点上设备的GPUDirect对等通信或节点之间的GPUDirect RDMA直接从一个设备传输到另一个设备。我认为为了将GPU缓冲区传递给MPI,需要调用pragma“#pragma acc host_data use_device”。您的意思是,在我的情况下,即使我没有添加任何pragma来处理MPI调用,我也可能有GPUDirect对等通信?那么什么时候有用“#pragma acc host_data use_device”呢?我已经在很多关于CUDA感知MPI的示例中看到了它的使用。