我花了很多时间手动优化低级整数运算,并取得了一些成功。例如,我的 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 倍?