以下功能在我的程序中使用最多。
CONTAINS SUBROUTINE Delta4(R,Del) REAL(DP),DIMENSION(:),INTENT(IN):: R. REAL(DP),DIMENSION(:),INTENT(OUT):: Del …
IMO在这个函数上几乎没有什么可以获得的,这本质上是一堆算术运算。
你可以吸收 *0.125_dp 在其他常数中。
*0.125_dp
更好,你可以将计算重写为(伪代码)
ar= 1 + 2 * ((ar > 1) - ar) Del= (2 + ar + sqrt(1 - ar * ar)) * 0.125
这假设是隐式转换 .false. 至 0 和 .true. 至 1 ,这可能不适合您的编译器。希望它被编译为无分支。
.false.
0
.true.
1
由于向量长度只有四个,你可以完全展开循环(但编译器可能已经完成了)。
我的赌注是不会产生明显的差异。
要提高性能,您应该从更全局的角度审查代码,并考虑并行化。
的 更新: 强>
正如@kvantour指出的那样,我放弃了符号的变化。我们可以解决
i= 2 * (ar > 1) - 1 ar= i + 2 * (1 - ar) Del= (2 + ar + i * sqrt(1 - ar * ar)) * 0.125
或者,
i= SIGN(1, ar - 1)
如果事实证明是有效的。