Se você acompanha o ecossistema Arm no servidor, já ouviu falar do SME — Scalable Matrix Extension. Pense nele como o “turbocompressor” do Armv9 para operações de matriz: mais throughput, menor latência, e um caminho direto para acelerar IA e HPC. Agora, o que mudou? Um patchset massivo acaba de aterrissar propondo suporte a SME em máquinas virtuais do KVM no ARM64. É um divisor de águas: não adianta ter hardware parrudo se a virtualização não expõe esses recursos de forma correta e performática. Com SME chegando ao KVM, os provedores de nuvem Arm podem, finalmente, prometer aceleração de IA/HPC dentro de VMs — não só no bare metal.
Antes de mergulhar no KVM, vamos alinhar o que é o SME. Em termos simples: SME adiciona um novo estado arquitetural (o registrador matricial ZA), um “modo de streaming” para vetores (controlado por PSTATE.SM
) e, no SME2, um registrador de LUT chamado ZT0
. Ele também introduz um comprimento de vetor independente do SVE, o que já dá uma pista de onde começam as dores de cabeça para virtualização. Em SME, você pode ter plataformas com SME sem SVE, e as listas de comprimentos suportados por SVE e SME não precisam coincidir (um detalhe nada trivial). E, quando o “streaming mode” está ativo, os registros Z/P (do universo SVE) passam a usar o VL de SME, que pode ser diferente do VL de SVE.
Por que isso importa para nuvem e data centers?

