gpt4 book ai didi

c++ - MPI 没有收到我通过阻塞发送/接收发送的相同缓冲区

转载 作者:太空宇宙 更新时间:2023-11-04 13:57:29 24 4
gpt4 key购买 nike

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

我基本上是在每条消息中更改该缓冲区中的第一行。有变化的buffer,master发过来是可以的,slave收到后就出错了。

我已经为此花费了超过 15 个小时。感谢您的帮助。

这是我在 1 master + 1 slave 情况下的很多消息。请注意 master 的第一行如何更改,但缓冲区的其余部分保持不变。在从属端,缓冲区的其余部分也发生了变化。它是: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);
}

}

最佳答案

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

关于c++ - MPI 没有收到我通过阻塞发送/接收发送的相同缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20813285/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com