gpt4 book ai didi

fortran - 如何在保持兼容性的同时从 mpif.h 切换到 fortran 中的 mpi_f08?

转载 作者:行者123 更新时间:2023-12-05 05:51:19 25 4
gpt4 key购买 nike

我正在研究用 Fortran 编写的数值求解器,它使用 MPI 在大型集群(最多约 500 个进程)上进行并行化。目前我们通过

包括mpi
#include "mpif.h"

根据我的理解,它已被弃用并且强烈建议不要使用。为了现代化和清理我们的 mpi 通信,我们想切换到使用更现代的 mpi_f08 模块。我们面临的问题是,我们需要保持基于旧 mpi header 编译版本的可能性,以免破坏与另一个求解器的耦合。我非常感谢关于如何优雅地保持这种兼容性的一些建议。

问题 #1:在不让 #ifdef 语句散布在整个代码中的情况下,包含 header 或根据预处理器标志使用模块的优雅方法是什么?

到目前为止我的想法是定义一个模块

module mpi_module
#ifdef MPI_LEGACY
#include "mpif.h"
#else
use mpi_f08
#endif
end module

并在当前包含 mpi 头文件的任何地方使用此模块。这是一种可行的方法还是会产生我目前忽略的任何不良影响?

问题 #2:根据预处理器标志在整数和 mpi_f08 的新派生类型之间切换的优雅方法是什么? (同样,不要在整个代码中散布 #ifdef 语句)

我最初的想法是使用类似的东西

#ifdef MPI_LEGACY
#define _mpiOp_ integer
#else
#define _mpiOp_ type(MPI_Op)
#endif

这样我就可以简单地替换

integer :: OP

通过

_mpiOp_ :: OP

获得与包含 MPI 的两种方式的兼容性。我对这个解决方案也不太满意,因为据我所知,您不能将这些类型的预处理器定义放入模块中。因此,您最终会得到一个模块加上一个头文件,您必须记住每次都将它们包含在一起。再次感谢您指出此方法的任何潜在缺陷以及您可以指出的任何替代方法。

抱歉发了这么长的帖子,但我想尽可能清楚地表达我的想法。我期待着您的意见!

最佳答案

新旧方式差别太大了。对于 Op,您不仅有一个 use 语句而不是 include 语句和一个派生的而不是一个整数。许多例程将具有不同的签名并使用不同的类型。

所以我担心答案是没有优雅的方式。您正在将两种截然不同的东西组合在一起,而无法优雅地结合起来。

正如评论中提到的,获得更现代的第一步是使用mpi而不是include "mpif.h"。这已经使编译器能够在例程调用不正确时捕获多种错误。这些检查的可能范围取决于 MPI 库配置的细节。即,生成的通用接口(interface)的范围而不仅仅是外部语句。

如果您必须将您的代码与另一个使用旧方法的代码结合起来,那么首先执行 use mpi 是很有意义的,看看它是如何进行的,并考虑是否有进一步的意义.

关于fortran - 如何在保持兼容性的同时从 mpif.h 切换到 fortran 中的 mpi_f08?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70402013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com