在乘以大矩阵(比如A和B,A.dot(B))时,numpy通过计算B的转置并使用行方式乘法来使用空间局部性,或者它是否在列中访问B的元素明智的时尚会导致许多缓存未命中。我观察到当我运行同一程序的多个实例时,内存带宽正成为瓶颈。例如,如果我运行4个独立的程序实例,它在20核机器上进行矩阵乘法(对于大型矩阵),我只能看到2.3倍的加速。
答案 0 :(得分:1)
Numpy dot在Session
中实现为multiarraymodule.c
。它实际使用的实施取决于许多因素。
如果你有numpy链接到BLAS实现,你的dtypes都是double,cdouble,float或cfloat,你的数组各有2个或更少的维度,然后numpy将数组移交给BLAS实现。做什么取决于您正在使用的包裹。
否则,不,它不会这样做。但是,至少在我的机器上,使用转置和einsum这样做(或者只是一般的点积)比使用点慢十倍,因为dot推送到BLAS。