Hacker News Digest

Тег: #avx

Постов: 4

FEX-emu – Run x86 applications on ARM64 Linux devices (fex-emu.com) 🔥 Горячее

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.

by open-paren • 12 ноября 2025 г. в 20:15 • 275 points

ОригиналHN

#x86#x86-64#arm64#linux#wine#proton#opengl#vulkan#avx#avx2

Комментарии (117)

  • FEX позволяет запускать x86-64 игры на ARM64-устройствах, используя Wine/Proton, но сталкивается с проблемами совместимости из-за различий в модели памяти и DRM.
  • Valve спонсирует FEX, что может быть частью стратегии по переходу игровой экосистемы на ARM.
  • Проблемы с DRM и анти-чит системами, а также с производительностью графических API, таких как DirectX, которые не могут быть напрямую перенаправлены на хост-систему.
  • Несмотря на это, FEX демонстрирует высокую производительность и совместимость с большинством игр, включая Cyberpunk 2077.
  • Возможность запуска Windows игр на ARM64-устройствах с помощью FEX и Wine/Proton может быть ограничена из-за отсутствия поддержки ARM ноутбуков и отсутствия графических драйверов.

The unreasonable effectiveness of modern sort algorithms (github.com)

Rust: «неразумная» скорость сортировки

  • Сортировка в Rust быстрее C++ и Go благодаря LLVM, агрессивному векторизатору и ручным оптимизациям.
  • Алгоритм: pdqsort (pattern-defeating quicksort) + векторизованный партиционер.
  • Ключевые приёмы:
    • 128-битные SIMD-операции (SSE/AVX) для фильтрации элементов;
    • branchless-код, предикты, минимизация кэш-промахов;
    • специализированные пути для малых типов (u8, u16, u32, u64, f32, f64) и копируемых структур;
    • ручная развёртка циклов, инлайн, отказ от стандартных абстракций.
  • Сравнение: на случайных u64 Rust ~2× быстрее libstdc++, ~3× быстрее Go; на почти отсортированных — ещё больше.
  • Память: всё делается in-place, доп. буфер 1 КБ максимум.
  • Сложность: O(n log n) в среднем, O(n log n) worst-case (pdqsort гарантирует).
  • Код открыт, можно подсмотреть и перенести на другие языки.

by Voultapher • 11 сентября 2025 г. в 07:27 • 126 points

ОригиналHN

#rust#c++#go#llvm#simd#pdqsort#sse#avx#github

Комментарии (38)

  • Универсальный лайфхак: «сначала отсортируй данные» — и задача часто сводится к O(log n).
  • Но глобальная сортировка дороже с ростом объёма; иногда проще пересмотреть подход или использовать хэш-таблицу.
  • Современные unstable-sort и foldhash настолько быстры, что ручные оптимизации часто проигрывают и требуют лишней памяти.
  • Для 4 уникальных значений подсчёт или perfect-hash проще и быстрее полной сортировки; эксперимент ставит границы, а не решает продакшен-задачу.

FFmpeg Assembly Language Lessons (github.com) 🔥 Горячее

FFmpeg/asm-lessons — репозиторий с уроками по ассемблеру для FFmpeg.
Цель: научиться писать высокопроизводительные рутины на x86-64, ARM и других архитектурах, ориентированные на мультимедиа-задачи.

Содержание (кратко):

  • Уроки: от базовых инструкций до векторных расширений (SSE/AVX, NEON).
  • Примеры: реализация IDCT, фильтров, цветового преобразования.
  • Тесты: юнит-тесты и бенчмарки для сравнения C vs asm.
  • CI: автоматическая проверка на x86-64 и ARM через GitHub Actions.

Как начать:

  1. Клонируйте репо.
  2. Установите nasm, yasm или llvm-mingw.
  3. Соберите пример: make lesson01.

Полезные ссылки:

by flykespice • 18 августа 2025 г. в 13:39 • 396 points

ОригиналHN

#ffmpeg#assembly-language#x86-64#arm#sse#avx#neon#simd#multimedia#github-actions

Комментарии (132)

  • Пользователи восхищаются масштабом FFmpeg и экономией вычислений даже при небольших улучшениях.
  • Обсуждаются случаи, когда ручная сборка быстрее intrinsic’ов, и инструменты для поиска «горячих точек».
  • Некоторые ждали более глубокой связи с FFmpeg, а не общее введение в ассемблер.
  • Поднимаются вопросы портативности (пока только x86-64), необходимости математических подготовок и перегруженности NASM-макросами.
  • Большинство соглашается: писать LLVM IR вручную нет смысла, проще использовать inline-assembly или векторные инструкции.

Going faster than memcpy (squadrick.dev)

Как обогнать memcpy

Профилируя Shadesmar, увидел: при больших (>512 КБ) сообщениях 97 % времени уходит на memcpy между процессной и разделяемой памятью. Решил ускорить копирование.


Разбор memcpy

perf показал:
__memmove_avx_unaligned_erms — это memcpy через memmove, AVX, 32 байта за раз, поддержка не выровненных блоков и ERMS (железный цикл REP MOVSB).

  • memmove выбран, т.к. допускает перекрытие.
  • Для <4 КБ используется SSE2, иначе — REP MOVSB + AVX.
  • Не-временные (NT) инструкции и prefetcht0 уменьшают кэш-промахи.

Способ 1: простой REP MOVSB

void _rep_movsb(void *d, const void *s, size_t n) {
  asm volatile("rep movsb"
               : "=D"(d), "=S"(s), "=c"(n)
               : "0"(d), "1"(s), "2"(n)
               : "memory");
}

Тот же цикл, что и в glibc, но без лишней логики.

by snihalani • 11 августа 2025 г. в 04:59 • 125 points

ОригиналHN

#c#assembly#performance-optimization#memory-management#avx#sse2#inter-process-communication#zero-copy

Комментарии (63)

  • Часть выгоды даёт отказ от лишнего копирования: часто данные можно использовать на месте.
  • Несколько участников отмечают, что без контроля кэшей и правильной сериализации бенчмарки теряют смысл.
  • График в конце вызывает сомнения: скачки пропускной способности выглядят неправдоподобно.
  • Для IPC обсуждают zero-copy через размещение данных сразу в shared memory (Iceoryx, Boost.Interprocess, DPDK).
  • Большинство сходится к выводу: для обычных задач лучше довериться стандартному memcpy/std::memcpy, особенно в glibc.