![ISO C++ — встреча международного комитета в Польше - 1 ISO C++ — встреча международного комитета в Польше - 1](https://www.pvsm.ru/images/2024/11/26/ISO-C--vstrecha-mejdunarodnogo-komiteta-v-polshe.jpg)
В этот раз без внимания не остались темы:
- Рефлексия времени компиляции и оператор «монобровь»
- Constexpr, много constexpr
- SIMD
- Structured bindings as a pack
- Безопасность, контракты, libc++ hardening, профили, UB и std::launder
- Сколько бит в байте?
В этот раз без внимания не остались темы:
Старую собаку новым трюкам не обучишь, вот и я взялся за старое. Blurhash — это компактный способ представления размытой превьюшки изображения в виде ASCII-строки. Разработан финской компанией Wolt (аналог Delivery Club). Давно хотелось внедрить такое к себе в API, чтобы любой клиент мог более плавно и изящно делать загрузку контент на своем сайте. Но сколько я на него смотрел — всегда не давала покоя скорость работы, уж больно медленно и «в лоб» он был написан. Но вот время пришло наконец-то разобраться, что же он так медленно работает.
У меня в портфолио есть несколько готовых пет-проектов на Rust, и я заметил, что позиция «а у нас уже получилась DataFrame?» нисколько меня не устраивает. Поэтому я подумал, не сделать ли мне элементарный контейнер, который решал бы мою конкретную задачу. Но этот проект вышел из-под контроля.
Год спустя, написав немало кода, я создал одну из самых быстрых библиотек датафреймов, применимую в Rust и Python. Вот мой первый официальный «Hello World» на polars, размещённый у меня в блоге. Надеюсь, что с помощью этого поста я смогу пояснить читателю некоторые решения, которые мне довелось принять при проектировании, и вам станет понятнее, как Polars работает под капотом.
Читать полностью »
Fail2ban
— утилита чрезвычайно полезная во многих случаях. Думаю, многие используют её для того, чтобы в автоматическом режиме блокировать особенно назойливых «посетителей». К сожалению, если входящий поток становится слишком большим, fail2ban
теряет все свои полезные свойства, потому что разбор лога безнадёжно отстаёт от реальности.
Вот, например, лог nginx
из 100 тысяч строчек fail2ban
при самых простых настройках (failregex='^<ADDR>'
) разбирает порядка 45 секунд:
$ fail2ban-regex nginx.log '^<ADDR>'
Running tests
=============
Use failregex line : ^<ADDR>Читать полностью »
В предыдущей части мы нарисовали фрактал Ньютона с помощью WebAssembly на Rust. В этой части мы задействуем SIMD команды и параллельные вычисления, чтобы добиться ещё большей производительности.
Вживую увидеть прирост скорости можно на онлайн-демо. На моём компьютере она составляет ~900% по сравнению с обычной реализацией на wasm.
Читать полностью »
Вышла общедоступная версия Java 17. В этот релиз попало более 2700 закрытых задач и 14 JEP'ов. Изменения API можно посмотреть по этой ссылке.
Калифорнийская компания Ampere представила первый в отрасли 80-ядерный серверный ARM-процессор на 64-битной архитектуре Ampere Altra.
Уже несколько лет специалисты прогнозируют, что платформа ARM составит конкуренцию x86 в дата-центрах, но этого никак не происходит. По итогам 2019 года там доминирует Intel с долей 95,5%, у AMD — 4,5%.
Однако новый ARM-процессор в целочисленном бенчмарке SPECrate 2017 показывает более высокую производительность, чем самый быстрый 64-ядерный AMD EPYC или топовый 28-ядерный Xeon семейства Cascade Lake. Это уже серьёзная заявка (хотя результаты бенчмарка немного «подкручены», см. ниже).
Читать полностью »
Всем добрый день.
Недавно на Хабре появилась статья Побеждая C двадцатью строками Haskell: пишем свой wc от @0xd34df00d. Автор, известный своей симпатией к функциональному программированию, реализовал на Хаскеле аналог утилиты wc, и подверг его оптимизации, получив в результате вариант, работающий более чем в 7 раз быстрее стандартной юниксовой утилиты.Читать полностью »
Недавно я вернулся к анализу погрешностей чисел с плавающей запятой, чтобы усовершенствовать некоторые детали в следующей редакции книги Physically Based Rendering. Числа с плавающей запятой — интересная область вычислений, полная сюрпризов (хороших и плохих), а также хитрых трюков, позволяющих избавиться от неприятных неожиданностей.
В процессе работы я наткнулся на этот пост на StackOverflow, из которого узнал об изящном алгоритме точного вычисления .
Но прежде чем приступать к алгоритму, нужно понять, что же такого хитрого в выражении ? Возьмём
,
,
и
. (Это реальные значения, которые получились у меня во время запуска pbrt.) При 32-битных значениях float получаем:
и
. Выполняем вычитание, и получаем
. Но если выполнить вычисления с двойной точностью, а в конце преобразовать их во float, то получится
. Что произошло?
Проблема в том, что значение каждого произведения может сильно выйти за нижнюю границу , где расстояние между представимыми значениями с плавающей запятой очень велико — 64. То есть при округлении
и
по отдельности до ближайшего представимого float, они превращаются в числа, кратные 64. В свою очередь, их разность будет кратной 64, и не останется никакой надежды, что она станет к
ближе, чем
. В нашем случае результат оказался ещё дальше из-за того, как два произведения были округлены в
. Мы напрямую столкнёмся со старым добрым катастрофическим сокращением1.
Читать полностью »
Данная статья является продолжением серии статей описывающей алгоритмы лежащие в основе
Synet — фреймворка для запуска предварительно обученных нейронных сетей на CPU.
Если смотреть на распределение процессорного времени, которое тратится на прямое распространение сигнала в нейронных сетях, то окажется что зачастую более 90% всего времени тратится в сверточных слоях. Поэтому если мы хотим получить быстрый алгоритм для нейронной сети – нам нужен, прежде всего, быстрый алгоритм для сверточного слоя. В настоящей статье я хочу описать методы оптимизации прямого распространения сигнала в сверточном слое. Причем начать хочется с наиболее широко распространенных методов, основанных на матричном умножении. Изложение я буду стараться вести в максимально доступной форме, чтобы статья была интересна не только специалистам (они и так про это все знают), но и более широкому кругу читателей. Я не претендую на полноту обзора, так что любые замечания и дополнения только приветствуются.
Читать полностью »