Estou tentando obter uma descrição precisa da hierarquia de cache de dados da CPU atual no Linux: não apenas o tamanho dos caches de dados individuais L1 / L2 / L3 (e possivelmente L4), mas também a maneira como eles são divididos ou compartilhados núcleos.
Por exemplo, na minha CPU (AMD Ryzen Threadripper 3970X), cada núcleo possui seu próprio cache de dados L1 de 32 KB e cache L2 de 512 KB, no entanto, o cache L3 é compartilhado entre núcleos em um complexo complexo (CCX). Em outras palavras, existem 8 caches L3 distintos, cada um com 16 MB.
A seção "Cache" desta captura de tela da CPU-Z no Windows é basicamente o que estou tentando descobrir:
Não tenho problemas em obter essas informações no Windows GetLogicalProcessorInformation()
.
No entanto, no Linux, parece que sysconf()
apenas o tamanho do cache por núcleo para caches de dados L1 e L2 ( _SC_LEVEL1_DCACHE_SIZE
e _SC_LEVEL2_DCACHE_SIZE
) ou o tamanho total do cache L3 ( _SC_LEVEL3_CACHE_SIZE
).
EDIT: saída do lstopo no VMWare . A máquina virtual possui 8 núcleos. As informações de cache L1 e L2 são boas, mas o tamanho do cache L3 não parece estar correto:
sysconf()
. Como entendê-las se não sabemos se os caches são compartilhados ou não?
cpuid
instrução x86 nesse ISA e talvez até incorporar alguns detalhes de layout de cache por modelo. IDK quantos detalhes os vários CPUID folheiam como sandpile.org/x86/cpuid.htm#level_0000_0004h podem representar.
lstopo
Linux no bare metal? (por exemplo, inicialize um USB ativo). Seu resultado falso pode ser culpa da VM, portanto devemos excluir isso. Sem surpresa, ele funciona como esperado no meu desktop i7-6700k, mostrando todos os 4 núcleos no mesmo pacote que compartilham um cache L3. Mas a família Intel Sandybridge é a série de CPUs x86 mais amplamente usada e não alterada recentemente.
lstopo
também está disponível para Windows . lstopo
use a cpuid
instrução (e talvez a SRAT
tabela ACPI ). cpuid
é relativamente fácil de usar, mas Intel e AMD diferem bastante nesse aspecto. hwloc
(ao qual lstopo
pertence) tem uma interface de API que você pode usar para obter a topologia de cache no Windows e Linux.