Go Assembler, или Как мы в N раз ускорили наш код гомоморфного хэширования Вопросы производительности и хардкор
Инженер-программист-математик.
Закончил математико-механический факультет СПбГУ, стажировался в JetBrains, работал в RAIDIX.
Мы разрабатываем децентрализованное объектное хранилище данных NeoFS, которое должно работать в недоверенной и ненадёжной среде. Для контроля целостности и доступности данных мы используем гомоморфное хэширование, а это весьма тяжеловесные алгоритмы.
Для нормальной работы надо уметь обрабатывать данные со скоростью примерно 30 Мб/с на одном ядре процессора, чтобы не отставать от чтения с дешёвого жёсткого диска, но наивная реализация на Go выдавала скорости на порядок меньше.
В докладе мы расскажем, как поэтапно, от простого к сложному, применить Go Assembler для ускорения критичных ко времени выполнения кусков кода на примере нашей функции хэширования, пройдём от наивных оптимизаций до внедрения инструкций AVX2, сравним код от человека и от компилятора, а также расскажем о проблемах и их преодолении.
Нам удалось ускорить обработку данных на порядок и добиться скорости хэширования 33.3 Мб/с. После доклада любой сможет повторить наш успех для своей задачи.