【发布时间】:2021-09-27 23:22:54
【问题描述】:
我正在尝试在每个进程上都有一个数组的所有进程之间发送数据,例如
int local_data[] = {0*rank,1*rank,2*rank,3*rank};
我有一个相应的标志数组,其中该数组中的每个值都指向我应该发送该值的进程,例如:
int part[] = {0,1,3,2};
所以这意味着 local_data[0] 应该以等级 0 进行处理 local_data[2] 应该以等级 3 进行处理,依此类推。 标志 arr 中的值从一个进程更改为另一个进程(均在 0-P-1 范围内,其中 P 是可用进程的总数)。
使用这个,我目前正在做的是:
for(int i=0; i<local_len; i++){
if(part[i] != rank){
MPI_Send(&local_data[i], 1,MPI_INT, part[i], 0, MPI_COMM_WORLD);
MPI_Recv(&temp,1, MPI_INT, rank, 0, MPI_COMM_WORLD, &status );
recvbuf[j] = temp;
j++;
}
else{
recvbuf[j] = local_data[i];
j++;
}
}
如果part[i] != rank,我只发送和接收数据,以避免从同一进程发送和接收
recvbuf 是我接收每个进程的值的数组。它可以比初始 local_data 长度更长。
我也试过
MPI_Sendrecv(&local_data[i], 1,MPI_INT, part[i], 0, &temp, 1, MPI_INT, rank, 0, MPI_COMM_WORLD, &status);
程序在两种情况下都卡住了
我该如何解决这个问题?
All-to-All 集体是通往这里的路吗?
【问题讨论】:
-
一个给定的
rank发送到part[i]但从rank接收(例如它自己)所以这将挂起。请注意,您的模式假定每个等级恰好将一个元素发送到所有其他等级。根据通信的排序方式,无论如何它可能会陷入僵局。MPI_Alltoallv()看起来像去这里的路。