为什么简单的矩阵乘法会在 Julia 中占用如此多的垃圾收集器时间?
Why does simple matrix multiplication occupy so much garbage collector time in Julia?
我有两个较大的矩阵 D (4096 x 40) 和 W (40 x 2800)。
当我使用 @time R = D*W
时,会给出以下统计数据:
38.449856 seconds (1.40 G allocations: 20.932 GiB, 55.88% gc time)
55.88% 的 gc 时间让我震惊。必须有更好的方法来进行这种简单的矩阵计算。对这个 Julia 新手有什么想法吗?
问题是您也在测量编译。如果你之前 运行 任何其他矩阵乘法,你会看到结果快 10 倍,分配很少
您需要提供有关如何生成 D
和 W
(或至少它们的类型)的更多信息。
这是我得到的:
julia> D = rand(4096, 40); W = rand(40, 2800);
julia> @time R = D * W;
0.081237 seconds (7 allocations: 87.500 MiB, 6.74% gc time)
我没想到这是类型问题。在我的代码中,D 矩阵是 Array{Float64,2}
,W 是 Array{Real,2}
。
从实数到浮点数的转换结果如下:
0.024569 seconds (6 allocations: 87.500 MiB, 36.84% gc time)
进步很大!
我有两个较大的矩阵 D (4096 x 40) 和 W (40 x 2800)。
当我使用 @time R = D*W
时,会给出以下统计数据:
38.449856 seconds (1.40 G allocations: 20.932 GiB, 55.88% gc time)
55.88% 的 gc 时间让我震惊。必须有更好的方法来进行这种简单的矩阵计算。对这个 Julia 新手有什么想法吗?
问题是您也在测量编译。如果你之前 运行 任何其他矩阵乘法,你会看到结果快 10 倍,分配很少
您需要提供有关如何生成 D
和 W
(或至少它们的类型)的更多信息。
这是我得到的:
julia> D = rand(4096, 40); W = rand(40, 2800);
julia> @time R = D * W;
0.081237 seconds (7 allocations: 87.500 MiB, 6.74% gc time)
我没想到这是类型问题。在我的代码中,D 矩阵是 Array{Float64,2}
,W 是 Array{Real,2}
。
从实数到浮点数的转换结果如下:
0.024569 seconds (6 allocations: 87.500 MiB, 36.84% gc time)
进步很大!