Novidades no Mesa

Mesa 25.0: Avanço com biblioteca padrão para OpenCL em drivers

Logo do Mesa drivers

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.