因为这在 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(使用前将#替换为@)