gpt4 book ai didi

c++ - MPI 中使用 MPI_Comm_spawn 生成进程的奇怪输出

转载 作者:行者123 更新时间:2023-11-28 03:35:50 67 4
gpt4 key购买 nike

Amaey 帮我解决了这个问题。

我试图了解用于生成进程的 MPI_Comm_spawn 函数,因为我正在努力将项目从 PVM 迁移到 MPI .我找到了一个很好的示例程序 here .所以我决定稍微改变一下让父进程向两个子进程发送消息,然后让子进程输出消息。问题是 rank 0 的子进程没有正确接收消息,它只接收了一部分消息,而 rank 1 的子进程接收消息并正常输出。有人可以解释为什么会这样,我做错了什么或者我该如何解决这个问题。非常感谢那些可以提供帮助的人!

#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

#define NUM_SPAWNS 2
// Based on the example from: http://mpi.deino.net/mpi_functions/MPI_Comm_spawn.html
int main( int argc, char *argv[] )
{
int my_rank;
int size;
int np = NUM_SPAWNS;
int errcodes[NUM_SPAWNS];
MPI_Comm parentcomm, intercomm;
char greeting[100];
char greeting2[100];
char greeting3[100];
MPI_Init( &argc, &argv );
MPI_Status stat;
MPI_Comm_get_parent( &parentcomm );
if (parentcomm == MPI_COMM_NULL)
{
/* Create 2 more processes - this example must be called spawn_example.exe for this to work. */
MPI_Comm_spawn( "spawn_example", MPI_ARGV_NULL, np, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &intercomm, errcodes );
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
// Called this Jreeting because process 0 in the new MPI_COMM_WORLD was only receiving a part of this string.
sprintf(greeting2, "Jreeting from master1 %d of %d\n", my_rank, size);
sprintf(greeting3, "Greeting from master2 %d of %d\n", my_rank, size);
for(int i = 0; i<np;i++)
{
if(i == 0)
{
MPI_Send(greeting2, strlen(greeting)+1, MPI_BYTE, i,1,intercomm);
}
if(i == 1)
{
MPI_Send(greeting3, strlen(greeting)+1, MPI_BYTE, i,1,intercomm);
}
MPI_Recv(greeting, sizeof(greeting), MPI_BYTE, i, 1, intercomm, &stat);
fputs (greeting, stdout);
}
}
else
{
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if(my_rank == 0)
{
MPI_Recv(greeting2, sizeof(greeting2), MPI_BYTE, 0, 1, parentcomm, &stat);
std::cout << greeting2 << "\n";
}
if(my_rank == 1)
{
MPI_Recv(greeting3, sizeof(greeting3), MPI_BYTE, 0, 1, parentcomm, &stat);
std::cout << greeting3 << "\n";
}
sprintf(greeting, "Hello world: processor %d of %d\n", my_rank, size);
MPI_Send(greeting, strlen(greeting)+1, MPI_BYTE, 0,1,parentcomm);
}
fflush(stdout);
MPI_Finalize();
return 0;
}

当我编译时我有警告...:

hrognkelsi:MPI_TUTORIAL gumundureinarsson$ mpic++ spawn_example.cc -o spawn_example
spawn_example.cc: In function ‘int main(int, char**)’:
spawn_example.cc:24: warning: deprecated conversion from string constant to ‘char*’

当我运行时:

hrognkelsi:MPI_TUTORIAL gumundureinarsson$ mpirun spawn_example
Jre
Hello world: processor 0 of 2
Greeting from master2 0 of 1
Hello world: processor 1 of 2

如您所见,子进程只输出Jre,而不是预期的Jreeting from master1 0 of 1。这是怎么回事?为什么它对其他子进程有效?

最佳答案

看行:MPI_Send(greeting2, strlen(greeting)+1, MPI_BYTE, i,1,intercomm);

所以除非我忽略了一些东西不是'strlen(greeting)' 简单的 0。你肯定在发送缓冲区中放置了比 1 个元素更多的东西。我想你想把 'strlen(greeting2)' 放在那里。

我认为正在发生的事情是父进程发送了一个截断的字符串并从进程 0 获得了一个回复,该回复填充了“问候语”。因此在第二个 MPI_Send 'sizeof(greeting)' 是非零的,因此你可以发送整个消息。

关于c++ - MPI 中使用 MPI_Comm_spawn 生成进程的奇怪输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10899369/

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