O projeto ZLUDA desenvolveu uma implementação aberta da tecnologia CUDA para GPUs AMD, permitindo a execução de aplicações CUDA não modificadas com desempenho próximo ao de aplicações executadas sem camadas intermediárias. O conjunto de ferramentas publicado garante compatibilidade binária com aplicações CUDA existentes, compiladas com o compilador CUDA para GPUs NVIDIA. A implementação é construída sobre a pilha ROCm em desenvolvimento pela AMD e o runtime HIP (Heterogeneous-computing Interface for Portability). O código do projeto é escrito em Rust e é distribuído sob as licenças MIT e Apache 2.0. A operação é suportada em Linux e Windows.
A camada para organizar o funcionamento da CUDA em sistemas com GPUs AMD foi desenvolvida nos últimos dois anos, mas o projeto tem uma história mais longa e foi originalmente criado para garantir o funcionamento da CUDA em GPUs Intel. A mudança na política de suporte a GPUs se explica pelo fato de que, inicialmente, o desenvolvedor ZLUDA era um funcionário da Intel, mas em 2021, a empresa decidiu que a possibilidade de executar aplicações CUDA em GPUs Intel não era de interesse para os negócios e não acelerou o desenvolvimento da iniciativa.
No início de 2022, o desenvolvedor saiu da Intel e firmou contrato com a AMD para desenvolver uma camada de compatibilidade com a CUDA. A AMD solicitou, durante o desenvolvimento, que não fosse divulgado o interesse da AMD no projeto ZLUDA e que não fossem feitos commits no repositório público do ZLUDA. Após dois anos, a AMD decidiu que a execução de aplicações CUDA em GPUs AMD não era de interesse para os negócios, o que, segundo o contrato, permitiu ao desenvolvedor abrir suas criações. Como os fabricantes de GPUs deixaram de financiar o projeto, seu futuro agora depende do interesse da comunidade e de propostas de colaboração de outras empresas. Sem apoio externo, o projeto poderá se desenvolver apenas em direções que sejam de interesse pessoal do autor, como DLSS (Deep Learning Super Sampling).
Na sua forma atual, o nível de qualidade da implementação é avaliado como uma versão alfa. Nesse sentido, o ZLUDA já pode ser usado para executar muitas aplicações CUDA, incluindo Geekbench, 3DF Zephyr, Blender, Reality Capture, LAMMPS, NAMD, waifu2x, OpenFOAM e Arnold. Há suporte mínimo para primitivas e bibliotecas cuDNN, cuBLAS, cuSPARSE, cuFFT, NCCL e NVML.
A primeira execução de aplicativos CUDA sob ZLUDA ocorre com atrasos significativos, pois ZLUDA compila o código GPU. Nas execuções subsequentes, esse atraso não está presente, uma vez que o código compilado é armazenado em cache. Durante a execução do código compilado, o desempenho é próximo ao nativo. Ao executar o pacote Geekbench na GPU AMD Radeon 6800 XT, a versão do conjunto de testes para CUDA, executada com ZLUDA, mostrou um desempenho significativamente mais alto do que a versão baseada em OpenCL.

O suporte para o API de driver CUDA oficial e partes do API CUDA não documentadas, estudadas por engenharia reversa, é implementado no ZLUDA por meio da substituição de chamadas de funções por funções equivalentes fornecidas no runtime HIP, que se assemelha muito ao CUDA. Por exemplo, a função cuDeviceGetAttribute() é substituída por hipDeviceGetAttribute(). De forma semelhante, a compatibilidade com bibliotecas NVIDIA, como NVML, cuBLAS e cuSPARSE, é garantida — para essas bibliotecas, o ZLUDA fornece bibliotecas de transcrição com o mesmo nome e o mesmo conjunto de funções, construídas como camadas sobre bibliotecas semelhantes da AMD.
O código GPU dos aplicativos, compilado na forma PTX (Parallel Thread Execution), é transpilado por um compilador especial, primeiro para uma representação intermediária LLVM IR, a partir da qual o código binário para GPU AMD é gerado.

Fonte: opennet.ru
