Что такое LLVMpipe?
LLVMpipe — это программный рендерер, включенный в графический драйвер Mesa. Он использует инфраструктуру компилятора LLVM для динамической компиляции кода, связанного с графикой (например, шейдеров, вершин и т. д.), в машинный код и последующего его выполнения на ЦП.
LLVMpipe обычно используется в средах тестирования и разработки или в качестве запасного варианта, когда подходящее графическое оборудование недоступно. Его производительность не так хороша, как у графических драйверов с аппаратным ускорением, но в определенных ситуациях (QEMU или отсутствие видеокарты) он может быть очень полезен.
Это означает, что LLVMpipe может предоставлять возможности программного рендеринга графики для таких вещей, как OpenGL и Vulkan, даже если в системе нет доступного графического оборудования или графического драйвера.
По некоторым причинам многие машины RISC-V не имеют графических процессоров или не имеют доступных драйверов графических процессоров, и многие графические программы не могут быть использованы. Поэтому функция JIT-рендеринга графики, предоставляемая LLVMpipe, является благом для всех пользователей RISC-V.
Что такое ORCJIT?
ORCJIT (JIT компиляции по запросу) — это механизм JIT нового поколения (компиляция «точно в срок») в проекте LLVM, ориентированный на создание гибкого и эффективного компилятора «точно в срок». Это расширение функций и замена MCJIT, JIT-движка старого поколения в проекте LLVM, который был заменен ORCJIT, больше не является предметом разработки новых JIT и больше не поддерживается новыми архитектурами. Поэтому для поддержки архитектуры RISC-V для LLVMpipe реализован новый JIT-бэкенд на базе ORCJIT.
Что случилось?
Он стартовал 29 июля 2022 года, то есть почти во вторую годовщину. MR был запущен на GitLab в Mesa, стажером LV4 Alex Fan из PLCT Lab, Draft: llvmpipe: add a new jit engine based on llvm orcjit, also add in riscv support, написал в описании:
Я пытаюсь реализовать новый jit-движок для llvmpipe на основе orc lljit в качестве замены старого mcjit. Преимущество этого заключается в том, что riscv64/32 llvmpipe поддерживает безголовый рендеринг, чего и ждут многие пользователи riscv. llvm mcjit больше не поддерживает новые архитектуры.
Шестерни судьбы начали вращаться. В то время код все еще находился в состоянии черновика и не был интегрирован в основную часть проекта, но поддержка RISC-V в LLVMpipe была изначально реализована. В это время начинает проявляться сила сообщества. 13 января 2023 года openEuler RISC-V SIG возглавила выпуск последней версии исходного кода установки Mesa с оптимизацией LLVMpipe, чтобы пользователи могли выбирать и тестировать. В новостях говорилось: openEuler RISC-V SIG берет на себя инициативу по выпуску последней версии исходного кода установки Mesa с оптимизацией LLVMpipe, чтобы пользователи могли выбирать и тестировать
RISC-V SIG представила патч оптимизации для недавно обновленной версии Mesa 22.3.2, который добавляет в LLVMpipe новый механизм JIT на основе LLVM ORCJIT и поддерживает RISC-V. По сравнению с тестом glxgears со скоростью 5 кадров в секунду, исправленный LLVMpipe смог выдать около 30-100 кадров примерно синхронно с монитором тестовой машины. Для оборудования QEMU и платы разработки без графического процессора просмотр веб-страниц Firefox и воспроизведение видео стали более плавными, что свидетельствует о значительном улучшении производительности.
С тех пор различные дистрибутивы заранее включили этот патч в свои дистрибутивы.
Однако из-за задержки слияния апстрима, что если версия будет существенно обновлена дистрибутива, черновик Alex Fan необходимо перенести на новую версию mesa. Alex Fan тоже некогда продолжать оптимизировать этот черновик и интегрировать его в основную ветку. В это время оно по сути зашло в тупик, и все дистрибутивы либо обновить mesa, либо лишились этого патча.
Это конец?
Жизнеспособность открытого исходного кода еще раз подтверждается.
3 ноября 2023 года, год спустя, Yukari Chiba из UOS внезапно решил посвятить свое время этой давней проблеме. У нас появилась новая версия!
В тот же день она выпустила MR, llvmpipe: добавить новый JIT-движок на базе LLVM ORCJIT, а также добавить поддержку RISC-V (обновлено), снова попадая в апстрим.
После 8 месяцев оптимизации, при сотрудничестве более десятка разработчиков, 16 июля 2024 года он был объединен в основную ветку!
На данный момент большое дело завершено.