为什么打破LZCNT的“输出依赖性”很重要?

在进行基准测试时,我测得的吞吐量比我计算的要低得多,我将其缩小到LZCNT指令(TZCNT也是如此),如以下基准测试所示:


  xor ecx, ecx

_benchloop:

  lzcnt eax, edx

  add ecx, 1

  jnz _benchloop

和:


  xor ecx, ecx

_benchloop:

  xor eax, eax  ; this shouldn't help, but it does

  lzcnt eax, edx

  add ecx, 1

  jnz _benchloop

第二个版本要快得多。不应该这样 没有理由为什么LZCNT应该对其输出具有输入依赖性。与BSR / BSF不同,xZCNT指令始终覆盖其输出。


我正在4770K上运行它,因此LZCNT和TZCNT不会作为BSR / BSF执行。


这里发生了什么?


哈士奇WWW
浏览 617回答 3
3回答

芜湖不芜

没什么可不幸的。您似乎已经排除了对齐方式,而我们只是排除了部分标志的依赖性。“当您消除了不可能的事物时,无论多么不可能,仍然是必须存在的事实。”我们可能还没有消除所有其他事物,但是看起来越来越像在您的处理器上实现的xZCNT依赖于其输出寄存器重命名。
打开App,查看更多内容
随时随地看视频慕课网APP