A nova versão do Mesa 25.0 apresenta uma melhoria significativa no suporte ao código OpenCL C para drivers. Com o esforço liderado por Alyssa Rosenzweig, foi adicionada uma biblioteca padrão que expande a funcionalidade de OpenCL nos drivers. Esta atualização inclui suporte para assert()
em dispositivos e diversos constructos padrão da linguagem C, aprimorando a experiência dos desenvolvedores.
Principais adições e benefícios
De acordo com Alyssa Rosenzweig, na solicitação de mesclagem que foi recentemente aprovada:
“Agora que temos um código comum para pré-compilar o CL C do driver em binários para hardware, os fundamentos estão estabelecidos para implementar códigos de driver em CL. Este MR adiciona muito código comum fornecendo uma biblioteca padrão para o driver CL C, incluindo vários constructos padrão da linguagem C disponíveis no host C, mas não de forma nativa no CL das aplicações.”
Entre os recursos adicionados estão:
- abort
- static_assert
- assert
- Rotinas portadas de
util/macros.h
,math.h
, e outros.
Depuração avançada
A combinação de printf
, abort
e assert
facilita significativamente a depuração do código OpenCL em drivers. Com a integração correta, como no caso do driver Honeykrisp, esses recursos funcionam tanto em shaders pré-compilados quanto em funções de biblioteca injetadas nos shaders das aplicações.
Exemplo de kernel pré-compilado
KERNEL(1)
libagx_increment_cs_invocations(global uint *grid, global uint32_t *statistic,
uint32_t local_size_threads)
{
printf("local size = %u\n", local_size_threads);
assert(local_size_threads >= 1 && local_size_threads <= 32);
*statistic += local_size_threads * grid[0] * grid[1] * grid[2];
}
Ao ser executado, este kernel gera a seguinte saída de depuração:
Test case 'dEQP-VK.query_pool.statistics_query.compute_shader_invocations.32bits_primary'..
local size = 8
local size = 1
local size = 63
Shader assertion fail at src/asahi/libagx/query.cl:107
Expected local_size_threads >= 1 && local_size_threads <= 32
DeviceLost (vk.waitForFences(device, 1u, &fence, VK_TRUE, timeoutNanos): VK_ERROR_DEVICE_LOST at vkCmdUtil.cpp:292)
Integração Facilitada
A infraestrutura para o driver CL agora permite a criação automatizada de código intermediário, layouts de dados e outros elementos essenciais. Por exemplo, no caso do kernel mencionado, ele é disparado no host com:
libagx_increment_cs_invocations(cs, agx_1d(1), grid, stat,
agx_workgroup_threads(local_size));
Todo o código “cola” necessário é gerado automaticamente.
Implementação do abort
O mecanismo subjacente de abort
foi inspirado pela proposta OpenCL-Docs Pull Request #808. Ele utiliza a infraestrutura existente de printf
para transmitir mensagens de abort, eliminando a necessidade de buffers dedicados grandes. Essa abordagem é considerada ideal para o driver CL no momento.
Padronização e Consistência
A biblioteca também introduz diversas diretivas #define
que garantem layouts consistentes entre host e dispositivo. Por exemplo:
struct foo {
GLOBAL(float) values;
uint32_t count;
};
No host, isso se expande para:
struct foo {
uint64_t values;
uint32_t count;
};
No dispositivo, expande para:
struct foo {
global float *values;
uint count;
};
Impacto no Projeto Honeykrisp e outros drivers open-source
Essas mudanças são particularmente significativas para o driver Honeykrisp, parte do projeto Asahi Linux, que busca suporte para Apple Silicon. Além disso, outros drivers open-source na infraestrutura Mesa também se beneficiarão dessas melhorias, com uma integração facilitada e menos código específico por driver.
Conclusão
A inclusão dessa biblioteca padrão no Mesa 25.0 representa um avanço importante para a comunidade de desenvolvimento OpenCL. Ela não só melhora a produtividade dos desenvolvedores, mas também reforça o suporte a drivers open-source e o ecossistema de hardware compatível com Linux.
Para mais detalhes sobre a implementação, consulte a solicitação de mesclagem.