Fortran MPI中非根进程无意义缓冲区的标准空地址参数使用问询
结论先行
MPI标准没有单独定义类似MPI_ANY_TAG的专门空缓冲区占位常量,但有两种完全可移植、符合标准的简洁方案可以替代自定义dummy变量:
方案1:使用MPI_BOTTOM作为占位符
你考虑的MPI_BOTTOM是完全合法的选择,不存在任何副作用:
- MPI标准明确规定,
MPI_REDUCE这类集合通信的接收缓冲区参数,仅在根进程上会被读写,非根进程传入的对应参数不会被访问 MPI_BOTTOM是MPI标准定义的全局地址常量,所有主流MPI实现(MPICH、OpenMPI、Intel MPI等)都原生支持,不需要额外声明变量- 你的代码可以简化为单条调用,不需要分支判断:
call MPI_REDUCE(var_to_be_summed, merge(buffer, MPI_BOTTOM, rank==root), 1, MPI_REAL, MPI_SUM, root, MPI_COMM_WORLD, err)
如果不习惯用merge语法,保留分支判断直接把dummy替换成MPI_BOTTOM也可以,完全兼容。
方案2:直接复用发送缓冲区作为占位
因为非根进程的接收缓冲区不会被访问,你也可以直接把发送缓冲区的地址重复传入接收缓冲区参数的位置,连常量都不需要用:
call MPI_REDUCE(var_to_be_summed, merge(buffer, var_to_be_summed, rank==root), 1, MPI_REAL, MPI_SUM, root, MPI_COMM_WORLD, err)
这种写法同样符合标准,可移植性拉满。
额外说明
你原本使用dummy变量的写法也是完全符合MPI标准的,只是相比上面两种方案多了一行变量声明的冗余代码而已,没有正确性问题。
内容的提问来源于stack exchange,提问作者zufall
相关产品推荐
相关产品推荐

