MPI矩阵 - 矩阵乘法

时间:2013-12-06 00:40:28

标签: c matrix mpi

我目前正在尝试使用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,然后在前一进程的当前进程中接收它。我的程序只是挂在那里,我必须终止它。 有人能告诉我如何处理这个问题......

非常感谢您的时间,非常感谢您的帮助!

1 个答案:

答案 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();

没有经过测试,所以可能存在错误,但实质上就是我实现它的方式。