简单 MPI 流水线环形广播代码中的死锁
Deadlock in simple MPI pipelined ring broadcast code
我正在学习 MPI 代码。我正在尝试使用不同大小的块进行流水线环形广播。但是,当我 运行 我的代码时,当进程 0 尝试发送第二个数据块时它陷入了死锁,我不知道为什么。任何帮助将不胜感激。
注意:这是更大代码的一部分。它在进程 0 上用字符填充缓冲区。使用 print 语句进行一些简单的调试后,我相信第 9 行(标有 ***)有问题,因为那是程序停止的地方。第二块数据永远不会从进程 0 发送。
int offset;
MPI_Status status;
if (rank == 0) {
offset = 0;
while (offset < NUM_BYTES) {
MPI_Send(&chunk_size, 1, MPI_INT, rank + 1, 3, MPI_COMM_WORLD);
MPI_Send(&offset, 1, MPI_INT, rank + 1, 2, MPI_COMM_WORLD);
MPI_Send(&buffer[offset], chunk_size, MPI_BYTE, rank + 1, 1, MPI_COMM_WORLD); ***
offset = offset + chunk_size;
if ((offset + chunk_size) >= NUM_BYTES) {
chunk_size = (NUM_BYTES - offset);
}
}
}
else {
MPI_Recv(&chunk_size, 1, MPI_INT, rank - 1, 3, MPI_COMM_WORLD, &status);
MPI_Recv(&offset, 1, MPI_INT, rank - 1, 2, MPI_COMM_WORLD, &status);
MPI_Recv(&buffer[offset], chunk_size, MPI_BYTE, rank - 1, 1, MPI_COMM_WORLD, &status);
if (rank != num_procs - 1) {
MPI_Send(&chunk_size, 1, MPI_INT, rank + 1, 3, MPI_COMM_WORLD);
MPI_Send(&offset, 1, MPI_INT, rank + 1, 2, MPI_COMM_WORLD);
MPI_Send(&buffer[offset], chunk_size, MPI_BYTE, rank + 1, 1, MPI_COMM_WORLD);
}
}
代码看起来不错(虽然不是很有效,因为所有通信都是序列化的)但是你有一个很大的错误:只有进程 #0 在循环中通信,所以它会发送几次,而所有其他进程只期望一个单一的一套通信。在 else
部分添加相同的 while
循环,这应该有效。
我正在学习 MPI 代码。我正在尝试使用不同大小的块进行流水线环形广播。但是,当我 运行 我的代码时,当进程 0 尝试发送第二个数据块时它陷入了死锁,我不知道为什么。任何帮助将不胜感激。
注意:这是更大代码的一部分。它在进程 0 上用字符填充缓冲区。使用 print 语句进行一些简单的调试后,我相信第 9 行(标有 ***)有问题,因为那是程序停止的地方。第二块数据永远不会从进程 0 发送。
int offset;
MPI_Status status;
if (rank == 0) {
offset = 0;
while (offset < NUM_BYTES) {
MPI_Send(&chunk_size, 1, MPI_INT, rank + 1, 3, MPI_COMM_WORLD);
MPI_Send(&offset, 1, MPI_INT, rank + 1, 2, MPI_COMM_WORLD);
MPI_Send(&buffer[offset], chunk_size, MPI_BYTE, rank + 1, 1, MPI_COMM_WORLD); ***
offset = offset + chunk_size;
if ((offset + chunk_size) >= NUM_BYTES) {
chunk_size = (NUM_BYTES - offset);
}
}
}
else {
MPI_Recv(&chunk_size, 1, MPI_INT, rank - 1, 3, MPI_COMM_WORLD, &status);
MPI_Recv(&offset, 1, MPI_INT, rank - 1, 2, MPI_COMM_WORLD, &status);
MPI_Recv(&buffer[offset], chunk_size, MPI_BYTE, rank - 1, 1, MPI_COMM_WORLD, &status);
if (rank != num_procs - 1) {
MPI_Send(&chunk_size, 1, MPI_INT, rank + 1, 3, MPI_COMM_WORLD);
MPI_Send(&offset, 1, MPI_INT, rank + 1, 2, MPI_COMM_WORLD);
MPI_Send(&buffer[offset], chunk_size, MPI_BYTE, rank + 1, 1, MPI_COMM_WORLD);
}
}
代码看起来不错(虽然不是很有效,因为所有通信都是序列化的)但是你有一个很大的错误:只有进程 #0 在循环中通信,所以它会发送几次,而所有其他进程只期望一个单一的一套通信。在 else
部分添加相同的 while
循环,这应该有效。