使用MPI_Comm_connect / MPI_Comm_accept阻止MPI_Send / MPI_Recv

时间:2016-06-13 00:57:11

标签: c client-server mpi

我正在使用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;
}

0 个答案:

没有答案