x86 - 为什么adox 和adcx 在锐龙上不能很好地协同工作?

标签 x86 cpu-architecture gmp amd-processor adx

我花了很多时间手动优化低级整数算法,并取得了一些成功。例如,与 mpn_mul_basecase(6,6) 的 82 个滴答相比,我的 6x6 乘法子程序花费了 66 个滴答声。在天湖上。我的代码发布在 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 上运行速度非常慢。例如,my 8x2 multiplication subroutine在 Skylake i7-6700 上花费 34 滴答,在 Ryzen 7 3800X 上花费 293 滴答(8 倍差)。
有什么建议为什么 mulx/adox/adcx 代码在 Ryzen 上执行速度慢 8 倍?

最佳答案

摆脱繁重的 xmm/ymm 使用解决了这个问题。
modified subroutine只需要 42 个滴答声。
看起来 Ryzen 对 adox/adcx 没有问题。 Ryzen 显然在 vmovdqu mem 注册和/或 vpextrq 和/或 vperm2i128 方面存在问题。
这个问题很愚蠢。
@NateEldredge 您的提示很有帮助。谢谢你。

关于x86 - 为什么adox 和adcx 在锐龙上不能很好地协同工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65049724/

相关文章:

c - RET 之后的指令是否总是 CALL 之后的指令?

c - 在 Windows 上使用 MinGW 的 GMP

performance - sse 指令是否消耗更多功率/能量?

embedded - 嵌入式领域中的 "soft reset"和 "hard reset"有什么区别?

ios - AppStore提交架构报错9000 armv7

multithreading - 计算 2 线程 CPU 的执行时间?

c++ - MPI 和 boost 多精度/gmp

c - C 中的 GMP 库 - 如何使添加更精确?

assembly - JMP rel16(而不是 JMP rel32)

x86 - 下面的汇编指令addsd -8(%rbp), %xmm0 的作用是什么?