#pragma acc host_data use_device 的问题

Posted

技术标签:

【中文标题】#pragma acc host_data use_device 的问题【英文标题】:Issue with #pragma acc host_data use_device 【发布时间】:2021-02-16 04:49:57 【问题描述】:

我希望 MPI 函数 MPI_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_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 会减慢应用程序的速度吗?现在调用它的所有例程都在主机上运行。如果我在 NVTX (MPI) 部分移动鼠标指针,它会打印“此行上的范围已从 CPU 投影到 GPU 上”。这是什么意思? 抱歉,如果不清楚,但我缺乏 nsight 的实用性,我不知道如何正确分析结果。如果您需要更多详细信息,我很乐意为您提供。 然而,我觉得 MPI 调用出现在 GPU 部分很奇怪。

【问题讨论】:

【参考方案1】:

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

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

编辑后的问题:

你知道为什么 MPI_Sendrecv 会降低应用程序的速度吗?

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

“这一行的范围是从 GPU 上的 CPU 投影的”。什么 这是什么意思?

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

【讨论】:

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

以上是关于#pragma acc host_data use_device 的问题的主要内容,如果未能解决你的问题,请参考以下文章

android 定位

MISRA C:2012 Dir-1.1(只记录常犯的错误和常用的规则)Bit-fields inlineC99,NOT support in C90 #pragma

#pragma 标记的意义​​是啥?为啥我们需要#pragma 标记?

#pragma 警告(push) 没有 #pragma 警告(pop)

#pragma使用分析

#pragma pack(push) 和#pragma pack(pop) 以及#pragma pack()