2013-03-11 4 views
0

Узел00 может отправить информацию узлу 101, чей ранг 1 успешно, но он будет заблокирован при втором отправке на узел01. Почему так случилось? Большое спасибо. Я думаю, что в коде нет тупика.mpi_send будет заблокирован при отправке второго сообщения

Учитывая программирования MPI есть 5 узлов

..... 
MPI_Comm_size(MPI_COMM_WORLD, &size); 
MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
MPI_Get_processor_name(processor_name, &namelen); 
MPI_Status status; 

int buff; 

if(rank ==0) 
{ 
    buff=123; 
    for(int i=1;i<size;i++){ 
    MPI_Send(&buff, 1, MPI_INT, i, tag, MPI_COMM_WORLD); //succeed 
    MPI_Send(&buff, 1, MPI_INT, i, tag, MPI_COMM_WORLD); //blocked 
    } 
} 
else 
{ 
    MPI_Recv(&buff, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);//succeed 
    MPI_Recv(&buff, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);//blocked 
} 
............ 
+1

Как вы определили, что блоки вызовов? Является ли 'tag' четко определенным и идентичным для каждого ранга? – Zulan

ответ

0

Почему бы вам не использовать MPI_Isend и MPI_Irecv.These не имели вызовы блокирующих.

0
#include<stdio.h> 
#include<math.h> 
#include<mpi.h> 
#define tag 777 
int rank; 
int size; 
int main(int argc,char *argv[]) 
{ 


    MPI_Init(&argc, &argv); 
MPI_Comm_size(MPI_COMM_WORLD, &size); 
MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
//MPI_Get_processor_name(processor_name, &namelen); 
MPI_Status status; 

int buff; 
int i; 
if(rank ==0) 
{ printf("hai"); 
    buff=123; 
    for(i=1;i<size;i++){ 
    MPI_Send(&buff, 1, MPI_INT, i, tag, MPI_COMM_WORLD); //succeed 
    MPI_Send(&buff, 1, MPI_INT, i, tag, MPI_COMM_WORLD); //blocked 
    } 
} 
else 
{ 
printf("hello"); 
    MPI_Recv(&buff, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);//succeed 
    MPI_Recv(&buff, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);//blocked 
} 

//MPI_Finalize(); //finalize MPI operations 
return 0; 
} 
+0

Пожалуйста, объясните свой код – Gwenc37

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