为什么简单的矩阵乘法会在 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 倍,分配很少

您需要提供有关如何生成 DW(或至少它们的类型)的更多信息。

这是我得到的:

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)

进步很大!