ZLUDA, una implementación que permite ejecutar aplicaciones CUDA en GPUs AMD
Se ha dado a conocer la noticia de que AMD ha tomado la decisión dejar de financiar el desarrollo de ZLUDA, la cual es una implementación abierta de la tecnología CUDA para GPU AMD, lo que permite ejecutar aplicaciones CUDA sin modificarlas con un rendimiento cercano al de las aplicaciones que se ejecutan sin capas adicionales.
Durante los últimos dos años, se ha trabajado en el desarrollo de esta capa para facilitar la ejecución de aplicaciones CUDA en sistemas con GPU AMD. Pero hasta hace poco AMD ha tomado la decisión que ejecutar aplicaciones CUDA en las GPU AMD no era de interés comercial, lo que permitió al desarrollador abrir sus desarrollos según lo acordado en el contrato.
Sobre ZLUDA
El proyecto inicialmente se creó para admitir el trabajo CUDA en GPU Intel y el cambio en la política de soporte de GPU se debe a que, inicialmente el desarrollador de ZLUDA era un empleado de Intel. En 2021, Intel decidió que no era comercialmente viable proporcionar la capacidad para ejecutar aplicaciones CUDA en las GPU de Intel, lo que llevó a la interrupción del desarrollo de la iniciativa.
A principios de 2022, el desarrollador dejó Intel y firmó un contrato con AMD para continuar el desarrollo de la capa de compatibilidad CUDA. Durante el desarrollo, AMD solicitó que no se promocionara el interés de la empresa en el proyecto ZLUDA y que no se comprometiera con el repositorio público de ZLUDA.
ZLUDA proporciona compatibilidad binaria con aplicaciones CUDA existentes compiladas con el compilador CUDA para GPU NVIDIA, sin necesidad de realizar cambios a nivel de código fuente. La implementación opera sobre la pila ROCm de AMD y el runtime del HIP.
En su estado actual, el nivel de calidad de conversión de ZLUDA se considera una versión alfa. Aunque cabe mencionar que ya es capaz de ejecutar muchas aplicaciones CUDA, además se proporciona soporte mínimo para primitivas y bibliotecas, también cuenta con implementaciones prototipo del marco OptiX.
Durante la primera ejecución de aplicaciones CUDA bajo el control de ZLUDA experimenta retrasos notables debido a que ZLUDA compila el código para la GPU. Sin embargo, en ejecuciones posteriores, este retraso desaparece, ya que el código compilado se almacena en la memoria caché, lo que resulta en un rendimiento casi nativo al ejecutar el código compilado. Por ejemplo, al ejecutar Geekbench en una GPU AMD Radeon 6800 XT, la versión basada en ZLUDA del conjunto de pruebas CUDA mostró un rendimiento significativamente mejor que la versión basada en OpenCL.
Además de ello, se menciona que la compatibilidad con la API del controlador CUDA oficial y la ingeniería inversa de la API CUDA no documentada se implementa en ZLUDA mediante la sustitución de las llamadas a funciones con funciones análogas proporcionadas en el tiempo de ejecución de HIP, que es muy similar a CUDA.
Por ejemplo, la función cuDeviceGetAttribute() se reemplaza por hipDeviceGetAttribute(). ZLUDA también garantiza la compatibilidad con bibliotecas de NVIDIA como NVML, cuBLAS y cuSPARSE. Para estas bibliotecas, ZLUDA proporciona bibliotecas de traducción con el mismo nombre y el mismo conjunto de funciones, construidas sobre bibliotecas AMD similares. El código de la aplicación GPU, compilado en representación PTX (Parallel Thread Execution), se traduce mediante un compilador especial a una representación intermedia LLVM IR, a partir de la cual se genera el código binario para la GPU AMD.
Finalmente, cabe mencionar que el futuro del proyecto depende del interés de la comunidad y de posibles propuestas de cooperación por parte de otras empresas. Sin apoyo externo, el proyecto continuará desarrollándose únicamente en áreas de interés personal del autor, como DLSS.
Para los interesados en el código del proyecto, deben saber que está escrito en Rust y se distribuye bajo las licencias MIT y Apache 2.0, además el proyecto es compatible con Linux y Windows. Si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.