首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单MPI流水线环广播码中的死锁

简单MPI流水线环广播码中的死锁
EN

Stack Overflow用户
提问于 2015-10-21 04:39:21
回答 1查看 306关注 0票数 2

我在学习MPI代码。我正在尝试使用不同大小的块来执行流水线环广播。但是,当我运行我的代码时,当进程0试图发送第二个数据块时,它会出现死锁,我不知道为什么。任何帮助都将不胜感激。

注意:这是一个大得多的代码的一部分。它在进程0上用字符填充缓冲区。经过一些简单的使用print语句的调试之后,我认为第9行(用*标记)有问题,因为这是程序停止的地方。第二个数据块从未从进程0发送。

代码语言:javascript
复制
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);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-21 05:36:08

代码看起来很好(虽然并不是很有效,因为所有的通信都是序列化的),但是您有一个很大的失误:只有进程#0在一个循环中进行通信,所以它会发送几次,而所有其他进程只需要一组通信。在while部件中添加相同的else循环,这应该可以工作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33251051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档