我的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
是一个三张量,对于每个i
,j
,我们要通过矩阵向量乘积(乘以标量)来更新第一维。 weightMatrix
是size(phi,1)
乘以size(phi,1)
大小的矩阵(将来可能会稀疏)。一切都发生在floats
上。
Julia会分配很多内存,即使一切都可以正常工作(至少我希望如此)。我通读了julia文档,发现view
,但无法使用它。如何加快计算速度?
答案 0 :(得分:6)
切片(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
最后,让我为您提供一些不错的阅读材料:
免责声明:我没有测试过任何一个,只是在这里的文本编辑器中写下了它,因此它可能包含一些琐碎的错别字或类似内容。尽管如此,我希望它能说明一些问题并有所帮助!