You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MPI_Send与MPI_Recv中accum变量作用及代码逻辑问询

关于你的MPI并行求和代码疑问解答

嘿,先帮你澄清第一个误会:accum其实已经在代码开头就声明过啦!你可以看看main函数里,在定义rank和size之后,应该有一行int accum;的声明,所以sum = sum + accum;里的accum是完全合法的,不存在未声明的问题哦。

接下来给你拆解代码里的关键部分:

非0号进程(else块)的循环逻辑

当进程编号rank不等于0的时候,这个进程会执行else块里的逻辑:

  • 首先初始化一个局部变量local_sum用来存储自己负责计算的部分和
  • 然后遍历1到1000的所有整数,根据进程总数size和自己的rank来分配计算任务:
    比如总共有4个进程(size=4),rank=1的进程会计算所有除以4余1的数(1、5、9...),rank=2的进程计算除以4余2的数(2、6、10...),以此类推
  • 把自己负责的所有数累加完成后,通过MPI_Send把local_sum发送给0号进程,让它来汇总结果

accum的具体作用

accum是0号进程用来临时存储数据的变量:

  • 在0号进程的循环里,它会依次接收每个非0号进程发送过来的部分和,每次接收的时候,会把数据放到accum里
  • 然后执行sum = sum + accum;,把这个临时存储的部分和加到总结果sum里
  • 循环完成后,sum就包含了所有进程计算的部分和,再加上0号进程自己负责的那部分,就是1到1000的最终总和啦

最后贴一下这段完整的代码(方便你对照):

#include <mpi.h>
#include <iostream>

int main(int argc, char** argv) {
    MPI_Init(&argc, &argv);
    
    int rank, size;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    
    int sum = 0;
    int accum; // accum的声明就在这里!
    
    if (rank == 0) {
        // 先计算自己负责的部分和
        for (int i = 1; i <= 1000; ++i) {
            if (i % size == 0) {
                sum += i;
            }
        }
        // 接收其他进程的部分和并累加
        for (int i = 1; i < size; ++i) {
            MPI_Recv(&accum, 1, MPI_INT, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
            sum += accum;
        }
        std::cout << "Total sum from 1 to 1000: " << sum << std::endl;
    } else {
        int local_sum = 0;
        // 计算自己负责的余数对应的数的和
        for (int i = 1; i <= 1000; ++i) {
            if (i % size == rank) {
                local_sum += i;
            }
        }
        // 发送给0号进程
        MPI_Send(&local_sum, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
    }
    
    MPI_Finalize();
    return 0;
}

内容的提问来源于stack exchange,提问作者FanZhou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 17:25:26