如何让 AMD Epyc Zen 2 处理器保持“热”和快速?

问题描述 投票:0回答:0

我编写了一个多线程 SIMD 矩阵向量乘法,在我感兴趣的大小下,它的性能优于英特尔 MKL (多线程固定大小矩阵向量乘法针对具有非均匀缓存的多核 CPU 进行了优化)。

这些天我主要使用 AMD Zen 2 处理器,我观察到 AMD 上非常奇怪的时序行为。见下图。在迭代“0”之前,乘法已经连续执行了100,000次,并且每次乘法的时间早已确定并且坚如磐石。在迭代“0”处,我在乘法之间添加了一个自旋循环。在不到 10 次迭代之后,时序就会爆炸并稳定在一个新的水平上,这个水平是原来的几倍。如果我再次移除自旋循环,需要几十次迭代才能加速到原来的水平。我只在 AMD Zen 2 处理器上观察到这一点,但在 Intel Xeon SP Skylake 上没有观察到。

我已经尝试将 _mm_pause() 添加到自旋循环,预取(部分)矩阵,以及在 AVX 寄存器中进行其他计算以进行自旋。甚至只是用更少的列一遍又一遍地执行相同的矩阵向量乘法。没有任何帮助。

到目前为止,我得出的结论是,只要 CPU 在短时间内执行与完全相同的全尺寸乘法不同的操作,乘法就会减慢很多。一旦乘法之间的时间超过 CPU 进行“热”乘法 (TBC) 所需的时间,这似乎就会发生。

系统,包括硬件和软件,都针对低延迟进行了调整,所有可能对确定性产生不利影响的省电模式等都被禁用,我的程序以高 SCHED_FIFO 优先级运行,并且线程被固定到 CPU 内核。

有没有人知道 CPU 中会发生什么和/或如何在乘法之间有很小的间断的情况下达到良好的性能?

performance x86-64 real-time low-latency amd-processor
© www.soinside.com 2019 - 2024. All rights reserved.