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
相关产品推荐
相关产品推荐

