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

基于分治法的并行求和C代码实现求助:8节点256数求和

基于数组方法的8节点并行求和C实现(MPI)

核心实现思路

  • 数组初始化:仅在处理器0上生成包含1到256的完整数组,其他节点无需初始化全局数组。
  • 数组分发:利用MPI的MPI_Scatter函数,将全局数组按节点数(8个)平均拆分,每个节点自动获取32个元素的局部数组,替代手动逐级二分的循环逻辑。
  • 局部求和:每个节点遍历自身的局部数组,计算局部和。
  • 结果归约:通过MPI_Reduce函数,将所有节点的局部和归约到处理器0,得到最终总和。

完整C代码

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

#define TOTAL_NUM 256
#define PROCESSOR_COUNT 8
#define LOCAL_NUM TOTAL_NUM / PROCESSOR_COUNT // 每个节点分配32个元素

int main(int argc, char** argv) {
    int rank, size;
    int global_array[TOTAL_NUM];
    int local_array[LOCAL_NUM];
    long long local_sum = 0, global_sum = 0;

    // 初始化MPI环境
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    // 仅处理器0生成全局数组(1到256)
    if (rank == 0) {
        for (int i = 0; i < TOTAL_NUM; i++) {
            global_array[i] = i + 1;
        }
    }

    // 将全局数组拆分分发到所有节点的局部数组
    MPI_Scatter(global_array, LOCAL_NUM, MPI_INT,
                local_array, LOCAL_NUM, MPI_INT,
                0, MPI_COMM_WORLD);

    // 计算当前节点的局部和
    for (int i = 0; i < LOCAL_NUM; i++) {
        local_sum += local_array[i];
    }

    // 归约所有节点的局部和到处理器0,执行求和操作
    MPI_Reduce(&local_sum, &global_sum, 1, MPI_LONG_LONG,
               MPI_SUM, 0, MPI_COMM_WORLD);

    // 处理器0输出最终结果
    if (rank == 0) {
        printf("1到256的总和为:%lld\n", global_sum);
        printf("公式验证结果:%d\n", (256 * 257) / 2); // 1+2+...+n = n(n+1)/2
    }

    // 结束MPI环境
    MPI_Finalize();
    return 0;
}

关键代码说明

  • MPI_Scatter:自动完成数组的拆分与广播,无需手动实现逐级二分循环。参数中明确全局数组、每个节点接收的元素数量,以及发起分发的根节点(处理器0)。
  • MPI_Reduce:统一处理结果归约,MPI_SUM指定归约操作为求和,直接将所有局部和汇总到处理器0的全局变量中。
  • 数据类型选择:用long long存储和值,避免大数值求和时的整数溢出(虽本次求和结果在int范围内,但养成大数值用长整型的习惯更稳妥)。

编译与运行

编译命令:mpicc -o parallel_sum parallel_sum.c
运行命令:mpiexec -n 8 ./parallel_sum

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:05:32