我在读https://insidehpc.com/2017/07/cycles-per-instruction-matters/:
例如,如果某部分代码需要 1200 个周期并执行 600 条指令,则 CPI 为 1200/600 = 2。 但是,在这种情况下,核心的 CPI 应该等于 0.5,这意味着没有向核心发送足够的工作,因为只有四分之一的容量被使用。
要么是我错过了此链接中的某些内容(即使错过了也看不到),要么是 0.5 的计算没有道理。有人能解释一下吗?
答案1
实际文章内容并不清楚,但澄清的语句既在较早处又在较晚处。
在你引用之前的句子中
对于每个核心的情况,必须聚合在硬件核心上运行的所有线程以达到适当的比例。
之后
在英特尔至强融核处理器上,有 72 个内核,每个内核可以同时运行 4 个线程
因此,对于 CPI,您需要知道周期 (1200) 和指令数 (600)。然后,如果您想知道是否正在使用所有可用的 CPU 线程,从而从理论上完全加重核心负担,您需要知道每个核心的线程数 (4)。
CPI 数字是 2,但作者随后(没有解释)将其除以每个核心上的线程数。结果为 2/4 = 0.5。
0.5 这个数字不是 CPI,而是将您(已知的)CPI 与线程数联系起来的其他数字。只有当您清楚了解指令执行时间(其 CPI)与应用程序的多线程程度的比率时,此指标的实际值才真正有用。如果您运行同一个线程进行大量计算,则可以优化在核心或核心集上运行的线程数。
因此,您可以发现,任何低于 2 的数字(对于此特定代码)都没有使用所有可用线程,因此核心可以承担更多工作。任何超过 2 的数字都表示核心的工作量超出其处理能力,并且将发生任务切换惩罚。
我相信他的 0.5 这个数字就是从这里得到的。
这篇文章实际上写得很糟糕,但它试图强调的是,你需要根据指令如何执行(即 CPI(2))以及有多少个线程或核心可用来有效地适当加载资源来优化你的多线程。