c - MPI Irecv 无法正确接收缓冲区的第一个元素?

标签 c buffer mpi parallel-processing

我刚刚尝试了 MPI,并复制并运行了这段代码,该代码取自 [LLNL MPI 教程][1] 中的第二个代码示例。

#include <mpi.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char ** argv) {
    int num_tasks, rank, next, prev, buf[2], tag1 = 1, tag2 = 2;
    MPI_Request reqs[4];
    MPI_Status status[2];

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &num_tasks);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    prev = rank - 1;
    next = rank + 1;
    if (rank == 0) prev = num_tasks - 1;
    if (rank == (num_tasks - 1)) next = 0;

    MPI_Irecv(&buf[0], 1, MPI_INT, prev, tag1, MPI_COMM_WORLD,
                    &reqs[0]);
    MPI_Irecv(&buf[1], 1, MPI_INT, next, tag2, MPI_COMM_WORLD,
                    &reqs[1]);
    MPI_Isend(&rank, 1, MPI_INT, prev, tag2, MPI_COMM_WORLD, &reqs[2]);
    MPI_Isend(&rank, 1, MPI_INT, next, tag1, MPI_COMM_WORLD, &reqs[3]);

    MPI_Waitall(4, reqs, status);
    printf("Task %d received %d from %d and %d from %d\n",
                    rank, buf[0], prev, buf[1], next);

    MPI_Finalize();
     return EXIT_SUCCESS;
}

我希望得到这样的输出(例如 4 个任务):

$ mpiexec -n 4 ./m3
Task 0 received 3 from 3 and 1 from 1
Task 1 received 0 from 0 and 2 from 2
Task 2 received 1 from 1 and 3 from 3
Task 3 received 2 from 2 and 0 from 0

然而,相反,我得到了这个:

$ mpiexec -n 4 ./m3
Task 0 received 0 from 3 and 1 from 1
Task 1 received 0 from 0 and 2 from 2
Task 3 received 0 from 2 and 0 from 0
Task 2 received 0 from 1 and 3 from 3

也就是说,进入缓冲区 buf[0] 的消息(带有 tag == 1)始终获取值 0。此外,如果我更改代码以便将缓冲区声明为 buf[3] 而不是 buf[2 ],并将 buf[0] 的每个实例替换为 buf[2],然后我精确地得到了我期望的输出(即上面给出的第一个输出集)。这看起来好像,出于某种原因,某些东西正在用 0 覆盖 buf[0] 中的值。但我看不出那可能是什么。顺便说一句,据我所知,我的代码(未经修改)与教程中的代码完全匹配,除了我的 printf 之外。

谢谢!

最佳答案

状态数组的大小必须为 4 而不是 2。在您的情况下,MPI_Waitall 在写入状态时会损坏内存。

关于c - MPI Irecv 无法正确接收缓冲区的第一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7543871/

相关文章:

c - 终端驱动程序缓冲区是否存储用户输入的字符?如果是这样,如何访问这些内容?

Java BufferedOutputStream策略

c - MPI基础类(class)

c - MPI_Gatherv 未正确收集数据

c - 重新定义 ‘main’

c - C : are these types identical technically, 中的类型声明等效还是只是实用上相同?

c - C 中的动态数组 - 如何使其工作?

php - 我如何从 php 调用 C 程序中的函数?

c - 我需要将一个文件(现在是文本文件)拆分为多个缓冲区 C

MPI:为什么我的 MPICH 程序因大号而失败。进程?