来自Julia Discourse的问题。
我正在使用 Julia 1.2。这是我的测试:
a = rand(1000, 1000)
b = adjoint(a)
c = copy(b)
@btime a * x setup=(x=rand(1000)) # 114.757 μs
@btime b * x setup=(x=rand(1000)) # 94.179 μs
@btime c * x setup=(x=rand(1000)) # 110.325 μs
我原本期望a和c至少不会变慢。
检查了stdlib/LinearAlgebra/src/matmul.jl之后,发现Julia将b.parent(即a)传递给BLAS.gemv,而不是b,并且将LAPACK的dgemv_切换到了另一种显然更快的模式。
如果我的假设正确,速度提升是否源于内存以更有利的方式对齐,以便于dgemv_在trans = T模式下进行操作?如果是这样,那么我猜除了可能在文档中提到这个陷阱之外,没有别的可做的。如果我的假设是错误的,那么有什么可以做的吗?