查询Intel CPU执行单元、端口等详细信息

Query Intel CPU details of execution unit, port, etc

是否可以在Intel CPU上查询每个内核的执行次数unit/port和类似信息?

我有一个汇编程序,并注意到在不同的 CPU 上性能有很大不同。例如,在 Core i5 4570 上,某些功能比在 Core i7 4970HQ 上持续需要 25% 的周期才能完成。他们都是基于 Haswell 的,来自同一代人。基准程序部分不涉及内存移动。所以我想差异可能来自执行单元数量、端口数量等细节。基准测试测量单核 CPU 周期,因此 frequencies/HT 等没有发挥作用。

我对性能差异的这种解释是否正确?如果是,我在哪里可以找到特定 CPU 的此类信息。是否可以动态查询?如果可能的话,我可以根据这些信息动态调度,更均匀地分配 uops 和类似的技术来优化多个 CPU 的程序。

您是否为参考周期 (RDTSC) 而不是核心时钟周期(使用 perf 计数器)计时?这将解释您的观察结果。

Turbo 有很大的不同,最大 turbo 和最大持续/额定时钟速度(即参考周期滴答率)之间的比率在不同的 CPUs 上是不同的。例如

CPU 的 TDP 越低,持续和峰值之间的比率就越大。 Haswell wikipedia article 有表:

  • 84W 台式机 i5 4570:持续 3.2GHz = RDTSC 频率,最大睿频 3.6GHz(核心速度实际上可能 运行 对于大多数基准测试,如果它有时间从低功率怠速上升)。

  • 47W 笔记本电脑 i7-4960HQ:2.6GHz 持续 = RDTSC 频率与 3.8GHz 最大睿频。

使用性能计数器为您的代码计时,并查看 "core clock cycles" 计数。 (以及许多其他整洁的东西)。


从 Core-M 5Watt CPUs 到高功率四核再到 18 核 Xeon,每个 Haswell 内核都是相同的(实际上每个内核的功率预算更像笔记本电脑 CPU);只有 L3 缓存、核心数量(和互连)以及是否支持 HT and/or Turbo 有所不同。基本上核心之外的一切都可以不同,包括 GPU。 它们不会禁用执行端口, 甚至 L1/L2 缓存都是相同的。我认为禁用执行端口需要对无序调度程序和类似的东西进行重大重新设计。

更重要的是,每个端口至少有一个在任何其他端口上都找不到的执行单元:p0 有除法器,p1 有整数乘法单元,p5 有洗牌单元,p6 是唯一的端口可以执行预测采取的分支。实际上,p2 和 p3 是相同的加载端口(并且可以处理存储地址微指令)...

参见 Agner Fog's microarch pdf for more about Haswell internals, and also David Kanter's writeup 不同块的图表。

(但是,严格来说,整个内核完全相同并不完全正确:Haswell Pentium/Celeron CPU不支持 AVX/AVX2 或 BMI/BMI2。我认为他们通过禁用解码器中的 VEX 前缀解码来做到这一点。Skylake Pentiums/Celerons 仍然是这种情况,所以感谢英特尔延迟我们可以假设支持新指令集的时间。大概他们这样做了 CPUs 的矢量执行单元只有上半部分或下半部分有缺陷,仍然可以作为 Celeron 或 Pentium 出售,就像 CPUs 在某些 L3 中有缺陷可以作为 i5 出售一样i7)