MPI没有收到我发送的相同缓冲区

时间:2013-12-27 18:00:33

标签: c++ mpi send recv

我已经坚持了9个小时。

我一直在接收与我发送的数据不同的数据...我使用阻止Recv / send所以修改发送缓冲区应该没有问题...

基本上,主设备向其所有从设备发送一个初始缓冲区 - 它们由它们接收,它们会对它进行一些操作并发回一些东西。主人正在等待奴隶的回应。它保存了首先响应的slave的id,准备下一个缓冲区并发送回该slave。这种情况发生在主人发送了一个kill标签之前。

我的代码的主要部分:

void master()
{
    double **work = AllocMatrix(rowcount, chunksize + 1);
    MPI_Status status;

    // init all slaves
    for (node = 1; node < ntasks; ++node) {
        offset = getOffset(chunksize, i, remaininglines, paramcount + 1);
        getWork(work, tmatrix, i, j, offset);

        MPI_Send(work[0], ((offset + 1) * rowcount), MPI_DOUBLE, node, WORKTAG, MPI_COMM_WORLD);

        recalculateValues(i, j, chunksize, remaininglines, paramcount + 1);
    }

    while (i < (paramcount + 1)) {
        MPI_Recv(&offsetreceived, 1, MPI_INT, MPI_ANY_SOURCE, INFOTAG, MPI_COMM_WORLD, &status); 

        offset = getOffset(chunksize, i, remaininglines, paramcount + 1);
        getWork(work, tmatrix, i, j, offset);

        MPI_Send(work[0], ((offset + 1) * rowcount), MPI_DOUBLE, status.MPI_SOURCE, WORKTAG, MPI_COMM_WORLD);  

        recalculateValues(i, j, chunksize, remaininglines, paramcount + 1);
    }

    // finish
    for (node = 1; node < ntasks; ++node) {
        MPI_Recv(&offsetreceived, 1, MPI_INT, MPI_ANY_SOURCE, INFOTAG, MPI_COMM_WORLD, &status);

    }

    // send ending msg
    for (node = 1; node < ntasks; ++node) {
        MPI_Send(0, 0, MPI_INT, node, DIETAG, MPI_COMM_WORLD);
    }
}


void slave()
{
    double **received = AllocMatrix(rowcount, chunksize + 1);


    MPI_Status status;

    while (true) {
        MPI_Recv(received[0], ((offset + 1) * rowcount), MPI_DOUBLE, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &status);

         // lets finish
         if (status.MPI_TAG == DIETAG) {
            return;
         }

         // work
         MPI_Send(&offset, 1, MPI_INT, 0, INFOTAG, MPI_COMM_WORLD); 
    }
}

我可以附加调试输出以防任何人想要它。感谢任何帮助,我真的很绝望。

0 个答案:

没有答案