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.pidpor 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.