gpt4 book ai didi

performance - Fortran 中的 If 或函数指针

转载 作者:行者123 更新时间:2023-12-04 16:04:54 25 4
gpt4 key购买 nike

因为它在 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 可以推测间接调用,也许不能。这就是为什么您需要测试哪个更好。

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

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

关于performance - Fortran 中的 If 或函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9829330/

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