0

我通过用(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 秒。

几点:

  1. 我通过超线程有 2 个真实内核和 2 个虚拟内核。我不想在 2 核机器上运行 16 个线程。
  2. 分析产生了对 a 的深奥参考M16_LAY_GAS16,经过大量搜索后归结为multpdASM。否则没有任何有用的东西出来(或者也许,我不知道在哪里看) FWIW,我使用了 VTune。
  3. 问题规模不小。上述示例适用于与我的 RAM 大小成比例的矩阵大小(我的 4 GB 系统大约为 13k x 13k)。
  4. KMP_AFFINITY在串行情况下将一个线程映射到一个处理器,将 2 个线程并行映射到 2 个处理器。

我的问题是:如果 MKL_DYNAMIC 不是最佳设置,为什么不将线程数设置为 1?如果相同的工作(在更短的时间内)由 1 人完成,我不一定需要使用 2 个线程。

我做错了什么还是英特尔 MKL 有什么问题?

4

1 回答 1

3

MKL_DYNAMIC在功能上与OMP_DYNAMIC/omp_set_dynamic()来自 OpenMP 标准相同。

这并不意味着“神奇地改变线程数以尽可能快地运行代码”。这意味着在某些情况下,运行时可以从用户指定的值或系统默认值更改线程数,如果有系统资源或其他实现特定的原因需要这样做。鉴于您没有指定线程数并且有 4 个并发硬件线程可用,我猜您的MKL_SET_DYNAMIC = TRUE情况是使用四个线程。

如果您运行类似的东西,MKL_SET_DYNAMIC=TRUE MKL_SET_NUM_THREADS=16可能会发现运行时将线程计数限制为 4,并且性能会比 更好MKL_SET_DYNAMIC=FALSE MKL_SET_NUM_THREADS=16,因为运行时可能会检测到您要求的数量超过了可用的并发硬件线程数。但这就是我所期望的。

于 2012-04-16T05:18:47.677 回答