У меня есть этот код для тестирования MPI_Irecv и MPI_Isend
if(rank==1){
int cc;
MPI_Request request;
MPI_Status status;
int flag;
do{
MPI_Irecv(&cc, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, allcomm, &request);
//MPI_Wait(&request, &status);
MPI_Test(&request, &flag, &status);
if (flag != 0) {
printf("recv : %d, slave : %d\n", cc, status.MPI_SOURCE);
}
} while(flag != 0);
}
if(rank==0){
int cc=0;
MPI_Request request;
for(int i=1;i<10;i++){
cc+=1;
MPI_Isend(&cc, 1, MPI_INT, 1, 0, allcomm, &request);
}
}
Если я выполняю этот код, иногда он печатает cc от 1 до 9, а иногда ничего не печатает.
Это имеет смысл, поскольку процесс 0 может быть выполнен после завершения процесса 1.
Однако, если я позволю процессу 1 быть бесконечным циклом, подобным этому:
if(rank==1){
int cc;
MPI_Request request;
MPI_Status status;
int flag;
do{
MPI_Irecv(&cc, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, allcomm, &request);
//MPI_Wait(&request, &status);
MPI_Test(&request, &flag, &status);
if (flag != 0) {
printf("recv : %d, slave : %d\n", cc, status.MPI_SOURCE);
}
} while(true);
}
Я думаю, что процесс 1 выведет cc из1–9 каждый раз, но это не так.
Если я вставлю MPI_Wait () в процесс 1, кажется, что процесс 1 будет печатать cc от 1 до 9 каждый раз.Но он также будет ждать вечно, если другой процесс не отправит ничего, и я на самом деле хочу неблокирующую связь.
Ответ на комментарий:
1.О версии: mpiexec --version mpiexec (OpenRTE) 2.1.1
2.Я не понимаю, что означает «поток прогресса MPI».
На самом деле я хочу, чтобы каждый процесс мог связываться друг с другом без блокировки и получать информацию в буфере каждый раз при получении.
3. Исполняемый код, следующий за
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include <unistd.h>
int main(void)
{
MPI_Comm allcomm;
int i;
int size, rank, irank;
int tablesize, localtablesize;
int *table,*table2;
allcomm = MPI_COMM_WORLD;
MPI_Init(NULL, NULL);
MPI_Comm_size(allcomm, &size);
MPI_Comm_rank(allcomm, &rank);
if(rank==1){
int cc;
MPI_Request request;
MPI_Status status;
int flag;
do{
MPI_Irecv(&cc, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, allcomm, &request);
//MPI_Wait(&request, &status);
MPI_Test(&request, &flag, &status);
if (flag != 0) {
printf("recv : %d, slave : %d\n", cc, status.MPI_SOURCE);
}
} //while(flag!=0);
while(true);
}
if(rank==0){
int cc=0;
MPI_Request request;
for(int i=1;i<10;i++){
cc+=1;
MPI_Isend(&cc, 1, MPI_INT, 1, 0, allcomm, &request);
}
}
MPI_Finalize();
}