2013-12-06 5 views
0

Im в настоящее время пытается реализовать умножение матрицы на матрицу с помощью C. У меня есть следующий кодMPI умножение матрицы на матрицу

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

От MPI_SEND документы:

Эта процедура может блокировать, пока сообщение не будет получен в процессе назначения.

и это то, что вас отключает. Все пытаются отправить, но никто не слушает, так как все пытаются отправить, поэтому все ждут, когда кто-то заткнется и послушает, но никто никогда не делает, и все задаются вопросом, какого черта все остальные делают. : P

Один из методов, который я могу видеть, заключается в том, чтобы пошатнуть связь. Например, при условии четного количества срезов, сначала все четные процессы отправляются, пока все нечетные процессы прослушиваются; затем посылают нечетные процессы, а четные процессы слушают.

EDIT: «Как я могу это сделать?» В значительной степени, как я объяснил. Вместо того, чтобы ваш «отправить то 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(); 

не проверял, так что могут быть ошибки, но, в сущности, это как бы я его реализовать.

+0

это общий смысл! но как я могу реализовать это в своем коде? Как я могу это сделать? – Hous3aholik

+0

@ user2913269: Я расширил ответ с помощью псевдо-C. – Amadan

Смежные вопросы