gpt4 book ai didi

julia - 在 Julia 中使用 `\` 而不是 `/`

转载 作者:行者123 更新时间:2023-12-02 02:29:35 25 4
gpt4 key购买 nike

对于标量,\(求解线性系统)运算符相当于除法运算符/。性能相似吗?

我问是因为目前我的代码有一行像

x = (1 / alpha) * averylongfunctionname(input1, input2, input3)

从视觉上看,除以 alpha 发生在“左边”很重要,因此我正在考虑将其替换为

x = alpha \ averylongfunctionname(input1, input2, input3)

从风格和性能的角度来看,这种情况下的最佳实践是什么?

以下是一些令人困惑的基准测试结果:

julia> using BenchmarkTools
[ Info: Precompiling BenchmarkTools [6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf]

julia> @btime x[1]\sum(x) setup=(x=rand(100))
15.014 ns (0 allocations: 0 bytes)
56.23358979466163

julia> @btime (1/x[1]) * sum(x) setup=(x=rand(100))
13.312 ns (0 allocations: 0 bytes)
257.4552413802698

julia> @btime sum(x)/x[1] setup=(x=rand(100))
14.929 ns (0 allocations: 0 bytes)
46.25209548841374

它们都差不多,但令我惊讶的是 (1/x) * foo 方法具有最佳性能。

最佳答案

标量/\确实应该具有相同的含义和性能。让我们定义这两个测试函数:

f(a, b) = a / b
g(a, b) = b \ a

然后我们可以看到它们生成相同的 LLVM 代码:

julia> @code_llvm f(1.5, 2.5)
; @ REPL[29]:1 within `f'
define double @julia_f_380(double %0, double %1) {
top:
; ┌ @ float.jl:335 within `/'
%2 = fdiv double %0, %1
; └
ret double %2
}

julia> @code_llvm g(1.5, 2.5)
; @ REPL[30]:1 within `g'
define double @julia_g_382(double %0, double %1) {
top:
; ┌ @ operators.jl:579 within `\'
; │┌ @ float.jl:335 within `/'
%2 = fdiv double %0, %1
; └└
ret double %2
}

也有相同的机器代码。我不确定是什么导致了 @btime 结果的差异,但我很确定 /\ 之间的差异是这是一种幻觉,而不是真实的。

至于x*(1/y),它的计算结果与x/y不同:由于进行了舍入,它可能不太准确计算 1/y 时,然后将该舍入值乘以 x,这也会四舍五入。例如:

julia> 17/0.7
24.28571428571429

julia> 17*(1/0.7)
24.285714285714285

由于浮点除法可以保证正确舍入,因此直接进行除法总是会更准确。然而,如果除数被很多循环迭代共享,您可以通过像这样重写计算来获得加速,因为浮点乘法通常比除法更快(尽管我当前的计算机没有显示这一点)。但是请注意,这会损失准确性,并且如果不共享除数,仍然会损失准确性并且不会获得性能提升。

关于julia - 在 Julia 中使用 `\` 而不是 `/`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65261201/

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