首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenMPI v/s Mvapich2:没有MPI_Recv的MPI_Send

OpenMPI v/s Mvapich2:没有MPI_Recv的MPI_Send
EN

Stack Overflow用户
提问于 2013-08-30 02:05:15
回答 3查看 998关注 0票数 0

我正在尝试测试没有MPI_SendMPI_Recv的效果。我有以下程序,我使用openmpi-1.4.5和mspevich2-1.9编译和运行该程序。我知道这些实现适用于两个不同版本的MPI标准,但我认为MPI_SendMPI_Recv在这些标准之间是相同的:

代码语言:javascript
复制
#include <mpi.h>
#include <iostream>
#include <assert.h>

using namespace std;

MPI_Comm ping_world;
int mpi_size, mpi_rank;

void* ping(void* args)
{
    int ctr = 0;
    while(1)
    {
            char buff[6] = "PING";
            ++ctr;
            for(int i=0; i<mpi_size; ++i)
            {
                    cout << "[" << ctr << "] Rank " << mpi_rank << " sending " << buff << " to rank " << i << endl;
                    MPI_Send(buff, 6, MPI_CHAR, i, 0, ping_world);
            }
    }
}

int main(int argc, char *argv[])
{
int provided;
MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided);
assert(provided == MPI_THREAD_MULTIPLE);

MPI_Comm_rank (MPI_COMM_WORLD, &mpi_rank);
MPI_Comm_size (MPI_COMM_WORLD, &mpi_size);

    {
            MPI_Group orig_group;
            MPI_Comm_group(MPI_COMM_WORLD, &orig_group);
            int ranks[mpi_size];
            for(int i=0; i<mpi_size; ++i)
                    ranks[i] = i;

            MPI_Group new_group;
            MPI_Group_incl(orig_group, mpi_size, ranks, &new_group);
            MPI_Comm_create(MPI_COMM_WORLD, new_group, &ping_world);
    }

pthread_t th_ping;
pthread_create(&th_ping, NULL, ping, (void *) NULL);

pthread_join(th_ping, NULL);

return 0;
}

使用mvapich2,我总是得到以下输出(仅此而已)。基本上,程序似乎在这三行之后挂了起来:

代码语言:javascript
复制
[1] Rank 0 sending PING to rank 0
[1] Rank 1 sending PING to rank 0
[1] Rank 1 sending PING to rank 1

使用openmpi,我得到以下输出(无尾):

代码语言:javascript
复制
[1] Rank 1 sending PING to rank 0
[1] Rank 1 sending PING to rank 1
[1] Rank 0 sending PING to rank 0
[1] Rank 0 sending PING to rank 1
[2] Rank 0 sending PING to rank 0
[2] Rank 0 sending PING to rank 1
[3] Rank 0 sending PING to rank 0
[3] Rank 0 sending PING to rank 1
[4] Rank 0 sending PING to rank 0
[4] Rank 0 sending PING to rank 1
[5] Rank 0 sending PING to rank 0
[2] Rank 1 sending PING to rank 0
[2] Rank 1 sending PING to rank 1
[3] Rank 1 sending PING to rank 0
[3] Rank 1 sending PING to rank 1
[4] Rank 1 sending PING to rank 0
[4] Rank 1 sending PING to rank 1
[5] Rank 1 sending PING to rank 0
[5] Rank 1 sending PING to rank 1
[6] Rank 1 sending PING to rank 0

问题:

  1. 为何会有这样的分别呢?
  2. 如何使用mvapich2实现类似openmpi (无终止)的行为?
EN

回答 3

Stack Overflow用户

发布于 2013-09-01 04:42:25

当调用程序可以安全地重用缓冲区时,MPI_Send可以返回。没有其他保证,但是有许多不同的依赖于实现的行为。不同的实现可以以不同的方式处理消息的缓冲。急切协议还允许将一些短消息(Er)传输到接收级别,而不需要发布匹配的MPI_Recv。

如果需要MPI强制执行在阻塞发送返回之前接收的消息,请查看MPI_Ssend。

票数 1
EN

Stack Overflow用户

发布于 2013-08-30 14:50:27

发送数据而不接收数据是不正确的MPI程序。你所看到的问题是你发送的邮件与任何收件都不匹配。根据实现的不同,MPI_SEND可能会阻塞,直到在另一端实际收到消息为止。事实上,我所知道的所有实现都会对足够大的消息执行此操作(尽管您的6个字节的消息可能在任何地方都没有达到这个阈值)。

如果您想发送消息而不阻塞,则需要使用MPI_ISEND。但是,即使是这样,您也需要最终调用MPI_TESTMPI_WAIT,以确保数据是实际发送的,而不仅仅是本地缓冲。

我不知道为什么MVAPICH2挂起而Open没有挂起,但最终它并不重要。你需要修改你的程序,或者你只是在测试那些根本不应该被使用的测试用例。

票数 0
EN

Stack Overflow用户

发布于 2013-09-03 23:40:10

在MVAPICH2(和MPICH)实现中,自阻塞发送被阻塞(而不是缓冲),直到找到相应的MPI_Recv。这就是为什么它没有挂在“等级1发送PING到0”,这只是一个实现的选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18523799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档