gpt4 book ai didi

julia - 为什么这个去矢量化的 Julia 代码速度慢了 20 倍以上?

转载 作者:行者123 更新时间:2023-12-02 00:42:59 26 4
gpt4 key购买 nike

我认为在 Julia 中(与 R 或 Matlab 不同)去矢量化代码通常比矢量化代码更快。但我认为情况并非如此。这是一个例子:

julia> x = Float64[1:10000000];

julia> y = Array(Float64, length(x));

julia> @time for i = 1:length(x) y[i] = exp(x[i]) end;
elapsed time: 7.014107314 seconds (959983704 bytes allocated, 25.39% gc time)

julia> @time y = exp(x);
elapsed time: 0.364695612 seconds (80000128 bytes allocated)

为什么矢量化代码速度这么快?看起来去矢量化代码分配的内存是原来的 10 倍多。但实际上只需要分配几个字节来对任意数量的 float 求幂。有没有办法编写去矢量化代码,使其不分配太多内存,从而比矢量化代码运行得更快?

谢谢!

最佳答案

考虑以下代码片段:

x = Float64[1:10000000];
y = Array(Float64, length(x));
function nonglobal_devec!(x,y)
for i = 1:length(x) y[i] = exp(x[i]) end
end
function nonglobal_vec(x)
exp(x)
end
@time nonglobal_devec!(x,y);
@time y = nonglobal_vec(x);
x = Float64[1:10000000];
y = Array(Float64, length(x));
@time for i = 1:length(x) y[i] = exp(x[i]) end
@time y = exp(x)

给出时间

A: elapsed time: 0.072701108 seconds (115508 bytes allocated)
B: elapsed time: 0.074584697 seconds (80201532 bytes allocated)
C: elapsed time: 2.029597656 seconds (959990464 bytes allocated, 22.86% gc time)
D: elapsed time: 0.058509661 seconds (80000128 bytes allocated)

奇怪的 C 是 due to it operating in the global scope ,其中类型推断不起作用,并且生成速度较慢的代码。

由于函数在第一次使用时被编译,A 和 B 之间的相对时间会受到一些变化的影响。如果我们再次运行它,我们会得到

A2: elapsed time: 0.038542212 seconds (80 bytes allocated)
B2: elapsed time: 0.063630172 seconds (80000128 bytes allocated)

这是有道理的,因为 A2 不分配内存(80 字节用于函数的返回值),并且 B2 创建一个新向量。另请注意,B2 分配的内存量与 D 相同 - 第一次分配的额外内存用于编译。

最后,去矢量化与矢量化是根据具体情况而定的。例如,如果您使用 for 循环简单地实现了矩阵乘法,并且没有缓存感知,则可能会比使用使用 BLAS 的矢量化 A*b 慢得多。

关于julia - 为什么这个去矢量化的 Julia 代码速度慢了 20 倍以上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27673278/

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