Опубликован инструментарий ZLUDA, позволяющий запускать CUDA-приложения на GPU AMD

Проект ZLUDA подготовил открытую реализацию технологии CUDA для GPU AMD, позволяющую выполнять немодифицированные CUDA-приложения с производительностью, близкой к производительности приложений, выполняемых без прослоек. Проект обеспечивает бинарную совместимость с существующими CUDA-приложениями, собранными при помощи компилятора CUDA для GPU NVIDIA. Реализация работает поверх развиваемого компанией AMD стека ROCm и runtime HIP (Heterogeneous-computing Interface for Portability). Код проекта написан на языке Rust и распространяется под лицензиями MIT и Apache 2.0. Поддерживается работа в Linux и Windows.

Слой для организации работы CUDA на системах с GPU AMD разрабатывался последние два года, но проект имеет более давнюю историю и изначально создавался для обеспечения работы CUDA на GPU Intel. Изменение объясняется тем, что вначале разработчик ZLUDA являлся сотрудником Intel, но в 2021 году данная компания посчитала предоставление возможности запуска CUDA-приложений на GPU Intel не представляющим интереса для бизнеса и не стала форсировать развитие инициативы.

В начале 2022 года разработчик уволился из Intel и заключил контракт компанией AMD на разработку слоя для совместимости с CUDA. Компания AMD попросила во время разработки не афишировать интерес AMD к проекту ZLUDA и не делать коммитов в публичный репозиторий ZLUDA. Спустя два года компания AMD решила, что запуск CUDA-приложений на GPU AMD не представляет интереса для бизнеса, что по условию контракта позволило разработчику отрыть свои наработки. Так как производители GPU перестали финансировать проект, его судьба теперь зависит от интереса сообщества и поступления предложений о сотрудничестве от других компаний. Без внешней поддержки проект возможно будет развиваться только в направлениях, интересных лично автору, таких как DLSS (Deep Learning Super Sampling).

В текущем виде уровень качества реализации оценивается как альфа-версия. При этом ZLUDA уже может использоваться для выполнения многих CUDA-приложений, включая Geekbench, 3DF Zephyr, Blender, Reality Capture, LAMMPS, NAMD, waifu2x, OpenFOAM и Arnold. Обеспечена минимальная поддержка примитивов и библиотек cuDNN, cuBLAS, cuSPARSE, cuFFT, NCCL и NVML.

Первый запуск CUDA-приложений под управлением ZLUDA производится с заметными задержками, из-за того, что ZLUDA выполняет компиляцию GPU-кода. В последующих запусках подобная задержка отсутствует, так как скомпилированный код сохраняется в кэше. В процессе выполнения скомпилированного кода производительность близка к нативной. При выполнении пакета Geekbench на GPU AMD Radeon 6800 XT вариант тестового набора для CUDA, выполняемый при помощи ZLUDA, показал заметно более высокую производительность, чем вариант на базе OpenCL.

Поддержка официального CUDA Driver API и изученной при помощи обратного инжиниринга части недокументированного API CUDA реализована в ZLUDA через замену вызовов функций на аналогичные функции, предоставляемые в HIP runtime, который во многом походит на CUDA. Например, функция cuDeviceGetAttribute() заменяется на hipDeviceGetAttribute(). Похожим образом обеспечивается и совместимость с библиотеками NVIDIA, такими как NVML, cuBLAS и cuSPARSE, — для подобных библиотек в ZLUDA предоставляются транслирующие библиотеки с тем же именем и тем же набором функций, построенные в виде надстроек над похожими библиотеками AMD.

GPU-код приложений, скомпилированный в представление PTX (Parallel Thread Execution), транслируется специальным компилятором вначале в промежуточное представление LLVM IR, на основе которого генерируется бинарный код для GPU AMD.

Источник: http://www.opennet.ru/opennews/art.shtml?num=60591