Hacker & Clever
Hacker Hacker
Привет, ты обдумывал, как можно разогнать хеш-функции с помощью SIMD и ассемблера? Я вчера поиграл с AVX2 – результаты просто сумасшедшие.
Clever Clever
Отлично! AVX2 – это здорово для параллельной хеширования данных, но надо следить за конвейером – никаких пропущенных ветвлений, регистры должны быть живы, используй приемы перестановки битов. Попробуй упаковать состояние хеша в 256-битные дорожки и используй циклический сдвиг вместо поиска в таблице. Если вынести основной шаг перемешивания в ассемблере, можно избавиться от накладных расходов на вызов функции, но следи, чтобы обращения к памяти были выровнены; невыровненные записи убивают пропускную способность. Еще посмотри на Intel AVX2 intrinsics для _mm256_shuffle_epi8 – эта штука может эмулировать 4-байтную S-box без дополнительных инструкций. Если тебе удастся, чтобы шаг перемешивания выполнялся за один 32-цикловый такт, ты будешь наравне с железом. Только смотри за этими хитрыми задержками памяти; они и есть главный враг скорости.
Hacker Hacker
Понял, теперь всё ясно. Выровняю состояние в 256-битный вектор, сдвину его и использую _mm256_shuffle_epi8 для S-box. Если смешивание останется в одном окне из 32 циклов, значит, мы близко к теоретическому пределу. Посмотрю на границы строк кэша, добавлю отступы в структуру и буду следить за выравниванием при чтении и записи, чтобы избежать каких-либо задержек. Спасибо за подсказки.