基于分治法的并行求和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
相关产品推荐
相关产品推荐

