Fortran 中的 if 或函数指针

2023-11-29

因为这在 Fortran 中很常见,所以我正在编写一个大规模并行的科学代码。在代码的开头,我阅读了配置文件,它告诉我要使用哪种类型的求解器。现在这意味着在子程序中(在主运行期间)我有

if(solver.eq.1)then
  call solver1()
elseif(solver.eq.2)then
  call solver2()
else
  call solver3()
endif

编辑以避免一些混乱:这个 if 位于我的时间积分循环内,并且我有一个位于 3 个嵌套循环内。

现在我的问题是,使用函数指针作为替代不是更有效吗?solver除初始化过程外,变量在执行期间不会改变。

显然函数指针是F2003。只要我使用 gfortran 4.6,这就不成问题。但我主要使用 BlueGene P,有一个 f2003 编译器,所以我想它也能在那里工作,尽管我在网上找不到任何确凿的证据。


对 Fortran 一无所知,这就是我的答案:分支的主要问题是 CPU 可能无法推测性地跨它们执行代码。为了缓解这个问题,引入了分支预测(这在现代 CPU 中非常复杂)。

通过函数指针的间接调用可能会给 CPU 的预测单元带来问题。如果它无法预测调用实际会去哪里,这将导致管道停顿。

我非常确定 CPU 会正确预测您的分支将始终被采用或不被采用,因为这是一个简单的预测情况。

也许 CPU 可以通过间接调用进行推测,也许不能。这就是为什么你需要test哪个更好。

如果不能,您肯定会在基准测试中注意到。

此外,也许您可​​以将 if 测试从内部循环中移出,这样就不会经常调用它。这将使分支的实际性能变得无关紧要。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fortran 中的 if 或函数指针 的相关文章

随机推荐