【问题标题】:Function pointers in fortranfortran 中的函数指针
【发布时间】:2013-05-21 10:10:09
【问题描述】:

在 Fortran 中可以有函数指针吗?现在我有一个这样的代码:

subroutine flag(iflag,a,b)

integer n, a, b, ii, iflag

do ii = 1, n
     if (iflag.eq.0) a+b
     else a-b  
end do    

return
end

变量“n”有一个巨大的价值,所以要运行这段代码,我觉得我在“if”命令上浪费了很多时间。是否可以编写函数指针之类的东西(我不确定我的意思),以便在代码中执行以下操作:

subroutine flag(iflag,a,b)

*depending on the iflag the subroutine flag is automatically 
precompiled to call either flag_plus or flag_minus*     

return
end

subroutine flag_plus(a,b)

integer n, a, b, ii

do ii = 1, n
     a+b
end do    

return
end

subroutine flag_minus(a,b)

integer n, a, b, ii

do ii = 1, n
     a-b  
end do    

return
end

如果可能的话,我可以通过避免“if”循环来节省大量时间。这样的事情远程可能吗?

【问题讨论】:

  • 您不必将return 放入每个end。子程序还能做什么其他事情然后返回?同样对于 Fortran 77,代码通常应为大写。

标签: fortran fortran77


【解决方案1】:

在 Fortran 77 中,您可以使用有限的函数指针变体,即您可以将一个过程的名称作为参数传递给另一个过程(本质上是一个函数指针)。但是,您不能拥有一个包含过程地址的变量,然后“调用”该变量。

从 Fortran 2003 开始​​,过程指针变量是语言的一部分。

话虽如此,我认为您的示例问题可以通过类似的方式更轻松地解决


if (iflag == 0) then  ! Why is iflag not of type logical?
  do ii = 1, n
    a + b
  end do
else
  do ii = 1, n
    a - b
  end do
end if

确保对其进行分析以查看它是否也有任何影响。现代 CPU 具有非常好的分支预测器,并且在整个循环期间不会改变的分支测试几乎是最好的情况(经验法则:预测的分支接近空闲)。哎呀,您的编译器甚至可以进行上述优化..

【讨论】:

  • 在问题中,a+ba-b 都不是语法结构良好的 Fortran 语句。
  • @HighPerformanceMark:是的,我知道。我认为他们是明智之举的替身。
  • 感谢您的回复。我没有想到这个明显的答案。我会检查分析。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 2014-07-24
  • 2015-03-02
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多