llama.cpp ganha otimização CUDA com cópia vetorizada e acelera get_rows em até 27%

imagem 7

A mais recente compilação do llama.cpp (b10076) traz uma importante otimização para GPUs CUDA, acelerando a operação get_rows quando os tipos de dado de origem e destino são idênticos. Anteriormente, a função k_get_rows_float realizava uma cópia escalar, um elemento por thread, e recalculava a cada iteração os cálculos invariantes da linha (carga do índice, fast_div_modulo e ponteiros das linhas). Agora, essas tarefas são movidas para fora do laço, e foi adicionado um caminho vetorizado (k_get_rows_float_vec) que copia blocos de 4 int (16 B) por thread, quando a condição de mesmo tipo e alinhamento de 16 bytes é atendida.

O caminho vetorizado é habilitado em tempo de compilação somente se src0_t == dst_t, e em tempo de execução quando os ponteiros base, os strides das linhas e o tamanho da linha permitem — todos com alinhamento de 16 bytes e ne00 % VEC == 0. Para evitar que gathers muito pequenos (de uma única linha) percam desempenho por redução excessiva no número de blocos, uma proteção de ocupação mantém esses casos no caminho escalar, rico em blocos. Em testes com o modelo DeltaNet (Strix Halo, gfx1151), o gather do estado recorrente (ne00=524288) caiu de 18,6 µs para 13,0 µs (registros rocprofv3), superando até o backend Vulkan, sem regressão no gather pequeno do estado de convolução. No total, a operação get_rows ficou 27% mais rápida. Todos os 47 testes do test-backend-ops GET_ROWS foram executados com sucesso.

Website:

macOS/iOS:

Linux:

Android:

Windows:

openEuler:

  • DESABILITADO
  • openEuler x86 (310p)
  • openEuler x86 (910b, ACL Graph)
  • openEuler aarch64 (310p)
  • openEuler aarch64 (910b, ACL Graph)

UI:

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *