Dopo tre anni di sviluppo, viene presentato il progetto di ricerca Vcc (Vulkan Clang Compiler), dedicato alla creazione di un compilatore in grado di traslare codice C++ in un formato eseguibile su GPU che supportano l'API grafica Vulkan. A differenza dei modelli di programmazione GPU basati su linguaggi di shader come GLSL e HLSL, Vcc promuove l'idea di abbandonare completamente l'uso di linguaggi di shader distinti, permettendo la compilazione diretta di codice C/C++ per Vulkan. I risultati del progetto sono distribuiti con licenza MIT.
Per la compilazione del codice vengono utilizzati componenti del progetto LLVM e Clang come frontend. Per l'esecuzione su GPU viene sviluppata una propria rappresentazione intermedia degli shader chiamata Shady e un compilatore per trasformare il codice in questa rappresentazione. Dove possibile, viene supportata la compilazione di codice standard C/C++, e per supportare funzionalità specifiche per GPU sono disponibili diverse funzioni incorporate aggiuntive.
In Vcc, the standard capabilities of C/C++ are utilized to control the execution flow of the program, including the use of the "goto" statement. The calling of functions is permitted, along with recursive function execution, the use of physical pointers, tagged pointers, and function pointers, as well as performing arithmetic operations on pointers and determining type layouts in memory.
Per garantire il supporto delle funzionalità di C/C++, come funzioni e puntatori, la rappresentazione intermedia Shady è stata estesa con il supporto di costrutti speciali. In generale, Shady si basa sulla rappresentazione intermedia SPIR-V 3 e utilizza l'emulazione per implementare funzionalità avanzate che non possono essere implementate direttamente su SPIR-V. Per l'uso in programmi specifici per shader, sono disponibili funzioni integrate e annotazioni. #include descriptor_set(0) descriptor_binding(1) uniform sampler2D texSampler; location(0) input vec3 vertexColor; location(1) input vec2 texCoord; location(0) output vec4 outColor; fragment_shader void main() { vec4 fragColor; fragColor.xyz = vertexColor; fragColor.w = 1.0f; outColor = texture2D(texSampler, texCoord) * fragColor; }
Per il funzionamento è richiesta una GPU che supporti Vulkan 1.1, le estensioni VK_KHR_buffer_device_address e i tipi Int8, Int16 e Int64. Vcc è compatibile con i driver Vulkan radv (AMD Mesa), amdvlk (AMD), nvk (NVIDIA), anv (Intel Mesa) e i driver proprietari di AMD, Intel Arc e NVIDIA. Tra le limitazioni dell'implementazione si segnala la mancanza di supporto per le eccezioni C++, l'indisponibilità delle funzioni malloc/free e l'incompatibilità delle funzioni e dei puntatori tra il sistema host e la GPU.
Fonte: opennet.ru
