gpt4 book ai didi

performance - Julia 1.0 中的缓慢(重复)矩阵乘法

转载 作者:行者123 更新时间:2023-12-05 09:15:28 25 4
gpt4 key购买 nike

我的 Julia 代码中的以下部分破坏了我的所有性能:

        for j = 1:size(phi,3)
for i = 1:size(phi,2)
phi[:,i,j] += dt*convolutionmagnitude*
weightMatrix*phi[:,i,j]
end
end

phi 是一个三张量,对于每个 ij,我们希望通过矩阵向量乘积(乘以一些标量)来更新第一个维度). weightMatrix 是一个大小为 size(phi,1) 乘以 size(phi,1) 的矩阵(将来可能是稀疏的)。一切都发生在 floats 上。

Julia 分配了大量内存,即使一切都应该正常工作(至少我预计如此)。我已经通读了 julia 文档并找到了 view 但无法使用它。我怎样才能加速这个计算?

最佳答案

  • 切片 (phi[:,i,j]) 在 r.h.s.任务总是分配。正如您所说,您可以使用 View (它们也不是完全免费分配的(还)),这应该会加快速度。下面我使用 @views 宏,它用 View 替换所有切片。

  • 您的 += 操作也会进行分配。 a += b 基本上是 a = a + b ,它将为 a+b 分配一个数组,然后将 a 分配给它。它不在原地。要使其就位,您需要添加一个点:a .+= b

  • 代码运行后,您可以添加 @inbounds 以在访问数组片段时关闭绑定(bind)检查。

总的来说,尝试以下操作:

    @inbounds @views for j = 1:size(phi,3)
for i = 1:size(phi,2)
phi[:,i,j] .+= dt .* convolutionmagnitude .* weightMatrix * phi[:,i,j]
end
end

请注意,这仍然会进行分配,因为它会为 weightMatrix * phi[:,i,j] 创建一个中间向量。你不能在这里放一个点,因为这意味着逐元素乘法而不是矩阵向量乘法。但是,您可以使用 mul!(这里假设 Julia >0.7)重用一 block 预分配的内存:

    using LinearAlgebra # get mul!

tmp = similar(phi[:,1,1])
@inbounds @views for j = 1:size(phi,3)
for i = 1:size(phi,2)
mul!(tmp, weightMatrix, phi[:,i,j])
phi[:,i,j] .+= dt .* convolutionmagnitude .* tmp
end
end

最后,让我给你一些关于这个的精彩读物:

免责声明:我没有对此进行任何测试,只是在此处的文本编辑器中将其记录下来,因此它可能包含琐碎的拼写错误或类似错误。尽管如此,我希望它能说明一些问题并有所帮助!

关于performance - Julia 1.0 中的缓慢(重复)矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52365510/

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