gpt4 book ai didi

memory-management - 使用 Julia 更新运算符进行不必要的分配

转载 作者:行者123 更新时间:2023-12-04 06:36:49 25 4
gpt4 key购买 nike

考虑以下函数:

function mytest(x, b)
y = zeros(x[:,:,1])
for i in 1:length(b)
y += b[i] * x[:,:,i]
end
return y
end

当我运行它时,我得到以下信息:
x = rand(30,30,100000)
b = rand(100000)
@time mytest(x,b)

elapsed time: 0.571765222 seconds (727837732 bytes allocated, 66.49% gc time)

为什么要分配这么多内存并花费这么多时间进行垃圾收集?代码应该是类型稳定的,我希望 +=运算符(operator)不执行重新分配。但是,似乎每次添加两个矩阵时都会重新分配。

我应该认为这是 Julia 中的一个错误吗?更重要的是,如何以不重新分配的方式编写此代码?

编辑:固定错字。

最佳答案

@cd98 请求我的三嵌套循环解决方案,它解决了分配问题,但我认为它的性能会低于等效的矢量化版本。这里是:

function mytest(x, b)
d1, d2, d3 = size(x)
y = zeros(eltype(x), d1, d2)
for i in 1:d3
for j in 1:d2
for k in 1:d1
y[k,j] += b[i] * x[k,j,i]
end
end
end
return y
end

x = rand(30,30,100000)
b = rand(100000)
@time mytest(x,b)
@time mytest(x,b)

和输出:
elapsed time: 0.218220119 seconds (767172 bytes allocated)
elapsed time: 0.197181799 seconds (7400 bytes allocated)

关于memory-management - 使用 Julia 更新运算符进行不必要的分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27154758/

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