I want a good parallel language [video]
Извините, но вы предоставили только навигационное меню и футер сайта YouTube, но не саму статью для пересказа. Чтобы я мог создать точный и ёмкий пересказ в формате Markdown на русском языке, мне нужен основной текст статьи, который нужно обобщить. Пожалуйста, предоставьте содержание статьи, и я с радостью подготовлю для вас пересказ согласно указанным требованиям.
Комментарии (45)
- Обсуждение вращается вокруг поиска «идеального» языка для GPU-программирования, но при этом не предлагается конкретный язык, а вместо этого обсуждаются причины, по которым такой язык ещё не существует.
- Участники упоминают Futhark как единственный существующий пример языка, который хоть как-то приближается к идеалу, но при этом подчеркивается, что даже Futhark не предоставляет нужные абстракции и что его синтаксис не оптимален.
- Обсуждается, что вместо поиска универсального языка, фокус на специфичных библиотеках вроде cuDF, RAPIDS и т.д. может быть более продуктивен, но при этом такие библиотеки не решают проблему в целом.
- Участники также обсуждают, что вместо попыток создать новый язык, мог бы быть лучше улучшить существующие языки, но при этом такие улучшения не решают фундаментальные проблемы отсутствия нужных абстракций в этих языках.
- В конце концов, обсуждение сводится к тому, что идеальный язык должен предоставлять способ выразить вычисления как последовательность операций над масивами, что является фундаментальным способом выражения вычислений в параллельных системах, но никакой из существующих языков это не делает.
The G in GPU is for Graphics damnit
Автор делится опытом оптимизации модели Physarum polycephalum (слизевика) на GPU с использованием Triton. Модель имитирует поведение агентов, оставляющих феромонные следы и реагирующих на их концентрацию. Изначальная реализация на PyTorch страдала от накладных расходов на инициализацию и низкой утилизации GPU из-за мелких операций.
Профилирование выявило, что основные узкие места — этапы сенсоров, движения и диффузии. Автор переписал ключевые части на Triton, объединив сенсорный и двигательный этапы в один ядро и используя атомарные операции для депозиции феромонов. Это позволило добиться 10-кратного ускорения и полной загрузки GPU, подтвердив, что Triton эффективен для задач с мелкозернистым параллелизмом.
Комментарии (75)
- Обсуждается переименование GPU в MPU (Matrix Processing Units) из-за их доминирующего использования в AI, а не графике.
- Поднимается вопрос о том, имеют ли современные AI-ускорители (например, NVIDIA H100) графические выходы и функциональность, поскольку она им не нужна.
- Утверждается, что специализированные GPU для игр теряют актуальность из-за роста мощности интегрированных графических решений (APU) от многих вендоров.
- Обсуждается, что название (GPU) не ограничивает функциональность инструмента, который эволюционирует и находит новое применение (майнинг, AI).
- Высказывается мнение, что CPUs могут обеспечивать лучшее качество рендеринга изображений (прецизионность), хотя и значительно медленнее, чем GPU.
We bought the whole GPU, so we're damn well going to use the whole GPU 🔥 Горячее
Исследователи из Hazy Research разработали высокопроизводительный мегаядро для тензорно-параллельного вывода Llama-70B на H100, которое агрессивно перекрывает вычисления, работу с памятью и коммуникацию между GPU. Это позволяет одновременно задействовать различные аппаратные ресурсы: тензорные ядра, модули для нетензорных операций, пропускную способность HBM и NVLink. В интеграции с движком Tokasaurus их решение превосходит SGLang на >22% по общей пропускной способности при обработке 65 536 промптов из ShareGPT.
Ключевая идея — использование интерпретатора инструкций, работающего на каждом SM, который позволяет гибко планировать выполнение разнородных операций. Это обеспечивает перекрытие на нескольких уровнях: внутри SM (память и вычисления), между SM (матричные умножения и нормирование) и между GPU (скрытие задержек связи за счёт специальных потоков). Особенно отмечается простота реализации сложных трансформаций данных между GPU прямо после attention-слоя, что трудно выразить стандартными средствами коммуникации.
Комментарии (94)
- Обсуждение эффективности использования GPU: использование всех блоков (NVDEC, NVJPG, RT и тензорные ядра) для декомпрессии весов и вычислений, аналогии с оптимизацией под консоли.
- Проблемы инструментов и драйверов: отставание языков, библиотек и драйверов от возможностей современного железа, сложности компиляторов для гетерогенных систем.
- Виртуализация и разделение ресурсов GPU: обсуждение MIG, MPS для многопользовательского использования, риски утечки данных и ограничения этих технологий.
- Сравнение с другими платформами: упоминание Apple Metal и открытости драйверов, потенциал использования GPU для аудиообработки и сигналов.
- Критика и ирония: сравнение стиля статьи с "Трансгрессия границ", комментарии о "коде, который не предназначен для поддержки" и неожиданно доступных оптимизациях в крупных лабораториях.
Beyond OpenMP in C++ and Rust: Taskflow, Rayon, Fork Union
Многие библиотеки для параллельных вычислений в C++ и Rust, такие как Taskflow и Rayon, оказываются в 10 раз медленнее OpenMP в задачах типа fork-join из-за избыточных абстракций. Автор выделяет четыре ключевых фактора снижения производительности: блокировки с системными вызовами, аллокации памяти в очередях задач, дорогостоящие атомарные операции и ложное разделение кэш-линий.
В ответ создана минималистичная библиотека Fork Union объёмом около 300 строк, которая использует только стандартные средства C++ и Rust и демонстрирует производительность в пределах 20% от OpenMP. Бенчмарки на AWS Graviton 4 с 96 ядрами показывают, что Fork Union достигает 467 МБ/с против 585 МБ/с у OpenMP, в то время как Rayon и Taskflow отстают значительно. Вывод: для блокирующих fork-join нагрузок асинхронные пулы задач неоправданно тяжелы.
Комментарии (27)
- Автор библиотеки fork_union сообщает об улучшениях, особенно для Linux NUMA-систем, и приветствует предложения по её развитию.
- Пользователи отмечают значительное ускорение работы по сравнению с другими решениями (например, Rayon), но указывают на проблемы с потреблением CPU из-за busy wait.
- Обсуждаются технические детали реализации: диспетчеризация работы, обработка неоднородных нагрузок, энергоэффективность busy-wait и отсутствие аллокаций после инициализации.
- Проводятся сравнения с альтернативными библиотеками и подходами (TBB, heartbeat scheduling, Tokio) и обсуждаются возможные варианты применения, например, в веб-серверах.
- Отмечается сложность создания удобных и безопасных API для Rust из-за особенностей работы с памятью в высокопроизводительном параллельном коде.
Were RNNs all we needed? A GPU programming perspective
Упрощённые версии GRU и LSTM (minGRU и minLSTM) позволяют заменить последовательные вычисления на параллельные, устраняя зависимость скрытого состояния от предыдущего шага. Это достигается за счёт переопределения гейтов так, чтобы они зависели только от текущего входа, что превращает рекуррентное обновление в линейную форму, разрешимую алгоритмом параллельного сканирования (scan). Такой подход сокращает сложность с O(T) до O(log T), что критично для ускорения на GPU.
Реализация на CUDA демонстрирует значительное ускорение: для последовательностей длиной 65 536 шагов время выполнения сокращается с ~13 секунд на CPU до ~5,3 секунд на GPU для GRU и с ~13 до ~6,7 секунд для LSTM. На коротких последовательностях (T < 2048) преимущество менее выражено из-за накладных расходов на распараллеливание, но с ростом длины масштабирование становится явным. Это подтверждает, что даже минимальные изменения в архитектуре RNN могут радикально улучшить их производительность на параллельных вычислениях.
Комментарии (23)
- Обсуждаются архитектурные ограничения классических RNN/LSTM, в частности их последовательная природа, препятствующая эффективному распараллеливанию на GPU.
- Представлены упрощённые модели (minGRU, minLSTM) и альтернативные архитектуры (например, RWKV), которые пытаются устранить эти ограничения и конкурировать с трансформерами.
- Поднимается вопрос о возможности параллельного обучения RNN на разных независимых текстах (книгах) и обсуждаются сложности синхронизации градиентов.
- Уточняется, что мозг человека вряд ли является RNN, и выдвигаются альтернативные гипотезы о его работе, например, как модели поиска устойчивого состояния (equilibrium model).
- Обсуждается исторический контекст: почему трансформеры, несмотря на потенциальную эффективность RNN, стали доминировать благодаря лучшей параллелизации обучения.
Fil's Unbelievable Garbage Collector 🔥 Горячее 💬 Длинная дискуссия
Fil-C — это C/C++-совместимый язык с безопасной памятью и современным инструментарием. Его сердце — FUGC, параллельный, конкурентный, точный, неперемещающий сборщик мусора.
Ключевые черты FUGC
- Параллельность: маркировка и очистка выполняются на всех ядрах.
- Конкурентность: потоки-мутаторы не останавливаются; блокировки только на медленных путях аллокации.
- On-the-fly: нет глобальной паузы; «мягкие рукопожатия» просят потоки асинхронно сканировать стек.
- Grey-stack: повторное сканирование стеков до фикс-поинта; барьер только при записи, быстрая сходимость.
- Dijkstra-barrier: при записи указателя объект помечается CAS-relaxed.
- Точность: LLVM-плагин
FilPizlonatorточно знает, где все указатели. - Неперемещаемость: объекты не двигаются; освобождённые блоки «перенаправляются» через InvisiCap.
Safepoint-механизм
- Компилятор вставляет
pollcheck: быстрая проверка или колбэк для GC. - «Мягкое рукопожатие» запускает колбэк на всех потоках.
- Состояния enter/exit позволяют блокироваться в syscall без pollcheck’ов; GC сам выполняет колбэк для «exited» потоков.
- Safepoint защищает от гонок: загруженный указатель будет жив до следующего safepoint’а.
По желанию можно включить полный stop-the-world (FUGC_STW=1) для fork(2) или отладки.
Комментарии (247)
- Fil-C — это С-компилятор с точным параллельным GC (FUGC) и capability-указателями, позволяющий запускать «как есть» CPython, SQLite, OpenSSH и др., теряя в худшем случае 4× производительности.
- Вместо ручного free и UB-оптимизаций LLVM код живёт под барьером Дейкстры и soft-handshake safepoint’ами; указатели превращаются в «InvisiCap» (base+offset), теряющие силу при приведении к integer.
- Проект исследовательский, но уже промышленно полезен: нет сборок под 32-бит, Windows и embedded без MMU, нет пока поколенческого GC и ARM/RISC-V.
- Споры: «lock-and-key» предсказуемее RAM, но требует атомиков; GC = «мусор потом» vs compile-time проверки; можно ли дождаться AI-стат-анализа вместо Rust-переписей.
Evolving the OCaml Programming Language (2025) [pdf]
- Эволюция OCaml – Ashoka Univ, сент 2025 [pdf][key]
- Авто-проверка реплиц. типов – NUS, авг 2025 [pdf][key]
- AI-инструменты для исследований – IIT Madras, июль 2025 [pdf][key]
- Параллельный рантайм OCaml – Chalmers, май 2025 [pdf][key]
- Авто-проверка реплиц. типов – WG 2.8, май 2025 [pdf][key]
- Параллельный OCaml 5 – Bloomberg, мар 2025 [pdf][key]
- Параллельный OCaml 5 – IIT Gandhinagar, мар 2025 [pdf][key]
- Параллельный OCaml 5 (ч.1) – PACE Lab, фев 2025 [pdf][key]
- Безопасность памяти и ЯП – Schaeffler @ IITM, фев 2025 [pdf][key]
- Мини-ОС через Unikernels – Daekin–IITM, янв 2025 [pdf][key]
- Безопасные Unikernels с аппаратной поддержкой – CAIR DRDO, ноя 2024 [pdf][key]
- Параллельный OCaml 5 – Meta London, сен 2024 [pdf][key]
- Зачем OCaml? – Rezilyens, авг 2024 [pdf][key]
- Эффекты и конкурентность – Chalmers, май 2024 [pdf][key]
- Безопасность функциональных программ – WG 2.8, апр 2024 [pdf][key]
- Композиция библиотек конкурентности – EHOP, июл 2023 [pdf][key]
- Сливаемые реплиц. типы – Collège de France, апр 2023 [pdf][key][видео]
- OCaml 5.0 – OCaml Workshop, сен 2022 [pdf][key]
- Ретрофит конкурентности – ICFP keynote, сен 2022 [pdf][key][видео]
- Сертифицированные сливаемые типы – PLDI, июн 2022 [pdf][key][видео]
- Сертифицированные сливаемые типы – Nomadic Labs, апр 2022 [pdf][key][видео]
- Параллелизм в OCaml – Marigold, дек 2021
- Эффекты в OCaml 5 – Huawei STW, окт 2021 [pdf][key]
- Эффекты в OCaml – SimCorp, сен 2021 [pdf][key]
- Параллелизм в OCaml – SimCorp, сен 2021 [pdf][key]
- ParaFuzz: фаззинг многопоточных программ – Dagstuhl, 2021
Комментарии (30)
- Доклад — субъективный взгляд на 10-летнюю эволюцию OCaml; цель — убрать мистику вокруг разработки компилятора и заманить новых контрибьюторов.
- Главный бытовой pain-point: в стандартной библиотеке исключения — часть API, и они не типизированы, что подрывает «безопасность» языка.
- Выход — использовать Jane Street Core/Base (функции либо возвращают Result, либо помечены _exn), но большинство проектов всё ещё живёт на обычной Stdlib.
- «Большие» альтернативы Stdlib (Core, Base) существуют, но их значение часто преувеличено; официальная библиотека за последние годы всё-таки подросла полезными функциями.
- Новичкам в компиляторщине советуют начинать с мелких багов и мини-Pull Request’ов, а не пытаться сразу «съесть слона».
How to Think About GPUs 🔥 Горячее
Что такое GPU
Современная ML-GPU (H100/B200) — это ~100–150 независимых вычислительных блоков (SM), каждый из которых содержит матричное ядро Tensor Core, векторные ALU (CUDA-ядра) и 256 КБ кэш SMEM. Все SM делят общий L2 и HBM3-память. SM разбит на 4 подблока; каждый подблок выполняет 32 SIMD-операции за такт. GPU-ядро менее мощное, чем TPU TensorCore, но их много, поэтому общая гибкость выше.
Память
H100: 80 ГБ HBM3, 3 ТБ/с. B200: 192 ГБ, 8 ТБ/с. L2 кэш 50 МБ (H100) / 128 МБ (B200). SMEM даёт 256 КБ на SM.
GPU vs TPU на уровне чипа
TPU: 1–2 больших MXU, жёсткая синхронизация, векторная часть слабее. GPU: 100+ мелких ядер, независимые SM, но общий L2 ограничивает масштаб. GPU лучше для разнородных задач, TPU — для чистых матмул.
Сеть внутри узла
Узел = 8 GPU + 2 CPU. GPU соединены NVLink/NVSwitch (900 ГБ/с между любыми двумя). CPU-GPU идут через PCIe 5.0 (64 ГБ/с). NVSwitch-кроссбар внутри узла = полносвязная сеть.
Сеть за пределами узла
InfiniBand HDR/NDR (до 400 Гб/с) или Ethernet RoCE. GPUDirect RDMA позволяет GPU читать/писать память соседнего узла без участия CPU.
Коллективные операции
Intra-node: NCCL использует NVLink; all-reduce 8×H100 за ~3 мкс.
Cross-node: кольцо IB + NVLink; latency ~10 мкс, bandwidth лимит IB.
Roofline-модель для LLM
- Data Parallelism: ограничен IB; эффективен при малых моделях.
- Tensor Parallelism: ограничен NVLink; лучше внутри узла.
- Expert/ Pipeline Parallelism: комбинируем; pipeline глубже → меньше bubble, но больше весов на каждом GPU.
- TLDR: держи параллелизм так, чтобы IB не стал bottleneck; используй NVLink для tensor-parallel, IB для data-parallel.
Итого
GPU — это масса мелких, независимых SM, связанных быстрым NVLink внутри узла и медленным IB между узлами. Для LLM выбирай параллелизм, который минимизирует IB-трафик и максимально использует NVLink.
Комментарии (107)
- Критика точности: документация местами неточна, особенно в определении «CUDA-core».
- Открытость и вендор-лок: ряд участников считают инвестиции в проприетарную экосистему NVIDIA рискованной ставкой.
- Ошибка в расчётах: Quiz 2 преувеличивает пропускную способность; реальные 3,2 ТБ/с ограничены портами NIC.
- Похвала и польза: серия всё же хорошо объясняет принципы параллелизма, применимые и к другим устройствам.
- Сравнение TPU и GPU: TPU проще масштабировать, но закрыт для продажи; GPU NVIDIA гибче, но сложнее в программировании.
- Дефицит официальных данных: NVIDIA не раскрывает полную архитектуру, поэтому полезные модели приходится собирать из сторонних источников.
Комментарии (44)
Hey folks, this is the 7th book in a series of readings I run over Google Groups. There are about 1800 people in the group and 300-800 join each reading. While we often read books on database internals this one seems pretty relevant to any developer working on systems that scale.