Treinar e servir modelos de IA ou rodar kernels de HPC em nuvem depende de throughput consistente — e, em 2025, isso significa acesso a instruções e estados arquiteturais avançados dentro da VM. Sem KVM portar SME, quem compra instâncias Arm com SME no host, mas precisa de isolamento via VMs, ficaria “preso” a fallback genérico (mais lento) ou teria que desmontar boa parte do modelo operacional. Habilitar SME no KVM destrava cenários multi-tenant onde cada VM pode usar ZA/streaming mode e, quando presente, ZT0, com salvamento/restauração de estado corretos, traps bem definidas e um ABI de usuários (VMM) previsível. Em termos de oferta de produto: isso habilita “VMs com aceleração de matriz” no cardápio de uma cloud Arm moderna.
O “pulo do gato” técnico: dois comprimentos de vetor e um novo modo
Se SVE já exigiu um malabarismo no ABI por causa de VL configurável em tempo de execução, SME sobe a barra: há um segundo VL (o de SME), e o famoso streaming mode faz os registros Z/P “trocarem de pele” para usar esse VL alternativo. Traduzindo: o VMM precisa:
- Configurar, expor e “finalizar” o conjunto de VLs disponíveis tanto para SVE quanto para SME.
- Sincronizar estado de ZA/FFR/ZT0 e dos bits de controle (
SVCR.SM
eSVCR.ZA
) em momentos exatos (load/save de contexto), respeitando o que a arquitetura manda — inclusive o detalhe de queFFR
no streaming mode pode ser opcional (depende de FA64). - Lidar com sistemas sem SVE mas com SME, onde o acesso a vetores fora do streaming mode muda de figura.
O patchset resolve essa dança propondo uma “finalização única” de vetores no KVM — renomeada para KVM_ARM_VCPU_VEC
— que vale para SVE e SME ao mesmo tempo. Isso evita estados “meio finalizados” (SVE finalizado e SME não, ou vice-versa) que complicariam o acesso a registros e a definição de VL. O VMM negocia os VLs via “pseudoregistros” (um para SVE, outro para SME) e só depois faz a finalização. É um desenho que privilegia clareza e consistência do ABI de KVM.
ZA, ZT0, FA64, TPIDR2_EL0… e as arestas do contexto
O pacote traz várias minúcias que mostram maturidade da implementação:
- ZA e ZT0 ficam acessíveis a user space (QEMU, por exemplo) com semântica que espelha a arquitetura: habilitar acesso zera o conteúdo (como no hardware), e leituras retornam zero quando desabilitados no
SVCR
. - FA64 (parte de SME que habilita o conjunto “full FP/SVE” no streaming mode, incluindo FFR) é tratado como sub-feature controlável via ID registers — crucial para refletir o que o host permite expor ao guest.
TPIDR2_EL0
, um novo registrador de thread ligado a SME, é integrado ao contexto do convidado (salvo/restaurado com os outros TPIDRs), já pensando em otimizações como “lazy save” de ZA no espaço de usuário.- Há também controles de traps mais granulares (além dos undef traps), necessários para emular registros “presentes mas com restrições” (ex.: prioridades de SME em plataformas sem esse suporte).
Como tudo isso se traduz para o loop de execução? Em alto nível: ao entrar/sair do guest, o KVM precisa programar o VL “certo” (SVE ou SME, dependendo de PSTATE.SM
), saber quando salvar FFR (que pode não existir no streaming mode sem FA64), e zerar/mascarar o que for exigido quando SVCR.ZA
muda. O patchset também documenta cuidadosamente quais registros ficam visíveis para o convidado conforme as features habilitadas, e como os ID registers (como ID_AA64PFR1_EL1
e ID_AA64SMFR0_EL1
) devem refletir o mundo oferecido à VM — inclusive o caso de SME sem SVE.
E o ecossistema? Compiladores, ACLE e bibliotecas
Outro motivo para se animar: o lado de software de alto nível já vem se movendo para SME (intrínsecos/ACLE, toolchains, kernels numéricos). Com o KVM expondo SME a VMs, bibliotecas aceleradas (BLAS, kernels de convolução, atalho para attention kernels, etc.) podem rodar “como se fosse bare metal” — só que isoladas e com mobilidade de nuvem. Isso reduz a fricção para ofertar instâncias Arm com aceleração de IA que sejam realmente plug-and-play para workloads modernos.
O que ainda merece atenção
- Compatibilidade e migração: o patchset permite granularidade na exposição de sub-features (ex.: FA64, SME2/
ZT0
) via ID registers, mas migrações entre hosts assimétricos (VLs diferentes, SME sem SVE, etc.) ainda exigem política e orquestração cuidadosas do lado do VMM/cloud. - pKVM / protegido: há caminhos mais restritivos (por exemplo, hosts que evitam executar com ZA/streaming mode habilitados) para reduzir custo de memória/complexidade — bom para segurança/simplicidade, mas com impacto funcional. Avaliar o trade-off no seu cenário é essencial.
Em uma frase: por que isso é grande?
Porque fecha o circuito: hardware Armv9 com SME + toolchains/libraries já maduras + KVM expondo tudo isso para VMs = IA/HPC com isolamento e elasticidade, sem pedir licença para soluções proprietárias. Para os operadores de nuvem, vira argumento comercial (“instâncias Arm com aceleração de matriz em VM”) e técnico (melhor utilization do host, portabilidade de workloads). Para times de plataforma, significa um ABI do KVM coeso — com uma única finalização de vetores e regras claras para SVCR
, ZA
, ZT0
e companhia.
O suporte a “KVM ARM64 SME” ainda está em revisão pública — a série [PATCH v8 00/29] KVM: arm64: Implement support for SME, enviada por Mark Brown em 2 de setembro de 2025, removeu o rótulo de RFC e parece madura, mas ainda não foi mesclada. Como a v7 foi rebaseada sobre o v6.17-rc1 e o v6.16 saiu em 27 de julho de 2025, o cenário mais realista é pousar no ciclo do Linux 6.18 (ou posterior), isto é, depois que o 6.17 for lançado e abrir a próxima janela de mesclagem. Em resumo: espere algo a partir do Linux 6.18, sujeito ao ritmo de revisão no KVM/arm64.
TL;DR técnico (para colar na review do seu VMM)
- SME = ZA + streaming mode + VL independente + (no SME2) ZT0; pode existir sem SVE.
- KVM unifica a finalização de vetores em
KVM_ARM_VCPU_VEC
; SVE/SME compartilham o “commit” do VL. - Pseudoregistros expõem conjuntos de VL (um para SVE, outro para SME) para user space.
- FFR no streaming mode depende de FA64; traps e save/restore respeitam isso.
TPIDR2_EL0
entra no contexto; ID registers controlam exposição de sub-features (FA64, SME2).- Objetivo: KVM ARM64 SME pronto para rodar IA/HPC de verdade em VMs Arm.