5

我花了很多时间手动优化低级整数运算,并取得了一些成功。例如,我的 6x6 乘法子程序花费了 66 个滴答声,而mpn_mul_basecase(6,6)在 Skylake 上花费了 82 个滴答声。我的代码发布在Github上。

我目前正在为 AMD Ryzen 开发 8x8 乘法。我正在使用 Ryzen 7 3800X 进行基准测试。我努力避免延迟。我研究过 Agner Fog 的“指令表”以及 Torbjörn Granlund 的“指令延迟……”。没有任何迹象表明 Ryzen 上的 adox/adcx 存在重大问题;Ryzen 和 Skylake 在 adox/adcx 上应该没有太大区别。我使用 mulx 和 adcq、adox 或 adcx 之一对乘法 8x1 子程序进行了基准测试;该子程序的所有三个变体在 Skylake 和 Ryzen 上都运行得很快(18-19 滴答声)。

但是,当我尝试将 adox 和 adcx 混合在一起时,我的代码在 Ryzen 上运行速度非常慢。例如,我的 8x2 乘法子例程在 Skylake i7-6700 上花费了 34 个滴答声,在 Ryzen 7 3800X 上花费了 293 个滴答声(8 倍差)。

有什么建议为什么 mulx/adox/adcx 代码在 Ryzen 上的执行速度要慢 8 倍?

4

1 回答 1

2

摆脱繁重的 xmm/ymm 使用解决了这个问题。

修改后的子程序仅花费 42 个滴答声。

看起来 Ryzen 对 adox/adcx 没有问题。Ryzen 显然在注册 vmovdqu mem 和/或 vpextrq 和/或 vperm2i128 方面存在问题。

这个问题很愚蠢。

@NateEldredge 您的提示很有帮助。谢谢你。

于 2020-11-30T12:10:12.913 回答