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

时间:2018-09-17 10:19:09

标签: performance julia matrix-multiplication

我的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,但无法使用它。如何加快计算速度?

1 个答案:

答案 0 :(得分:6)

    r.h.s上的
  • 切片(phi[:,i,j])。分配总是分配。正如您所说的,您可以使用视图(视图也不是完全免费的(尚未分配)),这样可以加快处理速度。下面,我使用@views宏,该宏将所有切片替换为视图。

  • 您的+=操作也会分配。 a += b基本上是a = a + b,它将为a+b分配一个数组,然后为其分配a。它不在原位。要使其就位,您需要添加一个点: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

最后,让我为您提供一些不错的阅读材料:

免责声明:我没有测试过任何一个,只是在这里的文本编辑器中写下了它,因此它可能包含一些琐碎的错别字或类似内容。尽管如此,我希望它能说明一些问题并有所帮助!