gpt4 book ai didi

mpi - 如何识别 MPI 进程是否属于给定的 Communicator

转载 作者:行者123 更新时间:2023-12-04 03:43:44 26 4
gpt4 key购买 nike

我已经使用结构 MPI_Comm_split() 创建了一个通信器,然后我想在 MPI_Comm_World 级别和新通信器上尝试一些发送/接收通信等级。创建了两个通信器(一个具有偶数进程等级,另一个具有奇数等级)。

注意:我只需要在包含 even-process-ranks 的新通信器中尝试通信(虽然进程的等级不是原来的,但我仍然关心那些进程是什么在他们的内存空间中)

我的代码如下,

    #include<stdio.h>
#include "mpi.h"
int main(int arg, char **argv){
int rank,newrank,newrank2;
int size, newSize,newSize2;
int data;
int recv;
MPI_Comm newComm, newComm2;
MPI_Status status, newStatus;
MPI_Init(&arg,&argv);

MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
//sample data
data = rank * 100 + 1;

printf("my rank in the WORLD is: %d\n", rank);
fflush(stdout);

if(rank%2==0){
MPI_Comm_split(MPI_COMM_WORLD,0,rank,&newComm);
MPI_Comm_rank(newComm,&newrank);
MPI_Comm_size(newComm,&newSize);
printf("my rank in the newComm1 is : %d\n", newrank);
}else{
MPI_Comm_split(MPI_COMM_WORLD,1,rank,&newComm2);
MPI_Comm_rank(newComm2,&newrank2);
MPI_Comm_size(newComm2,&newSize2);
printf("my rank in the newComm2 is : %d\n", newrank2);
}

//Now try some communication at the newCommunicator and at the WORLD level
if(rank == 0){
//sending to process 1 wrt WOLD_Comm
MPI_Send(&data,1,MPI_INT,1,99,MPI_COMM_WORLD);
}
if(rank==1){
//Receive from process at WORLD_Comm level.
MPI_Recv(&recv,1,MPI_INT,0,99,MPI_COMM_WORLD,&status);
printf("Received at WORLD Level : %d \n\n",recv);
}
if(newSize > 2){
if(newrank == 2){
//send to process 1 wrt the newComm
MPI_Send(&data,1,MPI_INT,1,0,newComm);
}
if(newrank==1){
//Receive from process at newComm level.
MPI_Recv(&recv,1,MPI_INT,2,0,newComm,&status);
printf("Received at newComm Level : %d \n\n",recv);
}
}
MPI_Finalize();
return 0;
}

当我尝试在 new Communicator 中发送/接收数据时发生错误。该错误是有道理的,因为不属于新通信器的进程(奇数级进程)不能使用新通信器句柄 (newComm)。

所以我的问题是如何检查给定进程是否属于新的通信器。
这样我就可以在进行任何交流之前放好这个守卫。

谢谢,

最佳答案

我会重新审视执行 MPI_Comm_split 的代码。据我所知,您不需要两个单独的变量 newCommnewComm2。当您调用 MPI_Comm_split 时,您可以考虑在全局创建多个通信器:每个 color 值一个。但是每个调用 MPI_Comm_split 的进程只获得对一个通信器的引用 - 它所属的那个。

带有MPI_Comm_splitif语句可以替换为

MPI_Comm_split(MPI_COMM_WORLD, (rank % 2 == 0), rank, &newComm);
MPI_Comm_rank(newComm, &newrank);
MPI_Comm_size(newComm, &newSize);

创建了两个通信器,但是newComm在不同的进程中引用了不同的通信器。

如果奇数进程根本不需要通信,你可以让它们为color提供MPI_UNDEFINED。这将使它们为 newComm 获取 MPI_COMM_NULL 值:

MPI_Comm_split(MPI_COMM_WORLD, (rank % 2) ? MPI_UNDEFINED : 0, rank, &newComm);

然后您的代码可以检查是否 (newcomm == MPI_COMM_NULL)

关于mpi - 如何识别 MPI 进程是否属于给定的 Communicator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12438537/

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