我正在编写用于数据交换的MPI C ++代码,下面是示例代码:
#include <stdio.h>
#include <mpi.h>
int main(int argc, char **argv)
{
int size, rank;
int dest, tag, i;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
printf("SIZE = %d RANK = %d\n",size,rank);
if ( rank == 0 )
{
double data[500];
for (i = 0; i < 500; i++)
{
data[i] = i;
}
dest = 1;
tag = 1;
MPI_Send(data,500,MPI_DOUBLE,dest,tag, MPI_COMM_WORLD );
}
MPI_Finalize();
return(0);
}
看起来500是我可以发送的最大值。如果数据的数量增加到600,则代码似乎停在&#34; MPI_SEND&#34;没有进一步的进展我怀疑使用MPI_SEND传输数据是否有任何限制。你能有人开导我吗?
提前致谢,
阚
答案 0 :(得分:4)
长话短说,你的程序是不正确的,你很幸运它没有挂起一小部分。
根据MPI标准,除非已发布匹配的MPI_Send()
,否则您不能认为MPI_Recv()
会返回。
从实用的角度来看,“短”消息通常以急切模式发送,MPI_Send()
可能会立即返回。
另一方面,“长”消息通常涉及一个rendez-vous协议,因此挂起直到匹配的接收已发布。
“small”和“long”取决于多个因素,包括您正在使用的互连。再一次,如果您发送足够小的消息,则不能认为MPI_Send()
将始终立即返回。