gpt4 book ai didi

c++ - OpenMPI 与 Mvapich2 : MPI_Send without MPI_Recv

转载 作者:行者123 更新时间:2023-11-28 07:27:20 26 4
gpt4 key购买 nike

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

#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,我总是得到以下输出(仅此而已)。基本上,程序似乎在 3 行之后挂了:

[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,我得到以下输出(无休止):

[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(无休止)的行为?

最佳答案

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

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

关于c++ - OpenMPI 与 Mvapich2 : MPI_Send without MPI_Recv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18523799/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com