Julia 1.0中的慢速(重复)矩阵乘法

问题描述 投票:0回答:1

我的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我们想要通过矩阵向量积更新第一维(乘以一些标量)。 weightMatrixsize(phi,1)的大小size(phi,1)矩阵(未来可能很稀疏)。一切都发生在floats

Julia分配了大量内存,即使一切都应该到位(至少我希望如此)。我已阅读julia文档并发现view但无法使用它。我怎样才能加速这个计算?

performance julia matrix-multiplication
1个回答
6
投票
  • 在r.h.s.上切片(phi[:,i,j])任务总是分配。正如你所说,你可以使用视图(它们还没有完全免费分配),这应该可以加快速度。下面我使用@views宏来替换视图中的所有切片。
  • 您的+=操作也分配。 a += b基本上是a = a + b,它将为a+b分配一个数组,然后分配给它。它不是就地的。要使其就地,您需要添加一个点:a .+= b
  • 代码运行后,您可以添加@inbounds以在访问多个数组时关闭绑定检查。

总的来说,请尝试以下方法:

    @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):

    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

最后,让我给你一些很好的解读:

免责声明:我没有测试任何这个,但只是在文本编辑器中写下来,所以它可能包含琐碎的拼写错误或类似的。尽管如此,我希望它能够展示一些问题并提供帮助!

© www.soinside.com 2019 - 2024. All rights reserved.