【发布时间】:2014-08-24 18:55:53
【问题描述】:
我正在使用英特尔 MKL 的 ?GEMM 函数来乘以矩阵。考虑以下两个矩阵乘法:
cblas_?gemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, m,n,k,
1.0,
Matrix1,k,
Matrix2,n,
0.0,
A,n);
其中 m=1E5,n=1E4,k=5。当我使用 pca_dgemm 和 pca_sgemm 时,它使用了所有 12 个内核,并且执行得很漂亮。
但是,当我执行以下矩阵乘法时:
cblas_?gemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, m,l,n,
1.0,
A,n,
Ran,l,
0.0,
Q,l);
其中 m=1E5、n=1E5 和 l=7(请注意,传递参数的顺序是不同的。这是 (m,n) * (n,l))。 pca_dgemm 使用了全部 12 个内核并且执行得很漂亮。
但是,pca_sgemm 没有。它只使用 1 个核心,当然,需要更长的时间。当然,对于 sgemm 我使用浮点数组,而对于 dgemm 我使用双精度数组。
为什么会这样?他们都给出了准确的结果,但 sgemm 只在前者上多线程,而 dgemm 多线程和两者!简单地更改数据类型怎么会产生这种差异?
请注意,所有数组都是使用 mkl_malloc 分配的,对齐方式为 64。
编辑 2:还请注意,当 l=12 时,换句话说,对于更大的矩阵,它会穿入 sgemm。换句话说,很明显 sgemm 版本需要更大的矩阵来并行化,而 dgemm 没有这个要求。这是为什么呢?
【问题讨论】:
标签: c++ c multithreading blas intel-mkl