我目前正在尝试使用C实现矩阵 - 矩阵乘法。我有以下代码
for(index=0; index<p; index++)
{
/* calculate the partial sum for matC given the row band of A and
B */
for (i=0; i<n/p; i++)
for (j=0; j<n; j++)
for (k=0; k<n; k++)
storage_matC[i*n+j] += storage_matA[i*n+k]*storage_matB[k*n+j];
if(index < p-1)
{
/* mpi send storage_matB to the next process (id+1)%p */
MPI_Send(storage_matB, n, MPI_FLOAT, (id+1)%p, 0, MPI_COMM_WORLD);
/* mpi receive storage_matB from the previous process */
MPI_Recv(&storage_matB, n, MPI_FLOAT, id, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}
}
我需要能够发送当前进程中使用的matrix_b,然后在前一进程的当前进程中接收它。我的程序只是挂在那里,我必须终止它。 有人能告诉我如何处理这个问题......
非常感谢您的时间,非常感谢您的帮助!
答案 0 :(得分:1)
来自MPI_Send docs:
此例程可能会阻塞,直到目标进程收到消息为止。
这就是绊倒你的原因。每个人都试图发送,但没有人在听,因为每个人都试图发送,所以每个人都在等待某人闭嘴听,但没有人做过,每个人都想知道其他人在做什么。 :P
我能看到的一种方法是错开沟通。例如,假设偶数个切片,首先所有偶数进程发送,而所有奇数进程都监听;然后奇数进程发送,偶数进程监听。
编辑:“我怎么能这样做?”就像我解释的那样。而不是你的“发送然后recv”,做这样的事情:odd_ring = p % 2
// first trip: evens send, odds receive
if (id % 2) recv();
else if (!odd_ring || id != p - 1) send();
// second trip: odds send, evens receive
if (id % 2) send();
else if (!odd_ring || id) recv();
// only when we have odd number of processes -
// collecting stragglers: last sends to first
if (odd_ring)
if (id == p - 1) send();
else if (!id) recv();
没有经过测试,所以可能存在错误,但实质上就是我实现它的方式。