5.3.2. Uso de Cache de Perfil com o Cachegrind
Cachegrind simula a interação do seu programa com a hierarquia de cache de uma máquina e (opcionalmente) ramificação preditora. Ele controla o uso da instrução de primeiro nível simulada e caches de dados para detectar a interação do código pobre com este nível de cache; e o cache de último nível, mesmo que seja um segundo ou terceiro nível de cache, a fim de controlar o acesso à principal memória. Como tal, os programas são executados com Cachegrind funcionam 20-100 vezes mais lentos do que quando executados normalmente.
Para executar o Cachegrind, execute o seguinte comando, substituindo o program pelo programa que você deseja realizar o perfil com o Cachegrind.
# valgrind --tool=cachegrind program
O Cachegrind pode reunir as seguintes estatísticas para todo o programa, e para cada função no programa:
- as leituras de Cache de instrução de primeiro nível (ou as instruções executadas) e falta de leituras, e falta de leitura de instrução de cache de último nível;
- leituras de cache de dados (ou leituras de memória), falta de leituras, e falta de leituras de dados do cache de último nível;
- gravações de cache de dados (ou gravações de memória), falta de gravações, e falta de gravações de último nível
- ramificações condicionais executadas e mal previstas; e
- ramificações indiretas executadas e mal previstas.
O Cachegrind imprime as informações de resumo sobre estas estatísticas no console e grava informações mais detalhadas de perfil em um arquivo (
cachegrind.out.pid
por padrão, onde pid é o ID do processo do programa no qual você executou o Cachegrind). Este arquivo pode ser processado mais tarde acompanhado da ferramenta cg_annotate, como abaixo:
# cg_annotate cachegrind.out.pid
Nota
cg_annotate pode produzir linhas maiores do que 120 caracteres, dependendo do comprimento do caminho. Para tornar a saída mais clara e fácil de ler, recomendamos fazer a sua janela de terminal pelo menos desta largura antes de executar o comando acima mencionado.
Você também pode comparar os arquivos de perfil criados pelo Cachegrind para facilitar o desempenho do programa da tabela antes e depois de uma mudança. Para fazer isto, use o comando cg_diff substituindo first pelo arquivo de resultado do perfil inicial, e second pelo arquivo de resultado de perfil subsequente:
# cg_diff first second
Este comando produz um arquivo de resultado combinado, que pode ser visualizado em mais detalhes com o cg_annotate.
Cachegrind suporta um número de opções para focar seu resultado. Algumas das opções disponíveis são:
--I1
- Especifica o tamanho, associatividade e tamanho da linha do cache de instrução de primeiro nível, separado por vírgulas:
--I1=size,associativity,line size
. --D1
- Especifica o tamanho, associatividade e tamanho da linha do cache de dados de primeiro nível, separado por vírgulas:
--D1=size,associativity,line size
. --LL
- Especifica o tamanho, associatividade e tamanho da linha do cache último nível, separado por vírgulas:
--LL=size,associativity,line size
. --cache-sim
- Habilita ou desabilita a coleção de acesso a cache e contas faltando. O valor padrão é
yes
(habilitado).Note que desabilitar este e--branch-sim
deixa o Cachegrind sem informações para coletar. --branch-sim
- Habilita ou desabilita a coleção de instruções de ramificação e contas mal previstas. Isto é definido para
no
(desabilitado) por padrão, pois ele desacelera o Cachegrind em aproximadamente 25 porcento.Note que desabilitar este e--cache-sim
deixa o Cachegrind sem informações para coletar.
Para uma lista completa de opções consulte a documentação incluída em
/usr/share/doc/valgrind-version/valgrind_manual.pdf
.