CodeFest 2019. Антон Кочепасов (Rambus) — Как считать на питоне быстрее, чем на C++

16b6c87229eaf58768d25ed7b2bbbf52?s=47 CodeFest
April 11, 2019

CodeFest 2019. Антон Кочепасов (Rambus) — Как считать на питоне быстрее, чем на C++

Сравнение скорости разработки и исполнения программ на языках С++ и python на примере развития проекта статистического анализа сигналов за последние несколько лет.

В докладе расскажу, как статистические вычисления были реконструированы от сложного, большого проекта на C++ со множеством низкоуровневых оптимизаций до простого кода на python, который оказался в 5 раз меньше по размеру и в 10 раз быстрее. Как не стать жертвой роста сложности, успеть распознать проблему вовремя и что делать для улучшения ситуации.

Упоминаются: C++, python, cython, numpy, MKL.

16b6c87229eaf58768d25ed7b2bbbf52?s=128

CodeFest

April 11, 2019
Tweet

Transcript

  1. 1.

    Как считать на Питоне быстрее, чем на C++ Или простота

    неэффективности против эффективной мощности Антон Кочепасов Principal Engineer Rambus
  2. 2.

    Антон Кочепасов 20 лет опыта в индустрии В данный момент

    Principal Engineer anton.kochepasov@cryptography.com akss@me.com 2
  3. 3.

    О чем история? О неэффективности О простоте Об общении с

    пользователями Об использовании правильных инструментов 3
  4. 4.

    → Восстанавливает ключ шифрования ← Защищает от подобного взлома •

    Открыта в Cryptography Research в середине 90х • Лицензирована многими компаниями заинтересованными в сохранении секретов 4 Атака по побочным каналам
  5. 5.

    • Использует побочные эффекты процесса шифрования: • потребление энергии •

    ЭМ излучение • температура • звук 5 Атака по побочным каналам (продолжение)
  6. 6.

    Атака по побочным каналам (разбиения) 128 разбиений для одного промежуточного

    раунда 256 разбиений для каждого байта в S-блокеблоке Тысячи разбиений данных в одном полном анализе 6 <4.5
  7. 7.

    Что это сейчас было? Стат-блокеанализ многократного переразбиения данных для того,

    чтобы отличить два разных бита исходного текста хотя бы в одной точке. Примерный объем данных для небольшой атаки на одно незащищенное устройство: 100тыс точек * 1тыс следов * 8 байт * 4096 разбиения ≈ 3 TB 7
  8. 8.

    Основные этапы работы аналитика • Сбор электромагнитных следов (часы/дни) •

    Эффективное использование устройства и осциллоскопа • Повышение отношения сигнал/шум • Сотни гигабайт / терабайты • Статистическая обработка • Кеширование решений • Ограничение области вычислений • Численно-нестабильные алгоритмы 8
  9. 9.

    Реализация «...Любой мало-блокемальски сложный performance-блокеcritical код пишется на C++» (©

    просторы интернета) Весь код для сбора и обработки – C++. Писали и оптимизировали более 20 лет. 9
  10. 10.

    Размышления об улучшении • Параллелизация ввода-блокевывода и вычислений • SIMD

    intrinsics (SSE, AVX) • NUMA • OpenMP • Datacenter • Прочие красивые акронимы • Неделя чтения и изменения кода ни к чему не привела 10
  11. 11.

    Причины неудачи Очень сложный код • Кеширование • Шаблоны •

    Ассемблерные вставки • Несогласованные наименования • ... Коллеги: «Это решение специального случая с помощью высоко-блоке оптимизированного кода. Этот код писал гений и улучшали неглупые люди. Такое трудно понять быстро.» 11
  12. 12.

    Что бы сказал Эрик Липперт “If you don't understand why

    you're writing some code, either figure it out, or write different code that you do understand.” * * Eric Lippert – разработчик языка C#. Цитата со StackOverflow: https://stackoverflow.com/questions/21692193/why-блокеnot-блокеinherit-блокеfrom-блокеlistt/21694054#comment32799488_21694054 12
  13. 13.

    Попытка разобраться в задаче Общение с аналитиками Неэффективная, простая, модульная

    реализация на питоне Готовые компоненты: numpy, scipy Юнит тестирование критических участков вычисления “Бесплатно” Во время ожидания сбора сигнала 13 foo bar baz
  14. 15.

    Через долину отчаяния… Побочные эффекты Модульность Простота 21й век «Все

    уже придумано до нас» Поиск существующих решений и библиотек Научные и индустриальные статьи 60е: Kahan, Welford, … 00e и 10е: Choi, Sweetman, Pebai, Terriberry, … Все еще “бесплатно” – во время сбора сигнала 15
  15. 16.

    … К склону просветления Максимально простой инкапсулированный код Итеративные методы

    из статей Возможность вычислений в памяти (без дискового ввода-блокевывода) Кеширующие оптимизации из C++ кода Библиотеки прекомпиляции в C код: Numba Cython (выбран)выбран) Встроенный бенчмарк и метрики производительности 16
  16. 17.

    Результаты Заметно медленнее почти во всех случаях Коллеги: «Это же

    Питон» Пара аналитиков: «Мне нравится этот вычислитель. Можешь добавить еще вот такую функциональность?» 17
  17. 18.

    Подъем по склону Модульное решение позволяет легко поставить задачу, проконтролировать

    выполнение и оттестировать каждый блок. Cython позволяет переносить критические участки на C и подключать любую нативную библиотеку. Задача для стажера: • Использование BLAS из scipy.linalg для алгебраических вычислений • Реализация BLAS в Anaconda: Math Kernel Library (Intel MKL) • Оптимизация размера кеширующих хешей для одномерных случаев • Перенос одномерного итеративного подхода на двумерные статистики и корреляции 18
  18. 19.

    Результаты Вычисления реализованы маленькими простыми блоками в cython с использованием

    BLAS. Схожая одномерная производительность**. Двумерные статистики - от 10х. Коллеги: «Это же П... Погоди, а как мерил?» Аналитики: «Мне очень нравится! Можешь добавить еще вот такую функциональность? А такую?» Технический директор: «Есть прототип будущей системы. Можешь сделать библиотеку потокового анализа?» ─ «Библиотека уже готова.» ** Кроме чтения с диска очень коротких следов 19
  19. 20.

    Дальше, дальше, дальше... Обсуждение деталей со стажером: • Упрощение вычисления

    двумерного случая и улучшение использованием памяти через умножение матриц (BLAS DSYRK) • Адаптация подхода из двумерных статистик для корреляций и одномерного случая (BLAS DGEMM) 20
  20. 21.

    Результаты Одномерные статистики быстрее до 10х* **. Двумерные – до

    1000х. Потоковые вычисления работают итеративно со скоростью сбора следов, масштабируются под вычисления на одной машине. В 5 раз меньше строк кода. 2 патента. Коллеги: «Мы можем улучшить текущий код C++, но это будет сложно. И долго.» Аналитики: «Мы забросили старый подход. На Linux можно перенести?» ─ «Уже готово.» Продажники: «Требуем прототип системы анализа, пусть даже сырой.» CEO: «Чем вы пожертвовали для такого улучшения?» * В cython модуле с использованием numpy, scipy слинкованными с Intel MKL (Anaconda) ** Кроме чтения с диска очень коротких следов 21
  21. 22.

    Почему так получилось? • Обратная связь от пользователей • Широкий

    взгляд на задачу • Управление сложностью • Простота важнее эффективности • Модульность • Исследование существующих подходов • Использование правильных готовых инструментов 22
  22. 23.

    Что говорит Майкл Джексон Two rules in the matter of

    optimization: Rule 1: Don't do it. Rule 2 (for experts only). Don't do it yet -блоке that is, not until you have a perfectly clear and unoptimized solution. © Michael A. Jackson. Principles of Program Design, Academic Press, 1975 23