Mathnet Numerics with Intel MKL 运行 在 Intel Xeon Gold 上比旧的 i7-7700HQ 笔记本电脑慢得多

Mathnet Numerics with Intel MKL running much slower on Intel Xeon Gold than an old i7-7700HQ laptop

我有几个函数使用 MathNet Numerics + Intel MKL 提供程序进行矩阵计算。矩阵不是太大,大约40x100,运算涉及一些伪逆、特征值和类似的线性代数东西。

然而,创建了一个小型基准测试应用程序来 运行 计算 1000 次,结果表明我们新的 Intel Xeon Gold 6226R(16 核,32 线程)运行s 计算比我的旧 i7 7700HQ(4 核、8 线程)笔记本电脑慢 2 倍,而且比我可以测试的基本上所有 5-6 岁的 PC 都慢。

我已经尝试过“原生英特尔 MKL”和“托管”多线程提供程序。 MKL 是 ~2x ,而托管的可能快 10%。

此外,当 运行在我的 i7 笔记本电脑上进行测试时,我得到了约 80% CPU 的利用率,并且它 运行 的频率约为 3.5GHz。但是 Xeon 将频率降低到 ~2GHz 左右,然后使用 ~30-40% 的利用率。笔记本电脑 (Windows 10) 和服务器 (Windows Server 2019) 都设置为高性能模式。

我很确定这里应该有我遗漏的一些技巧?

(更新)

如果有人遇到同样的问题,可以通过设置 MKL_ENABLE_INSTRUCTIONS 环境来禁用 AVX512。变量为 AVX2。这会在 Xeon 上稍微加快 MKL:

SET MKL_ENABLE_INSTRUCTIONS=AVX2

但这仍然不如 i7 快。

如果我禁用 MKL 并使用 MathNet Numerics 托管提供程序,然后还并行使用 Parallel.For 循环到 运行,那么 Xeon 可以击败 i7 的唯一方法。在这种情况下,Xeon 快了约 30%,尽管不可否认它的 CPU 使用率仍然没有超过 40%(i7 CPU 已达到极限)。

考虑到它提供了多少额外的核心,仍然有点令人失望。

很多小矩阵可能意味着如果不手动矢量化(不仅仅是在一次调用 MKL 函数中)就很难扩展到很多内核,所以这可以解释 32 对 8 逻辑内核机器的利用率。 2GHz 可能是该芯片上的最大 AVX-512 频率,您必须检查它以及 MKL 是否正在使用它。 (SIMD instructions lowering CPU frequency)。 512 位向量可能是行或列大小的奇数倍,可能不是很好。

您的 Kaby Lake 每个时钟可以 运行 2x 256 位 FMA,并且具有与 Xeon Gold (Skylake) 相同的微架构(每个内核内部),除了 AVX-512 和 256k L2 而不是1MiB。 Xeon Gold 6226R 确实有 2 个 512 位 FMA 单元(与某些 Xeon-SP 芯片不同),因此每个内核每个时钟的 FLOPS 能够达到两倍 if 它可以让它们继续工作.

英特尔在推出新微架构的服务器版本方面总是至少落后几个月,并且由于他们的 10nm 生产问题,直到今年 Ice-Lake Xeons,我们才拥有真正新的服务器微架构。 Cascade Lake 只是 Skylake-X 上的效率优化(功率/时钟),因此它仍然与至少从 Skylake 到 Coffee Lake 的客户端芯片具有相同的内核,除了 AVX-512(及其不同的扩展)和那些更大的 L2缓存。


但是,如果您的工作负载主要不受每核 FMA 吞吐量的限制,并且受限于其他操作(如 FP 除法)的吞吐量,那么您的 Kaby Lake 每时钟速度更快是完全正常的,并且它时钟更高。

此外,“客户端”芯片(如您的笔记本电脑)的内核间延迟低于大型 Xeons 上的网状互连,如果 MKL 尝试并行化几乎不值得的问题,这可能会减少小型矩阵的开销。 ()

如果您并行执行大量这些矩阵运算,每个线程一个,而不是尝试一个接一个地并行化较小的矩阵运算(即,通过分配工作减少一项操作的延迟;而是让一个核心为一项操作完成所有工作,以便数据在其 L1d 或 L2 缓存中保持热。