Почему adox и adcx плохо работают вместе на Ryzen?
Я потратил довольно много времени на ручную оптимизацию низкоуровневой целочисленной арифметики с некоторым успехом. Например, моя подпрограмма умножения 6x6 тратит 66 тиков по сравнению с 82 тиками
mpn_mul_basecase(6,6)
на Skylake. Мой код опубликован на Github.
В настоящее время я работаю над умножением 8x8 для AMD Ryzen. Я использую Ryzen 7 3800X для тестирования. Я очень стараюсь избегать задержек. Я изучал "Таблицы инструкций" Агнера Фога, а также "Задержки инструкций..." Торбьорна Гранлунда. Ничто не указывает на серьезные проблемы с adox/adcx на Ryzen; между Ryzen и Skylake не должно быть большой разницы в отношении adox/adcx. Я протестировал подпрограмму умножения 8x1, используя mulx и одно из adcq, adox или adcx; все три варианта подпрограммы работают быстро как на Skylake, так и на Ryzen (18-19 тиков).
Однако, когда я пытаюсь смешать adox и adcx, мой код работает ужасно медленно на Ryzen. Например, моя подпрограмма умножения 8x2 тратит 34 тика на Skylake i7-6700 и 293 тика на Ryzen 7 3800X (разница в 8 раз).
Любое предложение, почему код mulx/adox/adcx работает в 8 раз медленнее на Ryzen?
1 ответ
Избавление от частого использования xmm / ymm решило проблему.
модифицированная подпрограмма стоит всего 42 тика.
Похоже, у Ryzen нет проблем с adox/adcx. У Ryzen, очевидно, есть проблемы с vmovdqu mem для регистрации и / или vpextrq и / или vperm2i128.
Вопрос был глупый.
@NateEldredge Ваш намек был полезен. Спасибо.