如何解决MPI_Test 未进行 MPI_Isend/MPI_Irecv 请求
我正在运行具有 200,000 个顶点网格的 CFD 模拟。我已经将网格分解为 2 个负载平衡的子域来测试我的并行实现。在我进行时间分析的特定函数中,每个子域都必须为位于并行通信边界上的 ~2000 个顶点中的每个顶点发送 MPI_DOUBLE
的 3D 梯度向量。对顶点列表进行排序,使得所有参与并行通信的顶点都位于列表的开头(ivetParaCommStart 是列表中索引最大的并行顶点)。以下是我的代码的简化版本:
MPI_Request sendRequ; // Local variable in each thread
MPI_Request recvRequ; // Local variable in each thread
for(ivert,mvert)
{
// Perform costly calculations for each vertex.....
if(ivert == ivertCommStart)
{
// Load data from ALL parallel vertices and communicate with other thread.
MPI_Isend(...,...,MPI_DOUBLE,(ithread == 0 ? 1 : 0),&sendRequ);
MPI_Irecv(...,&recvRequ);
}
else if(ivert > ivertCommStart)
{
MPI_Test(&sendRequ,...);
MPI_Test(&recvRequ,...);
}
}
bool isallComm = false;
while(!isallComm)
{
isallComm = true;
isallComm = isallComm ? MPI_Test(&sendRequ,...) : false;
isallComm = isallComm ? MPI_Test(&recvRequ,...) : false;
}
考虑到每个子域中并行通信顶点的总数约为 4000 个(顶点总数的 4%),并考虑到为每个顶点执行的计算成本,我原以为数据转移将被对剩余的非平行顶点执行的计算完全掩盖。然而,这种情况并非如此。请注意,在 MPI_Wait
调用最终返回后,我已确认交换的数据符合我的预期(并行模拟产生与串行模拟等效的结果)。但是,MPI_Wait()
调用的成本导致我的代码扩展性非常差。谁能告诉我为什么 MPI_Test()
没有处理我的发送和接收请求?
编辑:对于造成的任何混淆,我深表歉意 - 我应该澄清一下,我一次性传达了所有平行顶点的数据。
EDIT 2:我发现 MPI_Test
调用不允许我重叠通信和计算。他们有很大的开销。实际上,for
循环 + MPI_Wait
调用的总时间与我等到 for
循环结束,然后使用阻塞发送/接收调用传输并行数据相同(下面的代码与上面的代码运行所需的时间相同)。所以我看不到非阻塞通信的好处。我对 MPI
比较陌生。如果您对这里可能发生的事情有任何建议,我将不胜感激。
for(ivert,mvert)
{
// Perform costly calculations for each vertex.....
}
// Load data from ALL parallel vertices and communicate with other thread.
MPI_Request sendRequ;
MPI_Request recvRequ;
MPI_Isend(...,&sendRequ);
MPI_Irecv(...,&recvRequ);
bool isallComm = false;
while(!isallComm)
{
isallComm = true;
isallComm = isallComm ? MPI_Test(&sendRequ,...) : false;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。