【问题标题】:Slow (repeated) Matrix Multiplication in Julia 1.0Julia 1.0 中的慢(重复)矩阵乘法
【发布时间】:2018-09-17 10:19:09
【问题描述】:

我的 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) by size(phi,1) 的矩阵(将来可能会稀疏)。一切都发生在floats

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

【问题讨论】:

  • 如果您提供一个自包含的最小工作示例,则更容易提供帮助。这意味着您应该添加输入数据并提供一个代码示例,您可以简单地将其复制粘贴到终端中,然后它会立即运行。
  • 作为一个现在不清楚的例子:为什么dt*convolutionmagnitude 没有合并到weightMatrix 中?并且:weightMatrix 的大小是多少?获得这些问题的答案可能会使您的代码速度提高一个或几个数量级!
  • @DNF,感谢您的提示。我以后一定会考虑的!对于第二部分:因为 dtconvolutionmagnitude 可能会因时间步长而异,而 weightMatrix 是固定的。
  • 如果你现在已经考虑过了,可能会比你已经得到的答案提高性能:) 例如,如果weightMatrix 的大小总是3x3,或者其他一些小的固定数字,您可以使用 StaticArrays 显着加快速度。
  • 可悲的是,它更多的是在 100-200 乘以 100-200 的范围内,据我了解,StaticArrays 不是最佳选择

标签: performance julia matrix-multiplication


【解决方案1】:
  • 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

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

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

【讨论】:

  • 谢谢!特别是点部分在加速计算方面做得很好。我会看看参考资料。
  • 由于 v1.0 上的逃逸分析,那里的视图应该是免分配的。
猜你喜欢
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 2020-09-08
  • 1970-01-01
相关资源
最近更新 更多