Смешно простая проблема MPI_Send / Recv, я не понимаю - PullRequest
0 голосов
/ 28 марта 2011

У меня есть две функции с разными алгоритмами.В первой функции я реализовал неблокирующую связь (MPI_Irecv, MPI_Isend) и программа работает без ошибок.Даже когда я изменяю неблокирование на блокировку связи, все хорошо.Нет тупика.Но если я реализую вторую функцию с базовой блокировкой связи, как это (свел алгоритм к проблеме):

 if( my_rank == 0)
    {
      a = 3 ;
      MPI_Send(&a,1,MPI_DOUBLE,1,0,MPI_COMM_WORLD) ;
    }

    else if( my_rank == 1 )
    {
      MPI_Recv(&a,1,MPI_DOUBLE,0,0,MPI_COMM_WORLD, &status ) ;
    }

Итак, процесс 1 должен получить значение a из процесса 0. Но я получаю этоошибка:

Неустранимая ошибка в MPI_Recv: сообщение обрезано, стек ошибок: MPI_Recv (187) .......................:MPI_Recv (buf = 0xbfbef2a8, count = 1, MPI_DOUBLE, src = 0, tag = 0, MPI_COMM_WORLD, status = 0xbfbef294) не удалось MPIDI_CH3U_Request_unpack_uebuf (600): сообщение обрезано;Получено 32 байта, но размер буфера равен 8, ранг 2 в задании 39. Blabla вызвал коллективное прерывание всех рангов. Статус выхода на ранг 2: уничтожен по сигналу 9

Если запустить программу только с одним из двухфункции, то они работают, как они должны.Но оба вместе приводят к сообщению об ошибке выше.Я понимаю сообщение об ошибке, но я не знаю, что я могу сделать, чтобы предотвратить это.Может кто-нибудь объяснить мне, где я должен искать ошибку?Поскольку в первой функции я не захожу в тупик, я предполагаю, что не может быть полученного сообщения от первой функции, которое приводит к ошибке во второй.

1 Ответ

0 голосов
/ 29 марта 2011

Итак, вот первая функция:

MPI_Type_vector(m,1,m,MPI_DOUBLE, &column_mpi_t ) ;
MPI_Type_commit(&column_mpi_t) ;

T = (double**)malloc(m*sizeof(double*)) ;
T_data = (double*)malloc(m*m*sizeof(double)) ;


for(i=0;i<m;i++)
{
  T[i] = &(T_data[i*m]) ;
}

if(my_rank==0)
{
  s = &(T[0][0]) ;
  for(i=1;i<p;i++)
  {
    MPI_Send(s,1,column_mpi_t,i,0,MPI_COMM_WORLD) ;
  }
}
for(k=0;k<m-1;k++)
{
  if(k%p != my_rank)
  {
    rbuffer = &(T[0][k]) ;
    MPI_Recv(rbuffer,1,column_mpi_t,k%p,0,MPI_COMM_WORLD,&status) ;
  }

  for(j=k+1;j<n;j++)
  {
    if(j%p==my_rank)
    {
      if(j==k+1 && j!=n-1)
      {
        sbuffer = &(T[0][k+1]) ;
        for(i=0;i<p;i++)
        {
          if(i!= (k+1)%p )
            MPI_Send(sbuffer,1,column_mpi_t,i,0,MPI_COMM_WORLD) ;
        }
      }         
    }
  }
}

Я пришел к выводу, что производный тип данных является источником моих проблем. Кто-то видит почему?

Хорошо, я не прав. Если я изменю тип данных MPI в MPI_Irecv / send на MPI_DOUBLE, это будет соответствовать типам данных recv / send второй функции ... так что нет ошибки усечения Итак, нет решения ....

...