Por que o kernel não pode usar registros e instruções do SSE / AVX?

0

Esta postagem do StackOverflow tem isso ,

In some environments there there is a restriction on certain instructions or using certain registers. For example, in the Linux kernel, use of SSE/AVX or FP registers is generally disallowed. Therefore most of the optimized memcpy variants cannot be used as they rely on SSE or AVX registers, and a plain 64-bit mov-based copy is used on x86. For these platforms, using rep movsb allows most of the performance of an optimized memcpy without breaking the restriction on SIMD code.

Por que o kernel x86_64 não pode usar o SSE / AVX? Se isso tornasse memcopy() mais rápido, parece que deveria ser permitido. Estou apenas aprendendo o Intel Assembly e especificamente procurando aprender o SEE / AVX quando vi este comentário.

Especificamente interessado em otimizações de SSE / MME e AVX no kernel do Linux.

    
por Evan Carroll 17.10.2018 / 08:34

1 resposta

3

Como Gilles menciona, em qualquer lugar que o FPU possa ser usado, o kernel precisa suportar salvar e restaurar seu estado. Como o espaço do usuário pode usar o FPU, isso precisa ser tratado em qualquer caso em comutadores de contexto ( ie , quando a CPU atual alterna de um thread para outro) - pelo menos, quando a execução anterior thread usou o FPU. Então, por que não estender isso ao kernel?

Existem algumas razões para evitar o uso do FPU no kernel:

  • do ponto de vista da portabilidade, algumas arquiteturas não suportam o uso do FPU no kernel, portanto, o código genérico não pode confiar nele;
  • salvar e restaurar o estado da FPU é caro e introduz certas restrições relacionadas à implementação (no x86 Linux, a preempção em particular precisa de uma consideração cuidadosa aqui).

Fazer o kernel evitar o uso do FPU significa que o custo do espaço do usuário pode ser reduzido: o estado do FPU só precisa ser restaurado após uma mudança de contexto ao retornar ao espaço do usuário (ao contrário de imediatamente após uma mudança de contexto), e não em todos os casos (somente quando as threads envolvidas realmente usam o FPU).

é possível usar o FPU (e MMX / SSE / AVX) no kernel, em código específico do x86, onde os benefícios superam os custos: assim ele acaba sendo usado no código de criptografia e RAID6. Esses e-mails do Linus fornecem mais alguns detalhes. Se você quiser usar o FPU, precisará colocar o bracket em todas as FPUs, usando o código entre kernel_fpu_begin e kernel_fpu_end , e certifique-se de que ele não possa falhar ou adormecer. Consulte arch/x86/include/asm/fpu/api.h e arch/x86/kernel/fpu/core.c para detalhes.

Para memcpy , os ganhos de desempenho não superam o custo do uso da FPU.

(x86 tem uma arquitetura FPU bastante complexa, mas fornece todos os recursos necessários para permitir que um sistema operacional compartilhe o FPU: ele pode interceptar sempre que uma instrução FPU é emitida, o que permite que o kernel otimize processos que nunca usa o FPU, e pode indicar quando o estado da CPU e do FPU é capaz de divergir.Ele também fornece instruções para salvar e restaurar o estado do FPU - FSAVE , FXSAVE e XSAVE dependendo do vintage da FPU O suporte a FPU é talvez o aspecto do design do 8086, no qual os projetistas tiveram a maior visão .

    
por 17.10.2018 / 09:41