Разработка DSP-библиотеки / Низкоуровневые оптимизации / Программирование в 80-90-е
ฝัง
- เผยแพร่เมื่อ 20 ก.ค. 2024
- В гостях у «Битовых масок» - Игорь Астахов, инженер-программист, который разрабатывает высокопроизводительные библиотеки и занимается низкоуровневыми оптимизациями уже 25 лет. Он начал строить карьеру во времена, когда компьютеры были размером со шкаф, и стал сотрудником Intel в конце 90-х годов. Сейчас Игорь занимается оптимизацией реализаций различных DSP-алгоритмов в YADRO. Ведущие подкаста поговорили с ним о том, как писали машинный код три десятилетия назад, об особенностях высокоэффективного кода, векторизации и акселераторах.
Правда ли раньше писали и дебажили код на бумажке? До сих пор ли пишут на ассемблере для получения наилучшей производительности? Почему Intel Itanium - идеальный процессор? Как работают над переносом библиотеки на архитектуру, которая еще не появилась? Сможет ли AI создать высокопроизводительный код? Обсуждение этих и других вопросов ждет вас в тринадцатом выпуске «Битовых масок».
· Упомянутый доклад Валерии Пузиковой «Матричные расширения RISC-V»: • Матричные расширения R...
· Подписывайтесь на Telegram-канал подкаста: t.me/+bx50QfUlw4pkZDEy
🔹 Как попасть в команду YADRO? careers.yadro.com
🎧 Слушайте «Битовые маски» на других платформах:
Яндекс.Музыка: music.yandex.com/album/26508178
Apple Podcasts: podcasts.apple.com/ru/podcast...
Все платформы: engineer.yadro.com/podcasts/c...
00:00:00 - Тизер
00:00:38 - Представление Игоря Астахова
00:01:31 - Как программировали в 80-90-е
00:12:03 - Появление первого офиса Intel в России
00:13:51 - Разработка высокопроизводительной библиотеки в Intel
00:19:26 - Почему Itanium - идеальный процессор?
00:25:53 - Идеальный код с точки зрения разработчика низкоуровневых оптимизаций
00:30:52 - Переход с ассемблера на интринсики
00:33:37 - Оптимизация самых популярных функций
00:37:31 - Измерение производительности низкоуровневых оптимизаций
00:41:55 - Performance-проблема на микроархитектурном уровне
00:48:28 - Взаимодействие с разработчиками процессоров
00:52:23 - Влияние руководителей на путь Intel
00:55:13 - Возможна ли реализация на С без интринсиков для низкоуровневых оптимизаций
00:59:16 - Методология разработки высокопроизводительных функций
01:09:33 - Работа с акселераторами
01:14:18 - Векторизация - основной способ оптимизации
01:16:55 - Может, надо такую библиотеку писать на C++?
01:18:59 - Какой тулинг используют
01:20:45 - Насколько перспективны новые технологии ИИ
01:23:05 - Заключение
#dsp #intel #assembler #c #performance #оптимизация - วิทยาศาสตร์และเทคโนโลยี
Спасибо за интервью, помогает вспомнить что делал в университетское время... Если до сих пор работают такие люди - еще не все потеряно )
Спасибо вам! Нам тоже радостно работать бок о бок с такими профессионалами!
Как правильно заметил Астахов про оптимизацию алгоритмов свёртки сигналов посредством перехода из времЕнной области в частотную (ДПФ) и обратно, существенно сокращается время вычислений прохождения сигнала через фильтр. Гениальный подход, придуманный много десятилетий назад, позволяющий строить менее требовательные к аппаратному обеспечению системы. Ещё будучи студентом восхищался такими фокусами с преобразованием Фурье, особенно при взятии "неберущихся" интегралов :)
Вот, это настоящий инженер. Интересно, чем занимаются такие люди.
Спасибо! Стремимся выбирать интересных гостей!
Ничем. Они кодили в те времена, когда ты приходишь и на Си + asm пишешь такой говнокод, что ужас. Всё в монолитах и экстернах. Пишет какое-то Фурье или FFT на массивчиках. Больше ничего. Скорее всего он не сможет написать SQL-запрос даже для простейшей СУБД. Не говоря уже о том, чо NoSQL или темболее NewSQL.
Возможно он из головы напишет какой-то FFT на C + SIMD, но это уже не нужно.
@@MaruiInfantry на самом деле печально, что такие люди мнение востребованы на рынке труда, мне кажется, это несправедливым. Ведь они обладают уникальным опытом.
@@MaruiInfantry мы например пишем те самые sql-движки :) или те же FFT, которые улучшают качество твоих фоток. или библиотеки deep learning, которые используют для LLM
@@usergnusmas6879 они не востребованы в небольших компаниях. в янлексе или вк такие люди уже есть. в гугле или ms их сильно больше. плюс есть технологические стартапы, типа clickhouse
Елы палы, 30 лет в программировании, но только правда в основном прикладных задач, свое время от нечего делать наизусть учил книжку по процессорам Интел пятого поколения, правда в реальной жизни эти предметные знания так и не пригодилось, а сейчас даже половину сказанного плохо понимаю, о чем дядька говорит.
Собственно, от программирования ПК давно ушел в область программирования МК, а теперь еще и ПЛИС, там интересней, по тому что в одиночку можешь делать и сопровождать готовые проекты под МК, считай все время делать свои собственные почти уникальные мини системы, это доставляет больше удовольствия. А программирование реальных приложений ПК, это в основном командная работа, что меня никак не привлекает.
Большое спасибо, за такие интервью, очень интересно 😊
Рады, что вам понравился выпуск!
Как же круто!
Интересно. Спасибо
Приятно! Спасибо вам!
Очень крутой выпуск!!!
Спасибо! Рады, что было интересно!
IIR без обратной связи это как? Хотелось бы посмотреть на блок схему, и чуть подробнее о перерасчёте коэффициентов. Статьи на эту тему не публиковали, где нибудь на IEEE?
Статью такую не готовили ещё, но спасибо за идею! Если опубликуем, то пришлем в эту ветку ссылку :)
1. у dec были только 12, 16, 18, 32, 36 и 64-битные машинки. а 24-битным был, например, первый миник cdc
2. первая реализация бейсика была компилирующей, многопользовательской, со встроенным многопользовательским редактором и требовала для работы двух компов с памятью тоже несколько десятков КБ
3. у P4 был именно кеш декодированных инструкций (Trace cache), а декодирование шло по одной инструкции за такт
Если ИИ помог генерализовать математику - значит математик был не очень сильным - кто-то генерализовал до него и дал почитать нейросети ;)
хотелось бы, чтобы не перебивали гостя
Иногда так увлекаешься беседой, что не можешь сдержаться :))
Помню, когда телекоммуникационный доступ появился (примус), мой товарищ - он был старше на 3 года, посетовал, что терминалы развращают, мол, когда на перфокартах работали, программы вылизывали до последнего символа. Хотя на отдел нам давали 45 мин машинного времени...
Народ, объясните, что за ботва с AVX2 и AVX512, они там совсем обленилсь?! Вот раньше был MMX, на нём были унпаки: bw, wd, dq. Потом MMX удвоился до SSE2, на него перенеслись те же унпаки с той же логикой. А последующие удвоения до AVX2 и затем до AVX512 старую логику не сохранили. Неужели так сложно было? Раньше как-то справлялись, а теперь почему-то нет. Теперь там работа идёт с отдельными 128-битными блоками. Одна половина не знает, что делает другая. Если на AVX2 логику унпаков можно починить, добавив парочку _mm256_permute2f128_si256(), то на AVX512 подобного, получается, вообще нету!
Тебе к мужику с видео надо...
Одной из ключевых особенностей AVX-512 является введение маскирования. Маскирование позволяет выполнять операции над выбранными элементами вектора, игнорируя остальные. Это даёт программистам больше контроля над тем, какие данные обрабатываются, и может помочь оптимизировать вычисления, избегая ненужных операций.
Пример использования маскирования в AVX-512:
__m512i a = _mm512_set1_epi32(10); // Вектор A заполнен числом 10
__m512i b = _mm512_set1_epi32(20); // Вектор B заполнен числом 20
__mmask16 mask = 0b1010101010101010; // Маска для выбора каждого второго элемента
// Сложение с использованием маски: только элементы, соответствующие маске, будут сложены
__m512i result = _mm512_mask_add_epi32(a, mask, a, b);
В этом примере, только элементы вектора a, которые соответствуют маске mask, будут сложены с соответствующими элементами вектора b.
Также AVX-512 вводит операции с разреженными данными и конфликтные инструкции обнаружения, которые могут быть полезны для оптимизации алгоритмов с непредсказуемым доступом к памяти.
Использование векторизации для умножения двух матриц может быть реализовано следующим образом:
void matrix_multiply_avx512(float* A, float* B, float* C, int N) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
__m512 sum = _mm512_setzero_ps();
for (int k = 0; k < N; k += 16) {
__m512 a = _mm512_load_ps(A + i * N + k);
__m512 b = _mm512_load_ps(B + k * N + j);
sum = _mm512_fmadd_ps(a, b, sum);
}
_mm512_store_ps(C + i * N + j, sum);
}
}
}
Маскирование в AVX-512 позволяет выполнять операции только над теми элементами данных, которые соответствуют определённому условию. Это может быть полезно, например, при обработке данных с пропусками или при выполнении операций, которые должны быть применены не ко всем элементам массива.
__m512i data = _mm512_load_epi32(...); // Загрузка данных
__mmask16 mask = _mm512_cmp_epi32_mask(data, _mm512_set1_epi32(0), _MM_CMPINT_NE); // Создание маски для ненулевых элементов
__m512i result = _mm512_mask_add_epi32(_mm512_set1_epi32(1), mask, data, _mm512_set1_epi32(100)); Прибавление 100 только к ненулевым элементам
AVX-512 вводит специальные инструкции для работы с разреженными данными, что может быть полезно в областях, где данные естественным образом разрежены, например, в графовых вычислениях или при обработке больших наборов данных с множеством пропусков.
1. avx2 был оптмизирован под реализацию на двух отдельных 128-битных EU, поэтому в нём такая ебанутая логика
2. в avx512 вроде есть универсальный шафл, его недостаточно?
The best video
Ничо не понял, но очень интересно! Выпуск кайф
Я только Basic на MSX застал в 8х г. Ассемблер до сих пор не освоил.
Не эффективных математических алгоритмов не бывает - они все зависят от исполняющего это калькулятора. Т.е. всегда можно подобрать такую архитектуру, где "не эффективный" алгоритм будет быстрее чем другой.
PDP 11, сиречь Электроника 60.
Писал в кодах, прикольно.
Такие фокусы можно было творить.
А что, полный доступ, делай что хошь.
arm архитектуру и оперативную память на тот же кристалл. И никаких конвейеров или кешей. Микропрограммы тоже в оперативку. Скорость +20х и немного отставание из за конвейеров. В целом - чуть лучше интела и дешевле и частоты тактовой хватит. А для PC программ - эмулятор.
кто в курсе? что за код на интенсиках,? что за интенсики?
Речь про интринсики (intrinsic). Вот здесь неплохо объясняют: ru.stackoverflow.com/questions/621215/Что-такое-интринсики-intrinsics/621239#621239
Векторизация - основной метод ускорения потому, что это фактически перестройка задачи под параллельную архитектуру. Такую задачу легко автоматически раскидать на множество исполнителей.
Уже нет. Щас всё на GPU считают уже лет 15+. CUDA вышла в 2007 году.
@@MaruiInfantry а на гпу не используется векторизация???
@@101picofarad О чём вы? Всем же известно, что если исполнять код на GPU, предварительно сдобрив CUDA, то получим топ перформанс. Оптимизаций не требуется от слова совсем, главное - верить в технологию - и она не подведёт👌🏻
@@VRchitecture матлаб мне сказал что мой кривой код на амд 7840hs выполняется быстрее чем на куде 3070 ;)
(наверное матлаб не правильно верит)
@@101picofaradвсё зависит от задачи. Вполне реальная ситуация - CPU обсчитывает данные медленнее, но это компенсируется более быстрым их считыванием из памяти и записью результата обратно.
В любом случае, NVIDIA + CUDA круче всех по определению (ну зачем маркетологам врать?)
Я понимаю, что это не намеренное, но из-за постоянных усмешек складывается впечатление, будто человека пригласили, чтобы над ним поугарать. Такое себе
Он рассказывает жесть, она звучит как настоящий анекдот, она вызывает сильный шок и удивление. В другой ситуации они бы плакали от того что он говорит, а тут снимают состояние смехом. И явно же не над ним, что за бред.
ведущим лучше молчать или кивать
Предвосхищаем следующие комменты: "Ведущие воды в рот набрали, нечего сказать?" ))
Тру
Хочу в Ядро!
Заглядывайте сюда: careers.yadro.com ;)
@@ultimate_engineer заглядывал, не взяли :-)