Todas as plataformas são bem-vindas, especifique a plataforma para sua resposta.
Uma pergunta semelhante: como obter programaticamente o tamanho da página de cache da CPU em C ++?
c++
c
caching
operating-system
systems-programming
paxos1977
fonte
fonte
SDL_GetCPUCacheLineSize
função do SDL2 e , em seguida, dar uma olhada nocpuid macro
qual possui o código-fonte do assembly para cada do modelo de processador. Você pode dar uma olhada em imgur.com/a/KP57m6s ou espreitar diretamente a fonte.Respostas:
No Linux (com um kernel razoavelmente recente), você pode obter essas informações em / sys:
Este diretório possui um subdiretório para cada nível de cache. Cada um desses diretórios contém os seguintes arquivos:
Isso fornece mais informações sobre o cache do que você esperaria saber, incluindo o tamanho da linha de cache (
coherency_line_size
), bem como quais CPUs compartilham esse cache. Isso é muito útil se você estiver fazendo programação multithread com dados compartilhados (você obterá melhores resultados se os threads que compartilham dados também estiverem compartilhando um cache).fonte
cat /sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size
retorna64
no meu sistema. O mesmo para as pastas index1,2,3 também.No Linux, veja sysconf (3).
Você também pode obtê-lo na linha de comando usando o getconf:
fonte
Eu tenho trabalhado em algumas coisas de linha de cache e precisava escrever uma função de plataforma cruzada. Eu o comprometi com um repositório do github em https://github.com/NickStrupat/CacheLineSize , ou você pode simplesmente usar a fonte abaixo. Sinta-se livre para fazer o que quiser com ele.
fonte
No x86, você pode usar a instrução CPUID com a função 2 para determinar várias propriedades do cache e do TLB. A análise da saída da função 2 é um pouco complicada, por isso, consultarei a seção 3.1.3 da Identificação do processador Intel e a instrução CPUID (PDF).
Para obter esses dados do código C / C ++, você precisará usar assembly embutido, intrínsecas do compilador ou chamar uma função de assembly externo para executar a instrução CPUID.
fonte
Se você estiver usando SDL2, poderá usar esta função:
Que retorna o tamanho do tamanho da linha de cache L1, em bytes.
Na minha máquina x86_64, executando este trecho de código:
Produz
CacheLineSize = 64
Sei que estou um pouco atrasado, mas apenas adicionando informações para futuros visitantes. A documentação SDL atualmente diz que o número retornado está em KB, mas na verdade está em bytes.
fonte
Na plataforma Windows:
de http://blogs.msdn.com/oldnewthing/archive/2009/12/08/9933836.aspx
fonte
O ARMv6 e superior tem
C0
ou o Registro de tipo de cache. No entanto, está disponível apenas no modo privilegiado.Por exemplo, no Manual de referência técnica Cortex ™ -A8 :
Não assuma que o processador ARM possui um cache (aparentemente, alguns podem ser configurados sem um). A maneira padrão de determinar isso é via
C0
. No ARM ARM , página B6-6:fonte
Você também pode tentar fazê-lo programaticamente medindo algum tempo. Obviamente, nem sempre será tão preciso quanto a CPU e os gostos, mas é mais portátil. ATLAS faz isso em seu estágio de configuração, você pode querer olhar para ele:
http://math-atlas.sourceforge.net/
fonte