2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1, 2, 3
 
 Re: Приемы программирования SSE/AVX [Обмен опытом]
Сообщение18.04.2022, 22:57 
Для тех, кто не хочет связываться с ассемблером, используйте книгу 2022'го года, где используется C++ SIMD: почти для каждой ассемблерной команды существует соответствующая функция С++ SIMD (AVX, AVX2, AV-512). Эти функции позволяют многократно увеличить скорость расчетов во многих задачах.

 
 
 
 Re: Приемы программирования SSE/AVX [Обмен опытом]
Сообщение19.04.2022, 17:33 
traffic_lights
Если Вы про инстриксы, то это фактически тот же асм код (только без заморочек с распределением регистров) и для получения высокой скорости таки придётся изучать архитектуру процессора и особенности выполнения им всех этих SIMD команд. И перекладывание мороки с распределением регистров на компилятор C++ уж точно не добавит скорости, только удобства написания кода. Для очень простых вещей можно получить ту же скорость, для чуть более сложных вряд ли: компилятор C++ как минимум понаставит сохранений/чтений промежуточных переменных, которые могут быть и ненужными. Ну и многие из описанных мной выше трюков никакой компилятор сам не сдюжит.
Кто не хочет изучать ассемблер внутреннюю архитектуру процессоров (сам язык ассемблера тут вторичен, первичен процессор и его система команд), тот довольствуется качеством компиляции с ЯВУ и соответствующей скоростью выполнения. Быстрее чем без SIMD, но медленнее возможного.

 
 
 
 Re: Приемы программирования SSE/AVX [Обмен опытом]
Сообщение19.04.2022, 20:53 
Dmitriy40 в сообщении #1553049 писал(а):
traffic_lights
...Для очень простых вещей...

Перемножение матриц - это простая вещь с точки зрения алгоритмической реализации? И вообще, практически вся линейная алгебра.

 
 
 
 Re: Приемы программирования SSE/AVX [Обмен опытом]
Сообщение19.04.2022, 21:57 
traffic_lights в сообщении #1553062 писал(а):
Перемножение матриц - это простая вещь с точки зрения алгоритмической реализации? И вообще, практически вся линейная алгебра.
А Вы попробуйте написать высокопроизводительный код для этой (или любой другой) операции и увидите, сложно это или просто. Только без использования готовых вручную оптимизированных библиотек на ассемблере. И попытайтесь получить близкую к пиковой скорость, ага. :facepalm:
Уверяю, все те советы из 15-й главы просмотренной мною книги — это лишь самая простая половина от необходимого. Про ассоциативность кэша там что-то сказано? Будет у Вас больше 8-ми выравненных объектов в L1/L2 (или 2-4 в L3 при многопоточности), как все и везде советуют (и в основном правильно) — и помашите ручкой высокой скорости выполнения. Про константы в памяти вместо регистров уже говорил.
Ну и если вам так важна линейная алгебра, то не парьтесь с изучением ассемблера и архитектуры процессора и берите готовые библиотеки, там уже всё грамотно оптимизировано.

А вот например максимально быстро сотни миллионов раз сложить два числа по миллиарду цифр в десятичном виде (не двоичных!) ... Такого никому не нужно и почти никто не занимался. И кстати это хороший пример, те люди писали как раз на С с инстриктами (вашими SIMD функциями), у меня вручную написанный код на асме оказался вдвое быстрее на той же аппаратуре, хотя по принципу построения весьма схож (а процентов на 70 и просто совпадает), но "дьявол в деталях" как обычно. А ведь эта задача считалась лет 10 непрерывно (не мной) ...

 
 
 
 Re: Приемы программирования SSE/AVX [Обмен опытом]
Сообщение19.04.2022, 22:16 
Dmitriy40 в сообщении #1553066 писал(а):
traffic_lights в сообщении #1553062 писал(а):
Перемножение матриц - это простая вещь с точки зрения алгоритмической реализации? И вообще, практически вся линейная алгебра.
А Вы попробуйте ...

Уже давно попробовал и публикации есть. Например, трехдиагонализация вещественной симметричной упакованной матрицы у меня в два раза быстрей, чем в Intel MKL.

 
 
 
 Re: Приемы программирования SSE/AVX [Обмен опытом]
Сообщение19.04.2022, 22:25 
Прекрасно! Тогда Ваш вопрос ко мне вообще непонятен.
Если не согласны с моей оценкой книги, то так и пишите, в чём именно.
Если в том что можно обойтись одними инстриксами в С++ без знания о работе процессора внутри — ну, это моё мнение, я считаю нельзя.

 
 
 
 Re: Приемы программирования SSE/AVX [Обмен опытом]
