【发布时间】:2021-08-07 10:14:57
【问题描述】:
我在几个地方读到 Julia 代码的性能(在某些条件下)可以与 Fortran 的性能进行比较。我在 Julia 中编写了以下代码:
Pi = 3.141592653589793238462643
n = 100000
function integration_2d(n,Pi,sum)
h = Pi/n
for i=1:n
x = h*(i-0.5)
for j=1:n
y = h*(j-0.5)
sum = sum + cos(x + y)
end
end
sum*h*h
end
平均执行时间为 180 秒。与使用-O3 选项编译的Fortran 代码相比,结构非常接近的Fortran 代码的执行时间为0.013 秒。我想知道 Julia 代码在哪里失去性能,任何评论都值得赞赏。谢谢。
【问题讨论】:
-
对于这样的声明,最好知道 1) 用于比较的 Fortran 版本,以及 2) 您如何对此进行基准测试的代码。
-
您正在计算
cos的总数为 100000^2 = 10^10 次。您声称在 Fortran 中这需要 0.013 秒。这意味着每个余弦评估需要 1.3*10^(-12) 秒。 CPU 可以在每纳秒 10^(-9) 秒内执行非常近似的一次操作。很明显,Fortran 代码并没有完成您认为它在运行时所做的工作。对于基准测试来说,这是一个持续存在的危险。你必须确保你测量的是你认为你正在测量的东西。 -
顺便说一句,不需要手动定义
Pi,因为pi已经是Julia的内置常量了。 -
Fortran 编译器是否有可能使用 O3 优化重新排列代码,天真地编写为 O(N^2),类似于 @Vitality 发布的 O(N) 代码?如果是这样,Julia 是否可以实现同样的优化?
-
嗨,这是我在 Fortran 代码中犯的一个错误。我收集了部分金额,但没有打印出结果。因此,编译器忽略了整个计算。
标签: julia