MPI没有收到我用阻塞发送/接收发送的相同缓冲区

时间:2013-12-28 10:04:50

标签: c++ mpi

我没有收到我发送的相同缓冲区。即使阻止Send / Recv。我使用连续分配的缓冲区。

我基本上在每条消息中更改了该缓冲区中的第一行。主机发送后,带有更改的缓冲区是正常的,但是在从机中接收后它是错误的。

我已经花了超过15个小时。任何帮助表示赞赏。

这是我在1个主人+ 1个奴隶情况下的很多消息。注意主服务器的第一行如何更改但缓冲区的其余部分保持不变。在slave的一侧,缓冲区的其余部分也会改变。它是:log messages

size_t order = 0;
floattype **getWork(floattype **work, floattype **tmatrix)
{
     size_t tmp = 1;

     // leading row
     work[0] = tmatrix[order++];

     // get needed rows
     for(size_t row = 1; row < 5; row++)
     {
          work[tmp++] = tmatrix[row];
     }

     return work;
 }


void master(size_t chunksize, floattype **extendedmatrix, size_t paramcount, size_t rowcount)
{
     int ntasks, node;
     size_t reply;
     floattype **tmatrix = transponeMatrix(extendedmatrix, paramcount, rowcount);
     floattype **work = AllocMatrix(rowcount, chunksize + 1);


     MPI_Status status;
     MPI_Comm_size(MPI_COMM_WORLD, &ntasks);


     // init all slaves
     for (node = 1; node < ntasks; ++node) 
     {      
          getWork(work, tmatrix);

          MPI_Send(work[0], 32, MPI_DOUBLE, node, WORKTAG, MPI_COMM_WORLD);
     }

     size_t rpt = 0;

     while (rpt < 3) 
     {
        rpt++;
        MPI_Recv(&reply, 1, MPI_UNSIGNED_LONG, MPI_ANY_SOURCE, INFOTAG, MPI_COMM_WORLD, &status); 

        getWork(work, tmatrix);

        MPI_Send(work[0], 32, MPI_DOUBLE, status.MPI_SOURCE, WORKTAG, MPI_COMM_WORLD);  
     }
 }

void slave(size_t chunksize, size_t paramcount, size_t rowcount)
{
    floattype **received = AllocMatrix(rowcount, chunksize + 1);
        size_t reply = 0;

    MPI_Status status;

    while (true) {
         MPI_Recv(received[0], 32, MPI_DOUBLE, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);

         // lets finish
         if (status.MPI_TAG == DIETAG) {
             FreeMatrix(received);

             return;
         }


         MPI_Send(&reply, 1, MPI_UNSIGNED_LONG, 0, INFOTAG, MPI_COMM_WORLD);
    }

}

1 个答案:

答案 0 :(得分:0)

错误的内存分配...应该使用memcpy()在getWork()中将内存块从一个缓冲区复制到另一个缓冲区。