【发布时间】: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 部分很奇怪。
【问题讨论】: