Старую собаку новым трюкам не обучишь, вот и я взялся за старое. Blurhash — это компактный способ представления размытой превьюшки изображения в виде ASCII-строки. Разработан финской компанией Wolt (аналог Delivery Club). Давно хотелось внедрить такое к себе в API, чтобы любой клиент мог более плавно и изящно делать загрузку контент на своем сайте. Но сколько я на него смотрел — всегда не давала покоя скорость работы, уж больно медленно и «в лоб» он был написан. Но вот время пришло наконец-то разобраться, что же он так медленно работает.
Рубрика «simd»
Я ускорил генерацию blurhash в 3̶6̶ 8̶7̶ 128 раз
2024-10-11 в 21:44, admin, рубрики: blurhash, clang, compilers, gcc, pillow, simdЯ написал одну из самых быстрых библиотек датафреймов
2023-05-26 в 14:01, admin, рубрики: CockroachDB, Decode, DuckDB, execute, fetch, Groupby, mysql, postgresql, python, Rust, simd, timeweb_статьи_перевод, Блог компании Timeweb Cloud, Программирование, СУБД
❯ 1. Вступление
У меня в портфолио есть несколько готовых пет-проектов на Rust, и я заметил, что позиция «а у нас уже получилась DataFrame?» нисколько меня не устраивает. Поэтому я подумал, не сделать ли мне элементарный контейнер, который решал бы мою конкретную задачу. Но этот проект вышел из-под контроля.
Год спустя, написав немало кода, я создал одну из самых быстрых библиотек датафреймов, применимую в Rust и Python. Вот мой первый официальный «Hello World» на polars, размещённый у меня в блоге. Надеюсь, что с помощью этого поста я смогу пояснить читателю некоторые решения, которые мне довелось принять при проектировании, и вам станет понятнее, как Polars работает под капотом.
Читать полностью »
Как я разогнал fail2ban* в тысячу раз с помощью SIMD
2022-06-02 в 9:08, admin, рубрики: ddos-защита, fail2ban, nginx, Rust, simd, высокая производительность, конечные автоматы, ненормальное программирование, Регулярные выраженияFail2ban
— утилита чрезвычайно полезная во многих случаях. Думаю, многие используют её для того, чтобы в автоматическом режиме блокировать особенно назойливых «посетителей». К сожалению, если входящий поток становится слишком большим, fail2ban
теряет все свои полезные свойства, потому что разбор лога безнадёжно отстаёт от реальности.
Вот, например, лог nginx
из 100 тысяч строчек fail2ban
при самых простых настройках (failregex='^<ADDR>'
) разбирает порядка 45 секунд:
$ fail2ban-regex nginx.log '^<ADDR>'
Running tests
=============
Use failregex line : ^<ADDR>Читать полностью »
Используем клиентский процессор по максимуму. Часть 2: SIMD + мультипоточность
2022-05-24 в 9:00, admin, рубрики: Rust, ruvds_статьи, simd, webassembly, Блог компании RUVDS.com, высокая производительность, мультипоточность, Программирование, фракталыСнова поговорим об ускорении работы клиентской стороны веб-приложения и о том, как для этого задействовать все вычислительные ресурсы процессора.
В предыдущей части мы нарисовали фрактал Ньютона с помощью WebAssembly на Rust. В этой части мы задействуем SIMD команды и параллельные вычисления, чтобы добиться ещё большей производительности.
Вживую увидеть прирост скорости можно на онлайн-демо. На моём компьютере она составляет ~900% по сравнению с обычной реализацией на wasm.
Читать полностью »
Вышла Java 17
2021-09-14 в 15:59, admin, рубрики: java, java11, java12, java13, java14, java15, java16, java17, java9, JDK, openjdk, pattern-match, sealed, simd, switchВышла общедоступная версия Java 17. В этот релиз попало более 2700 закрытых задач и 14 JEP'ов. Изменения API можно посмотреть по этой ссылке.
Ampere Altra — первый в мире 80-ядерный ARM-процессор
2020-03-04 в 13:49, admin, рубрики: amd, Ampere Altra, Ampere Computing, intel, miran, Neoverse N1, RISC, simd, vps, аренда, Блог компании Дата-центр «Миран», дата-центр "Миран", Компьютерное железо, Производство и разработка электроники, Процессоры, Серверное администрирование, серверы, стойки
Калифорнийская компания 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. Это уже серьёзная заявка (хотя результаты бенчмарка немного «подкручены», см. ниже).
Читать полностью »
Очередная статья про wc
2020-02-25 в 14:03, admin, рубрики: C, simd, высокая производительность, Программирование, холиварыВсем добрый день.
Недавно на Хабре появилась статья Побеждая C двадцатью строками Haskell: пишем свой wc от @0xd34df00d. Автор, известный своей симпатией к функциональному программированию, реализовал на Хаскеле аналог утилиты wc, и подверг его оптимизации, получив в результате вариант, работающий более чем в 7 раз быстрее стандартной юниксовой утилиты.Читать полностью »
Алгоритм Кэхэна: как получить точную разность произведений
2019-11-14 в 7:51, admin, рубрики: double, float, fma, simd, Алгоритмы, двойная точность, математика, погрешности округления, числа с плавающей запятойНедавно я вернулся к анализу погрешностей чисел с плавающей запятой, чтобы усовершенствовать некоторые детали в следующей редакции книги Physically Based Rendering. Числа с плавающей запятой — интересная область вычислений, полная сюрпризов (хороших и плохих), а также хитрых трюков, позволяющих избавиться от неприятных неожиданностей.
В процессе работы я наткнулся на этот пост на StackOverflow, из которого узнал об изящном алгоритме точного вычисления .
Но прежде чем приступать к алгоритму, нужно понять, что же такого хитрого в выражении ? Возьмём , , и . (Это реальные значения, которые получились у меня во время запуска pbrt.) При 32-битных значениях float получаем: и . Выполняем вычитание, и получаем . Но если выполнить вычисления с двойной точностью, а в конце преобразовать их во float, то получится . Что произошло?
Проблема в том, что значение каждого произведения может сильно выйти за нижнюю границу , где расстояние между представимыми значениями с плавающей запятой очень велико — 64. То есть при округлении и по отдельности до ближайшего представимого float, они превращаются в числа, кратные 64. В свою очередь, их разность будет кратной 64, и не останется никакой надежды, что она станет к ближе, чем . В нашем случае результат оказался ещё дальше из-за того, как два произведения были округлены в . Мы напрямую столкнёмся со старым добрым катастрофическим сокращением1.
Читать полностью »
Сверточный слой: методы оптимизации основанные на матричном умножении
2019-11-06 в 9:13, admin, рубрики: c++, simd, Алгоритмы, кэш процессора, матричное умножение, машинное обучение, обработка изображений, сверточный слойВведение
Данная статья является продолжением серии статей описывающей алгоритмы лежащие в основе
Synet — фреймворка для запуска предварительно обученных нейронных сетей на CPU.
Если смотреть на распределение процессорного времени, которое тратится на прямое распространение сигнала в нейронных сетях, то окажется что зачастую более 90% всего времени тратится в сверточных слоях. Поэтому если мы хотим получить быстрый алгоритм для нейронной сети – нам нужен, прежде всего, быстрый алгоритм для сверточного слоя. В настоящей статье я хочу описать методы оптимизации прямого распространения сигнала в сверточном слое. Причем начать хочется с наиболее широко распространенных методов, основанных на матричном умножении. Изложение я буду стараться вести в максимально доступной форме, чтобы статья была интересна не только специалистам (они и так про это все знают), но и более широкому кругу читателей. Я не претендую на полноту обзора, так что любые замечания и дополнения только приветствуются.
Читать полностью »
Новая библиотека x86 SIMD интринсиков — immintrin debug
2019-05-30 в 8:58, admin, рубрики: AVX-512, simd, x86, Блог компании Intel, высокая производительность, ПрограммированиеС каждым новым поколением процессоров Intel появляются новые и все более сложные векторные инструкции. Хотя длина вектора (512 бит) в ближайшее время расти не будет, появятся новые типы данных и виды инструкций. Например, кто сможет с первого взгляда понять, что делает такой интринсик (и соответствующая ему инструкция процессора)?
Bitwise ternary logic that provides the capability to implement any three-operand binary function; the specific binary function is specified by value in imm8.
__m512i _mm512_mask_ternarylogic_epi32 (__m512i src, __mmask8 k, __m512i a, __m512i b, int imm8)
FOR j := 0 to 15
i := j*32
IF k[j]
FOR h := 0 to 31
index[2:0] := (src[i+h] << 2) OR (a[i+h] << 1) OR b[i+h]
dst[i+h] := imm8[index[2:0]]
ENDFOR
ELSE
dst[i+31:i] := src[i+31:i]
FI
ENDFOR
dst[MAX:512] := 0
ОК, допустим, мы разобрались, как она работает. Следующий уровень сложности — отладка кода, интенсивно использующего такие интринсики.
Читать полностью »