我通过用(Fortran)英特尔 MKL 子例程替换维基百科示例中的线性代数子例程,在 FORTRAN 中实现了共轭梯度。(仅限 DGEMV、DAXPY 和 DNRM。事实证明 a=b 比 DCOPY 快,a=2*a 比 DSCAL 快)
答案是正确的,执行没有问题。但是,当我将其编译为ifort CG.f90 -mkl
结果时:
MKL_SET_DYNAMIC = 真;140 秒
MKL_SET_DYNAMIC = 假,MKL_SET_NUM_THREADS=1;70 秒。
MKL_SET_DYNAMIC = FALSE,MKL_SET_NUM_THREADS=2;约 100 秒。
几点:
- 我通过超线程有 2 个真实内核和 2 个虚拟内核。我不想在 2 核机器上运行 16 个线程。
- 分析产生了对 a 的深奥参考
M16_LAY_GAS16
,经过大量搜索后归结为multpd
ASM。否则没有任何有用的东西出来(或者也许,我不知道在哪里看) FWIW,我使用了 VTune。 - 问题规模不小。上述示例适用于与我的 RAM 大小成比例的矩阵大小(我的 4 GB 系统大约为 13k x 13k)。
KMP_AFFINITY
在串行情况下将一个线程映射到一个处理器,将 2 个线程并行映射到 2 个处理器。
我的问题是:如果 MKL_DYNAMIC 不是最佳设置,为什么不将线程数设置为 1?如果相同的工作(在更短的时间内)由 1 人完成,我不一定需要使用 2 个线程。
我做错了什么还是英特尔 MKL 有什么问题?