MPI 在您使用 MPI_STATUS 接收消息时找出发件人
MPI figuring out the sender when you recieve message using MPI_STATUS
所以我正在尝试用 MPI 玩烫手山芋,但我在使用 MPI_STATUS 时遇到了问题。这是我的代码
MPI_Status status;
if(rank == 0) {
printf("Sending %d from %d to %d\n", variable, rank, sender);
sleep(3);
MPI_Send(&variable, 1, MPI_INT, sender, 0, MPI_COMM_WORLD);
}
do{
srand(time(NULL));
MPI_Recv(&variable, 1, MPI_INT, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &status);
sender = status.MPI_SOURCE;
printf("sender is %s\n", status.MPI_SOURCE);
printf("Recieved %d from %d at %d\n", variable, sender, rank);
sleep(3);
do{
receiver = rand() % world_size;
printf("reveiver is %d\n", receiver);
} while (receiver != sender);// confirms its not sending it back to the original sender and assuming world_size is greater than 2
printf("Sending %d from %d to %d\n", variable, rank, sender);
sleep(3);
MPI_Send(&variable, 1, MPI_INT, receiver, 0, MPI_COMM_WORLD);
}while (1 == 1);
但是当我 运行 它时,我得到的是下面。我不确定出了什么问题。
mpirun -np 4 a.out
Sending 10 from 0 to 3
sender is (null)
Recieved 10 from 0 at 3
reveiver is 1
reveiver is 2
reveiver is 2
reveiver is 3
reveiver is 0
Sending 10 from 3 to 0
[cs2:15514] *** Process received signal ***
[cs2:15514] Signal: Segmentation fault (11)
[cs2:15514] Signal code: Address not mapped (1)
[cs2:15514] Failing at address: 0x3
根据MPI_Status structure - Message Passing Interface | Microsoft Docs
结构 MPI_Status
的 MPI_SOURCE
成员的类型是 int
。
另一方面,您使用 %s
打印行中的值
printf("sender is %s\n", status.MPI_SOURCE);
这会调用未定义的行为。 %s
需要类型为 char*
的数据。
您应该使用 %d
而不是打印值。
所以我正在尝试用 MPI 玩烫手山芋,但我在使用 MPI_STATUS 时遇到了问题。这是我的代码
MPI_Status status;
if(rank == 0) {
printf("Sending %d from %d to %d\n", variable, rank, sender);
sleep(3);
MPI_Send(&variable, 1, MPI_INT, sender, 0, MPI_COMM_WORLD);
}
do{
srand(time(NULL));
MPI_Recv(&variable, 1, MPI_INT, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &status);
sender = status.MPI_SOURCE;
printf("sender is %s\n", status.MPI_SOURCE);
printf("Recieved %d from %d at %d\n", variable, sender, rank);
sleep(3);
do{
receiver = rand() % world_size;
printf("reveiver is %d\n", receiver);
} while (receiver != sender);// confirms its not sending it back to the original sender and assuming world_size is greater than 2
printf("Sending %d from %d to %d\n", variable, rank, sender);
sleep(3);
MPI_Send(&variable, 1, MPI_INT, receiver, 0, MPI_COMM_WORLD);
}while (1 == 1);
但是当我 运行 它时,我得到的是下面。我不确定出了什么问题。
mpirun -np 4 a.out
Sending 10 from 0 to 3
sender is (null)
Recieved 10 from 0 at 3
reveiver is 1
reveiver is 2
reveiver is 2
reveiver is 3
reveiver is 0
Sending 10 from 3 to 0
[cs2:15514] *** Process received signal ***
[cs2:15514] Signal: Segmentation fault (11)
[cs2:15514] Signal code: Address not mapped (1)
[cs2:15514] Failing at address: 0x3
根据MPI_Status structure - Message Passing Interface | Microsoft Docs
结构 MPI_Status
的 MPI_SOURCE
成员的类型是 int
。
另一方面,您使用 %s
打印行中的值
printf("sender is %s\n", status.MPI_SOURCE);
这会调用未定义的行为。 %s
需要类型为 char*
的数据。
您应该使用 %d
而不是打印值。