2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3
 
 Re: Приемы программирования SSE/AVX [Обмен опытом]
Сообщение18.04.2022, 22:57 


12/07/21
108
Для тех, кто не хочет связываться с ассемблером, используйте книгу 2022'го года, где используется C++ SIMD: почти для каждой ассемблерной команды существует соответствующая функция С++ SIMD (AVX, AVX2, AV-512). Эти функции позволяют многократно увеличить скорость расчетов во многих задачах.

 Профиль  
                  
 
 Re: Приемы программирования SSE/AVX [Обмен опытом]
Сообщение19.04.2022, 17:33 
Заслуженный участник


20/08/14
11697
Россия, Москва
traffic_lights
Если Вы про инстриксы, то это фактически тот же асм код (только без заморочек с распределением регистров) и для получения высокой скорости таки придётся изучать архитектуру процессора и особенности выполнения им всех этих SIMD команд. И перекладывание мороки с распределением регистров на компилятор C++ уж точно не добавит скорости, только удобства написания кода. Для очень простых вещей можно получить ту же скорость, для чуть более сложных вряд ли: компилятор C++ как минимум понаставит сохранений/чтений промежуточных переменных, которые могут быть и ненужными. Ну и многие из описанных мной выше трюков никакой компилятор сам не сдюжит.
Кто не хочет изучать ассемблер внутреннюю архитектуру процессоров (сам язык ассемблера тут вторичен, первичен процессор и его система команд), тот довольствуется качеством компиляции с ЯВУ и соответствующей скоростью выполнения. Быстрее чем без SIMD, но медленнее возможного.

 Профиль  
                  
 
 Re: Приемы программирования SSE/AVX [Обмен опытом]
Сообщение19.04.2022, 20:53 


12/07/21
108
Dmitriy40 в сообщении #1553049 писал(а):
traffic_lights
...Для очень простых вещей...

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

 Профиль  
                  
 
 Re: Приемы программирования SSE/AVX [Обмен опытом]
Сообщение19.04.2022, 21:57 
Заслуженный участник


20/08/14
11697
Россия, Москва
traffic_lights в сообщении #1553062 писал(а):
Перемножение матриц - это простая вещь с точки зрения алгоритмической реализации? И вообще, практически вся линейная алгебра.
А Вы попробуйте написать высокопроизводительный код для этой (или любой другой) операции и увидите, сложно это или просто. Только без использования готовых вручную оптимизированных библиотек на ассемблере. И попытайтесь получить близкую к пиковой скорость, ага. :facepalm:
Уверяю, все те советы из 15-й главы просмотренной мною книги — это лишь самая простая половина от необходимого. Про ассоциативность кэша там что-то сказано? Будет у Вас больше 8-ми выравненных объектов в L1/L2 (или 2-4 в L3 при многопоточности), как все и везде советуют (и в основном правильно) — и помашите ручкой высокой скорости выполнения. Про константы в памяти вместо регистров уже говорил.
Ну и если вам так важна линейная алгебра, то не парьтесь с изучением ассемблера и архитектуры процессора и берите готовые библиотеки, там уже всё грамотно оптимизировано.

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

 Профиль  
                  
 
 Re: Приемы программирования SSE/AVX [Обмен опытом]
Сообщение19.04.2022, 22:16 


12/07/21
108
Dmitriy40 в сообщении #1553066 писал(а):
traffic_lights в сообщении #1553062 писал(а):
Перемножение матриц - это простая вещь с точки зрения алгоритмической реализации? И вообще, практически вся линейная алгебра.
А Вы попробуйте ...

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

 Профиль  
                  
 
 Re: Приемы программирования SSE/AVX [Обмен опытом]
Сообщение19.04.2022, 22:25 
Заслуженный участник


20/08/14
11697
Россия, Москва
Прекрасно! Тогда Ваш вопрос ко мне вообще непонятен.
Если не согласны с моей оценкой книги, то так и пишите, в чём именно.
Если в том что можно обойтись одними инстриксами в С++ без знания о работе процессора внутри — ну, это моё мнение, я считаю нельзя.

 Профиль  
                  
 
 Re: Приемы программирования SSE/AVX [Обмен опытом]
Сообщение21.04.2022, 10:59 


12/07/21
108
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 


12/07/21
108
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 


12/07/21
108
dgemm Intel MKL (экзешник > 8 мегабайт :D ) является грамотной имплементацией dgemm LAPACK. Используя intrinsic-функции, можно развернуть dgemm LAPACK до несколько тысяч строк исходного кода, но разрыв в скоростях мне преодолеть не удалось (30%, что является неплохим результатом).

 Профиль  
                  
 
 Re: Приемы программирования SSE/AVX [Обмен опытом]
Сообщение07.11.2022, 15:57 


12/07/21
108
Собственно говоря, использование функции dgemm перемножения матриц носит в основном вспомогательный характер: скорость всех основных функций линейной алгебры падает в десятки раз без ее использования. Я использую ее в основном в спектральных задачах большой размерности (диагонализация плотных вещественных симметричных упакованных матриц вплоть до размерности матриц 120 000 * 120 000 при 128 гигабайт оперативной памяти). Алгоритм заключительного этапа диагонализации мною опубликован и его Intel MKL слямзило без всяких ссылок на меня. Им осталось только разобраться в первых двух этапах диагонализации и тогда они не будут отставать в два раза от меня в скорости.

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


07/02/12
1432
Питер

(Оффтоп)

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

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 41 ]  На страницу Пред.  1, 2, 3

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group