微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

#pragma acc host_data use_device出现问题

如何解决#pragma acc host_data use_device出现问题

我希望MPI函数MPI_Sendrecv()在GPU上运行。通常我使用类似的东西:

  #pragma acc host_data use_device(send_buf,recv_buf)
  {
  MPI_Sendrecv (send_buf,N,MPI_DOUBLE,proc[0],recv_buf,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进行检查:

here's the pic

您是否知道为什么MPI_Sendrecv会使应用程序变慢?现在,所有被调用的例程都在主机上运行。如果将鼠标指针移至NVTX(MPI)部分,它将打印“此行的范围已从GPU上的cpu投影”。这是什么意思?
抱歉,如果不清楚,但是我在nsight上缺乏实用性,并且我不知道如何正确分析结果。如果您需要更多详细信息,我们很乐意为您提供这些信息。
但是,对我来说,MPI调用出现在GPU部分中似乎很奇怪。

解决方法

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

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

修改后的问题:

您是否知道为什么MPI_Sendrecv会降低应用速度?

对不起,不知道。我不知道您要与之进行比较,也不了解您的应用程序,因此我很难说出来。尽管Sendrecv是一个阻塞调用,所以置于循环中将导致所有发送和接收在继续之前等待先前的发送和接收。您能够重写代码以改为使用ISend和IRecv吗?

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。