我已经坚持了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);
}
}
我可以附加调试输出以防任何人想要它。感谢任何帮助,我真的很绝望。