#pragma acc host_data use_device 问题

Issue with #pragma acc host_data use_device

我想要 GPU 上的 MPI 函数 MPI_Sendrecv() 到 运行。通常我使用类似的东西:

  #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_Sendrecv() 。如果我尝试加速此循环(使用 #pragma acc parallel loop)或什至加速循环和 MPI 调用所在的整个例程 (#pragma acc routine),我会收到错误消息:

64,加速器限制:循环包含不受支持的语句类型
78、加速器限制:不支持的语句类型:opcode=ACCHOSTDATA

如果调用在加速区域中,我如何 运行 在设备上进行调用?
另一种方法可能是不加速例程和循环,单独使用 #pragma acc host_data use_device(send_buf, recv_buf),但将所有内容都放在 gpu 上的目标将会失败。

编辑

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

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

此外,“host_data”表示要在 host 代码中使用设备指针,因此不能在设备代码中使用。设备代码中默认使用设备指针,因此不需要“host_data”结构。

编辑后的问题:

Do you have and idea why MPI_Sendrecv is slowing down the app?

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

"ranges on this row have been projected from the CPU on the GPU". What does this mean?

我以前没见过这个,但假设这只是意味着即使这些是主机调用,NVTX 仪器也能够将它们投射到 GPU 时间线上。 CUDA Aware MPI 设备到设备的数据传输很可能与 MPI 区域相关。