我正在使用MPI开发客户端/服务器应用程序。我使用MPI_Open_port(),MPI_Comm_Accept()和MPI_Comm_connect()来做到这一点。在应用程序内部,我还使用MPI_Send()和MPI_Recv()来进行客户端/服务器通信。
使用MPI_Send()/ MPI_Recv()传输小数组时,一切正常。当一些数组增长时,我遇到了问题。由于某些原因,大型数组MPI_Send / Recv函数阻止执行。这就像我在相同的Rank上发送和接收数据,这是真的,但我使用不同的通信器。我真的不明白为什么它不起作用。
对于16 * 16 * 16的尺寸,一切正常,但是,例如,尺寸等于32 * 32 * 32,它不会。我真的很想知道发生了什么,我很感激任何解决这个问题的建议。
感谢。
服务器是:
#include<mpi.h>
#include<stdio.h>
#define SIZE 32*32*32
//#define SIZE 16*16*16
int main(int argc, char *argv[])
{
MPI_Comm client;
char port_name[MPI_MAX_PORT_NAME];
FILE* port_file;
int buf[SIZE];
MPI_Init(&argc,&argv);
port_file = fopen("ports.txt","w");
MPI_Open_port(MPI_INFO_NULL, port_name);
fprintf(port_file,"%s\n",port_name);
fclose(port_file);
MPI_Comm_accept(port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &client);
printf("Client connected...\n");
printf("Sending data...\n");
MPI_Send((void*)&buf, SIZE, MPI_INT, 0, 0, client);
printf("Data sent...\n");
MPI_Comm_free(&client);
MPI_Close_port(port_name);
MPI_Finalize();
return 0;
}
客户是:
#include<mpi.h>
#include<stdio.h>
#define SIZE 32*32*32
//#define SIZE 16*16*16
int main(int argc, char *argv[])
{
MPI_Comm server;
char port_name[MPI_MAX_PORT_NAME];
FILE* port_file;
int buf[SIZE];
MPI_Init(&argc,&argv);
port_file = fopen("ports.txt","r");
fscanf(port_file,"%s\n",port_name);
fclose(port_file);
MPI_Comm_connect(port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &server);
printf("Client connected...\n");
printf("Receiving data...\n");
MPI_Recv((void*)&buf, SIZE, MPI_INT, MPI_ANY_SOURCE,
MPI_ANY_TAG, server, MPI_STATUS_IGNORE);
printf("Data received...\n");
//MPI_Comm_disconnect(&server);
MPI_Finalize();
return 0;
}