Вышла общедоступная версия Java 17. В этот релиз попало более 2700 закрытых задач и 14 JEP'ов. Изменения API можно посмотреть по этой ссылке.
Рубрика «simd» - 3
Вышла Java 17
2021-09-14 в 15:59, admin, рубрики: java, java11, java12, java13, java14, java15, java16, java17, java9, JDK, openjdk, pattern-match, sealed, simd, switchAmpere 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
ОК, допустим, мы разобрались, как она работает. Следующий уровень сложности — отладка кода, интенсивно использующего такие интринсики.
Читать полностью »
Умножение матриц: эффективная реализация шаг за шагом
2019-03-14 в 10:48, admin, рубрики: c++, simd, Алгоритмы, кэш процессора, матричное умножение, машинное обучение, обработка изображений
Введение
Умножение матриц — это один из базовых алгоритмов, который широко применяется в различных численных методах, и в частности в алгоритмах машинного обучения. Многие реализации прямого и обратного распространения сигнала в сверточных слоях неронной сети базируются на этой операции. Так порой до 90-95% всего времени, затрачиваемого на машинное обучение, приходится именно на эту операцию. Почему так происходит? Ответ кроется в очень эффективной реализации этого алгоритма для процессоров, графических ускорителей (а в последнее время и специальных ускорителей матричного умножения). Матричное умножение — один из немногих алгоритмов, которые позволяет эффективно задействовать все вычислительные ресурсы современных процессоров и графических ускорителей. Поэтому не удивительно, что многие алгоритмы стараются свести к матричному умножению — дополнительная расходы, связанные с подготовкой данных, как правило с лихвой окупаются общим ускорением алгоритмов.
Так как реализован алгоритм матричного умножения? Хотя сейчас существуют множество реализаций данного алгоритма, в том числе и в открытых исходных кодах. Но к сожалению, код данных реализаций (большей частью на ассемблере) весьма сложен. Существует хорошая англоязычная статья, подробно описывающая эти алгоритмы. К моему удивлению, я не обнаружил аналогов на Хабре. Как по мне, этого повода вполне достаточно, чтобы написать собственную статью. С целью ограничить объем изложения, я ограничился описанием однопоточного алгоритма для обычных процессоров. Тема многопоточности и алгоритмов для графических ускорителей явно заслуживает отдельной статьи.
Процесс изложения будет вестись ввиде шагов с примерами по последовательному ускорению алгоритма. Я старался писать максимально упрощая задачу, но не более того. Надеюсь у меня получилось…
Читать полностью »
Разновидности SIMD
2019-02-24 в 17:05, admin, рубрики: avx, AVX2, meshoptimizer, simd, sse, параллельное программирование, Проектирование и рефакторинг, Работа с векторной графикой
Во время разработки meshoptimizer частенько возникает вопрос: «А может этому алгоритму использовать SIMD?»
Библиотека ориентирована на производительность, но SIMD не всегда обеспечивает значительные преимущества по скорости. К сожалению, SIMD может сделать код менее переносимым и менее ремонтопригодным. Поэтому в каждом конкретном случае приходится искать компромисс. Когда первостепенное значение имеет производительность, приходится разрабатывать и поддерживать отдельные реализации SIMD для наборов инструкций SSE и NEON. В других случаях нужно понять, каков эффект от применения SIMD. Сегодня мы попытаемся ускорить меш-рационализатор (sloppy mesh simplifier) — новый алгоритм, недавно добавленный в библиотеку — используя наборы инструкций SSEn/AVXn.
Читать полностью »
Ускоряем неускоряемое или знакомимся с SIMD, часть 2 — AVX
2019-02-18 в 15:21, admin, рубрики: avx, AVX2, C, c++, simd, sse, высокая производительность, ПроцессорыПредыдущая часть вызвала бурную дискуссию, в ходе которой выяснилось, что AVX/AVX2 на самом деле есть в десктопных CPU, нет только AVX512. Поэтому продолжаем знакомиться с SIMD, но уже с современной его частью — AVX. А так же разберём некоторые комментарии:
- медленнее ли
_mm256_load_si256, чем прямое обращение к памяти? - влияет ли на скорость использование AVX команд над SSE регистрами?
- действительно ли так плохо использовать
_popcnt?Читать полностью »
Ускоряем неускоряемое или знакомимся с SIMD
2019-02-17 в 9:17, admin, рубрики: C, c++, simd, sse, высокая производительность, ПроцессорыЕсть класс задач, которые нельзя ускорить за счёт оптимизации алгоритмов, а ускорить надо. В этой практически тупиковой ситуации к нам на помощь приходят разработчики процессоров, которые сделали команды, позволяющие выполнять операции на большим количеством данных за одну операцию. В случае x86 процессоров это инструкции сделанные в расширениях MMX, SSE, SSE2, SSE3, SSE4, SSE4.1, SSE4.2, AVX, AVX2, AVX512.
В качестве «подопытного кролика» я взял следующую задачу:
Есть неупорядоченный массив arr с числами типа uint16_t. Необходимо найти количество вхождений числа v в массив arr.
Классическое решение, работающее за линейное время выглядит так:
int64_t cnt = 0;
for (int i = 0; i < ARR_SIZE; ++i)
if (arr[i] == v)
++cnt;
В таком виде бенчмарк показывает следующие результаты:
------------------------------------------------------------
Benchmark Time CPU Iterations
------------------------------------------------------------
BM_Count 2084 ns 2084 ns 333079
Под катом я покажу как его ускорить в 5+ раз.
Читать полностью »
