[英]mpi hello world not working
我用MPI库在Visual c ++ 2010 express上编写了简单的hello-world程序,无法理解,为什么我的代码无法正常工作。
MPI_Init( NULL, NULL );
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
int a, b = 5;
MPI_Status st;
MPI_Send( &b, 1, MPI_INT, 0,0, MPI_COMM_WORLD );
MPI_Recv( &a, 1, MPI_INT, 0,0, MPI_COMM_WORLD, &st );
MPI_Send告诉我“ DEADLOCK:尝试在未事先匹配接收的情况下将消息发送到本地进程”。 如果我先写Recv,程序卡在那里(无数据,阻止接收)。 我错了什么?
我的工作室是Visual C ++ 2010 Express。 HPC SDK 2008中的MPI(32位)。
您需要这样的东西:
assert(size >= 2);
if (rank == 0)
MPI_Send( &b, 1, MPI_INT, 1,0, MPI_COMM_WORLD );
if (rank == 1)
MPI_Recv( &a, 1, MPI_INT, 0,0, MPI_COMM_WORLD, &st );
MPI的想法是整个系统同步运行。 有时您确实需要知道您在“世界”中的参与者。 在这种情况下,假设您有两个成员(按照我的断言),则需要使其中一个发送,另一个使接收。
另请注意,我更改了send的“ dest”参数,因为0需要将发送到1,因此1需要从0接收。
以后,您可以根据需要以其他方式进行操作(如果每个人都需要告诉其他事情),但是在这种情况下,您可能会发现使用“集合操作”进行交换的更有效方法(都可以发送)并收到)。
在您的示例代码中,您是从0级别发送和接收的。如果您仅使用1个进程运行MPI程序(这没有任何意义,但是为了进行论证我们会接受),您可以这样做通过使用非阻塞调用而不是阻塞版本来工作。 它将使您的程序看起来像这样:
MPI_Init( NULL, NULL );
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
int a, b = 5;
MPI_Status st[2];
MPI_Request request[2];
MPI_Isend( &b, 1, MPI_INT, 0,0, MPI_COMM_WORLD, &request[0] );
MPI_Irecv( &a, 1, MPI_INT, 0,0, MPI_COMM_WORLD, &request[1] );
MPI_Waitall( request, st );
这样可以使发送和接收同时完成。 MPI版本不喜欢原始代码的原因(很高兴告诉您这样的事情)是因为对MPI_SEND
的调用可能会阻塞,直到匹配的MPI_RECV
完成为止,在这种情况下不会发生,因为它只会在MPI_SEND
结束后才被调用,这是循环依赖项。
在MPI中,当您在MPI调用之前添加“ I”时,表示“立即”,例如,当您调用MPI_WAIT
(或其某些版本,例如MPI_WAITALL
时,该调用将立即返回并稍后完成所有工作。这个例子)。 因此,我们在这里所做的就是立即使发送和接收返回,基本上只是告诉MPI我们打算在将来的某个时刻进行等级为0的发送和接收,然后稍后(下一行),我们告诉MPI:继续并立即完成这些通话。
使用这些调用的即时版本的好处是,从理论上讲,MPI可以在后台执行某些操作,以使发送和接收调用在您的应用程序执行不依赖于数据结果的其他操作时取得进展。 然后,当您稍后完成对MPI_WAIT*
的调用时,数据可用,您可以执行任何所需的操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.