Platform-independent SIMD in Go 🔥 Горячее
Экспериментальный пакет golang.org/x/exp/simd предоставляет платформенно-независимый доступ к SIMD-инструкциям в Go, позволяя писать высокопроизводительный код для обработки массивов данных без привязки к конкретной архитектуре. Он абстрагирует низкоуровневые инструкции (такие как SSE, AVX, NEON) через универсальный API, где разработчик описывает операции над векторами, а компилятор и рантайм подбирают оптимальную реализацию под текущее оборудование. Это упрощает написание кода, который одновременно работает эффективно на x86, ARM и других платформах, избегая необходимости вручную писать ветвления по наборам инструкций или использовать cgo/ассемблер.
Пакет поддерживает типизированные векторные типы (например, v128 для 128-битных регистров) и операции над ними: загрузка/сохранение из памяти, арифметика, логические операции, перестановки и редукции. Особое внимание уделено безопасности и предсказуемости: все операции имеют чётко определённое поведение, включая обработку случаев, когда запрашиваемая ширина вектора недоступна на текущей платформе (в этом случае происходит паника или fallback на скалярный код, в зависимости от режима). В экспериментальном режиме пакет позволяет включать автовекторизацию через флаги компилятора, а также предоставляет инструменты для benchmarking и проверки генерации кода. Хотя пакет всё ещё находится в exp и может меняться, он демонстрирует путь к тому, чтобы SIMD стал доступной частью стандартного Go-стека для задач вроде обработки изображений, сигналов, криптографии и научных вычислений.
Комментарии (124)
Экспериментальный пакет simd в Go дает прирост производительности от 30% до 5x по сравнению со скалярным кодом, при этом имея лишь небольшой оверхед относительно платформенно-специфичных реализаций. Это подтверждают тесты @ImJasonH, задачи по обработке видео и аудио (speech-to-text/text-to-speech). SIMD устраняет необходимость в CGO для векторизации, упрощая сборку и убирая зависимости от C/C++. Это делает Go привлекательнее для системных задач, включая разработку баз данных (например, streambed). Технические особенности: — Поддержка архитектур с переменной длиной вектора (SVE, RVV) обеспечивает будущестойкость. — Генерация специализированных версий функций при компиляции исключает runtime-накладные расходы. — Автоматическая векторизация в компиляторе Go (CL 791740) уже в разработке и показывает хорошую эффективность. Рекомендации и альтернативы: — Для максимальной скорости стоит использовать платформенно-специфичный код, оставив портативную реализацию как запасной вариант. — Чтобы сохранить портативность, длину вектора следует ограничивать минимально поддерживаемым размером целевых платформ. — В качестве альтернативы CGO можно использовать Go-ассемблер и пакет unsafe (как в go-pherence). — Предложено создать линтер для автоматической замены числовых циклов на SIMD-операции. Дискуссии: — Некоторые критикуют Go за игнорирование долгосрочных запросов (например, 13-летнее ожидание generics) при внедрении SIMD без явного спроса. — Возник спор о влиянии SIMD на проблему накладных расходов CGO: часть пользователей считает, что SIMD полностью устраняет необходимость в CGO.
FEX-emu – Run x86 applications on ARM64 Linux devices 🔥 Горячее
FEX-Emu — быстрый эмулятор пользовательского режима x86 и x86-64 для Linux, позволяющий запускать x86-приложения на ARM64-устройствах. Он обеспечивает широкую совместимость с 32- и 64-битными бинарными файлами и может использоваться совместно с Wine/Proton для запуска Windows-игр. Эмулятор поддерживает перенаправление вызовов API в библиотеки хост-системы (OpenGL/Vulkan) для снижения накладных расходов, а также экспериментальный кэш кода для минимизации зависаний в играх.
В основе FEX лежит продвинутый бинарный рекompiler, поддерживающий все современные расширения набора инструкций x86(-64), включая AVX/AVX2. Используемая в нем собственная промежуточная репрезентация (IR) позволяет генерировать более оптимизированный код, чем традиционный splatter JIT. Модульная архитектура включает в себя комплексный слой трансляции системных вызовов, реализующий даже нишевые возможности вроде seccomp, и позволяет использовать FEX как бэкенд WoW64/ARM64EC в Wine.
Комментарии (117)
- FEX позволяет запускать x86-64 игры на ARM64-устройствах, используя Wine/Proton, но сталкивается с проблемами совместимости из-за различий в модели памяти и DRM.
- Valve спонсирует FEX, что может быть частью стратегии по переходу игровой экосистемы на ARM.
- Проблемы с DRM и анти-чит системами, а также с производительностью графических API, таких как DirectX, которые не могут быть напрямую перенаправлены на хост-систему.
- Несмотря на это, FEX демонстрирует высокую производительность и совместимость с большинством игр, включая Cyberpunk 2077.
- Возможность запуска Windows игр на ARM64-устройствах с помощью FEX и Wine/Proton может быть ограничена из-за отсутствия поддержки ARM ноутбуков и отсутствия графических драйверов.
FFmpeg Assembly Language Lessons 🔥 Горячее
FFmpeg/asm-lessons — репозиторий с уроками по ассемблеру для FFmpeg.
Цель: научиться писать высокопроизводительные рутины на x86-64, ARM и других архитектурах, ориентированные на мультимедиа-задачи.
Содержание (кратко):
- Уроки: от базовых инструкций до векторных расширений (SSE/AVX, NEON).
- Примеры: реализация IDCT, фильтров, цветового преобразования.
- Тесты: юнит-тесты и бенчмарки для сравнения C vs asm.
- CI: автоматическая проверка на x86-64 и ARM через GitHub Actions.
Как начать:
- Клонируйте репо.
- Установите
nasm,yasmилиllvm-mingw. - Соберите пример:
make lesson01.
Полезные ссылки:
Комментарии (132)
- Пользователи восхищаются масштабом FFmpeg и экономией вычислений даже при небольших улучшениях.
- Обсуждаются случаи, когда ручная сборка быстрее intrinsic’ов, и инструменты для поиска «горячих точек».
- Некоторые ждали более глубокой связи с FFmpeg, а не общее введение в ассемблер.
- Поднимаются вопросы портативности (пока только x86-64), необходимости математических подготовок и перегруженности NASM-макросами.
- Большинство соглашается: писать LLVM IR вручную нет смысла, проще использовать inline-assembly или векторные инструкции.