我没有收到我发送的相同缓冲区。即使阻止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);
}
}
答案 0 :(得分:0)
错误的内存分配...应该使用memcpy()在getWork()中将内存块从一个缓冲区复制到另一个缓冲区。