我写了这样的代码:
void main(int argc, char **argv ) {
char message[20];
int i, rank, size, type=99;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if(rank == 0) {
strcpy_s(message, "Hello, world");
for (i=1; i<size; i++)
MPI_Send(message, 13, MPI_CHAR, i, type, MPI_COMM_WORLD);
} else {
MPI_Recv(message, 20, MPI_CHAR, 0, type, MPI_COMM_WORLD, &status);
}
printf( "Message from process =%d : %.13s\n", rank, message);
MPI_Finalize();
}
我的输出是随机排序的。例如:
Message from process = 4 : Hello, world
Message from process = 2 : Hello, world
Message from process = 0 : Hello, world
Message from process = 1 : Hello, world
Message from process = 3 : Hello, world
但我想这样做:
Message from process = 0 : Hello, world
Message from process = 1 : Hello, world
Message from process = 2 : Hello, world
Message from process = 3 : Hello, world
Message from process = 4 : Hello, world
我尝试了一些代码,但仍处理随机顺序。
我改变了我的代码。现在,每个进程都等待来自前任的消息。但仍然处理输出随机排序。我写了MPI_Wait,但它没有用。
if(rank == 0) {
strcpy_s(message, "Hello, world");
printf( "Message from process =%d : %.13s\n", rank, message);
MPI_Isend(message, 13, MPI_CHAR, rank + 1, type, MPI_COMM_WORLD, &request);
MPI_Wait(&request, &status);
} else {
MPI_Recv(message, 20, MPI_CHAR, (rank - 1) % size, type, MPI_COMM_WORLD, &status);
printf( "Message from process =%d : %.13s\n", rank, message);
if(rank < (size - 1)){
MPI_Isend(message, 13, MPI_CHAR, (rank + 1) % size, type, MPI_COMM_WORLD, &request);
MPI_Wait(&request, &status);
}
}
我希望有人帮助我。感谢。
答案 0 :(得分:3)
默认情况下,printf
语句将由首先遇到的处理器进行评估,而不是按等级顺序进行评估。如果您必须按排名顺序进行,那么您可以尝试以下方式:
for(i = 0; i < size; i++) {
if(i == rank) {
printf("Message from process =%d : %.13s\n", rank, message);
}
MPI_Barrier(MPI_COMM_WORLD);
}
这循环遍历每个等级并且仅允许打印当前等级,而其他所有人都命中MPI_Barrier
并被迫等待。但请记住,这不是一种可扩展的方法。
答案 1 :(得分:1)
我很喜欢循环方式中的MPI_Barrier!另一种方法是传递令牌:
source = myrank -1;
dest = myrank + 1
if (source < 0) source = MPI_PROC_NULL;
if (dest >= nprocs) dest = MPI_PROC_NULL;
MPI_Recv(NULL, 0, MPI_BYTE, source, 0, comm, MPI_STATUS_IGNORE);
printf("Message from process =%d : %.13s\n", rank, message);
MPI_Send(NULL, 0, MPI_BYTE, dest, 0, comm);
另一种方法(这应该是一个单独的答案?)是在行前加一个排名,然后排序。在MPICH中,这将是mpiexec -np 4 -prepend-rank ...