在执行uop计数不是处理器宽度倍数的循环时性能是否会降低?
我想知道各种大小的循环如何在最近的x86处理器上执行,作为uop数的函数。
以下是彼得·科德斯(Peter Cordes)的一句话,他在另一个问题中提出了非多数的问题:
我还发现,如果循环不是4 uop的倍数,则循环缓冲区中的uop带宽不是每个循环的常数4。(即它是abc,abc,......;不是abca,bcab,......)。遗憾的是,Agner Fog的microarch doc对循环缓冲区的这种限制并不清楚。
问题是关于循环是否需要是N uop的倍数才能以最大uop吞吐量执行,其中N是处理器的宽度。(即最近的英特尔处理器为4)。在谈论“宽度”和计算微动时,有很多复杂因素,但我大多想忽略这些因素。特别是,假设没有微观或宏观融合。
Peter给出了以下一个循环,其中包含7个uop的循环:
一个7-uop循环将发出4 | 3 | 4 | 3 | ...的组我没有测试更大的循环(不适合循环缓冲区),看看是否有可能从下一个指令开始迭代发布在与其分支相同的组中,但我不假设。
更一般地说,声称是x
在其体内具有uop 的循环的每次迭代将至少进行ceil(x / 4)
迭代,而不是简单地迭代x / 4
。
对于部分或全部最新的x86兼容处理器,这是真的吗?
翻翻过去那场雪