我的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
但无法使用它。我怎样才能加速这个计算?
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
最后,让我给你一些很好的解读:
免责声明:我没有测试任何这个,但只是在文本编辑器中写下来,所以它可能包含琐碎的拼写错误或类似的。尽管如此,我希望它能够展示一些问题并提供帮助!