Еще про AVX2 и VPGATHERDD

Продолжение вот к этому вот тексту и к тамошним комментариям:

1. Собрался с духом и переписал тройку мест на 256-битные команды. Помогло: время исполнения этих кусочков упало на 15-25%. Буду дальше писать.

Это без особой оптимизации, старый код у меня SSE3, никаких BLENDPS/EXTRACTPS не использовалось, соответственно и AVX2 - это чисто замена _mm_ на _mm256_ ну и типы 256-битные. В уже переписанных кусках буду еще смотреть на DPPS: на SandyBridge эта инструкция выигрыша не давала, но может быть поможет на Haswell+.

2. А вот с VPGATHERDD - сплошное разочарование:

  • Для гистограммы (когда gather, потом инкремент, потом поэлементная запись) - получается серьезный проигрыш в производительности, а код сложнее.
  • Для операций вида bitmap[index][channel] = contrast_curve[value] проигрыш тоже есть, хотя и незначительный. Совсем оптимизированное (читаем только 6 элементов, для альфа-канала берем defaults т.е. через masked load) - совсем незначительно медленнее, единицы процентов на всю функцию, но медленнее.

Уж не знаю, кому эта VPGATHERDD в таком виде нужна. Ну разве только на новых процессорах она побыстрее.

Comments

Вот тут есть небольшое сравнение для Skylake (который без AVX512): http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-i..., глава с примером про vpgatherd. Я думаю, что при желании те же instruction sequences можно отбенчмаркать на Haswell и посмотреть на разницу (хотя результат, конечно, немного предсказуем).

А вот да, графики для Skylake внушают оптимизм, особенно если нужный элемент уже в кэше (в моем случае это означает, что у двух соседних пикселей одинаковые значения компонентов, что вполне вероятно).

Вот ужо куплю MS Surface Pro4 после праздников - и помучаю животное.

А это что за железо? Haswell? Там scatter/gather реализован в микрокоде -- много от него ждать не приходится. Разве что оочень сильно поджимает L1I кэш.

Haswell, да.

Будет ли быстрее на Skylake?

Серверный -- да, должен. Про клиентский -- не уверен. Возможно, нормально это реализовли только в блоке который реализует AVX512, которого в десктопных SKU нет. Публичных деталей про микроахитетуру Skylake мало.

Серверный - это только грядущие E5/E7, ведь имеющийся вживую E3 от десктопных не отличается?

Да, верно. E3 -- это десктопный, с включённым ECC и несколько более широкой валидацией.