Сообщение21.04.2022, 10:59 
traffic_lights в сообщении #1552916 писал(а):
traffic_lights в сообщении #1552323 писал(а):
Появилась в свободном доступе
Daniel Kusswurm
Modern Parallel Programming with C++ and Assembly Language (X86 SIMD Development Using AVX, AVX2, and AVX-512) (2022)

Примеры исходного кода этой книги должны быть здесь: https://github.com/Apress/modern-parall ... p-assembly, но отсутствуют.

Сейчас код доступен. Проверил все примеры (Visual Studio 2022 профессиональная версия): ошибок не обнаружил.

-- 21.04.2022, 11:57 --

Информация об одном из моих процессоров с помощью примера из книги "Modern Parallel Programming with C++ and Assembly Language":
----- Processor Info -----
Processor vendor: GenuineIntel
Processor brand: Intel(R) Core(TM) i9-9920X CPU @ 3.50GHz

----- Cache Info -----
Cache L1: 32 KB - Data
Cache L1: 32 KB - Instruction
Cache L2: 1024 KB - Unified
Cache L3: 19712 KB - Unified

----- Processor CPUID Feature Flags -----
FMA: 1
AVX: 1
AVX2: 1
AVX512F: 1
AVX512CD: 1
AVX512DQ: 1
AVX512BW: 1
AVX512VL: 1
AVX512_IFMA: 0
AVX512_VBMI: 0
AVX512_VNNI: 0
AVX512_VPOPCNTDQ: 0
AVX512_VBMI2: 0
AVX512_BITALG: 0
AVX512_BF16: 0
AVX512_VP2INTERSECT: 0
AVX512_FP16: 0

 
 
 
 Re: Приемы программирования SSE/AVX [Обмен опытом]
Сообщение04.11.2022, 00:10 
traffic_lights в сообщении #1553157 писал(а):
Информация об одном из моих процессоров с помощью примера из книги "Modern Parallel Programming with C++ and Assembly Language":
----- Processor Info -----
...
Processor brand: Intel(R) Core(TM) i9-9920X CPU @ 3.50GHz
...

dgemm Intel MKL перемножает на этом процессоре (avx-512, 12 ядер) две квадратные матрицы 70 000 * 70 000 за 10 мин. 40 сек. При этом частота процессора из-за avx-512 снижается до 3.09 GHz. Т.о. имеем
70000 ^ 3 * 2 = 686 000 000 000 000
3.09 * 10^9 * 4 * 12 * 8 * 640 = 759 398 400 000 000
Следовательно КПД процессора - 90.3 % при частоте 3.09 GHz.

 
 
 
 Re: Приемы программирования SSE/AVX [Обмен опытом]
Сообщение05.11.2022, 08:35 
dgemm Intel MKL (экзешник > 8 мегабайт :D ) является грамотной имплементацией dgemm LAPACK. Используя intrinsic-функции, можно развернуть dgemm LAPACK до несколько тысяч строк исходного кода, но разрыв в скоростях мне преодолеть не удалось (30%, что является неплохим результатом).

 
 
 
 Re: Приемы программирования SSE/AVX [Обмен опытом]
Сообщение07.11.2022, 15:57 
Собственно говоря, использование функции dgemm перемножения матриц носит в основном вспомогательный характер: скорость всех основных функций линейной алгебры падает в десятки раз без ее использования. Я использую ее в основном в спектральных задачах большой размерности (диагонализация плотных вещественных симметричных упакованных матриц вплоть до размерности матриц 120 000 * 120 000 при 128 гигабайт оперативной памяти). Алгоритм заключительного этапа диагонализации мною опубликован и его Intel MKL слямзило без всяких ссылок на меня. Им осталось только разобраться в первых двух этапах диагонализации и тогда они не будут отставать в два раза от меня в скорости.

 
 
 
 Re: Приемы программирования SSE/AVX [Обмен опытом]
Сообщение16.10.2023, 21:04 
Аватара пользователя

(Оффтоп)

traffic_lights в сообщении #1569224 писал(а):
Я использую ее в основном в спектральных задачах большой размерности

А вы не пробовали для этого использовать GPU-шейдеры в Intel для решения таких задач? Какой-нибудь Iris, кусками данные в текстуры заворачивать через shared-память и обрабатывать, если задача делится, конечно.

 
 
 [ Сообщений: 41 ]  На страницу Пред.  1, 2, 3


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group