C++ Academy · Aula

Previsão de ramificações e ciclos intensivos

Ajude a CPU a prever ramificações e escreva ciclos que o compilador possa otimizar

Aula 2 de 414 etapas

Previsão de ramificações e ciclos intensivos é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C++ Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C++ Academy inclui 4 aulas no total.

O preditor de desvios

As CPUs modernas preveem a próxima instrução antes que a anterior termine. Quando a previsão está errada, o fluxo de processamento para — isso custa de 10 a 20 ciclos.

Desvios previsíveis

Desvios que quase sempre seguem um caminho (ou seguem um padrão claro) são bem previstos. Desvios aleatórios são catastróficos.

Dados ordenados ajudam

Percorrer dados ordenados com uma condicional costuma ser mais rápido do que percorrer dados desordenados — o preditor aprende o padrão.

// Often much faster on sorted data
std::sort(v.begin(), v.end());
int sum = 0;
for (int x : v) {
    if (x > 128) sum += x;
}

Código sem desvios

Substitua os desvios por aritmética quando possível. A CPU avalia os dois caminhos e seleciona um sem fazer desvios.

// Branchy
int max(int a, int b) { return (a > b) ? a : b; }

// Branchless (often equivalent in machine code)
int max(int a, int b) { return a + (b - a) * (b > a); }

std::max como a melhor escolha

Os compiladores modernos costumam produzir código sem desvios automaticamente. Escreva código claro e deixe o otimizador trabalhar — mas inspecione o código desmontado nos caminhos críticos.

Dicas de provável e improvável

O C++20 adicionou [[likely]] e [[unlikely]] para fornecer uma dica ao compilador.

if (error_condition) [[unlikely]] {
    handle_error();
}

Desenrolamento de laços

Fazer mais trabalho por iteração reduz a frequência dos desvios. Os compiladores modernos desenrolam os laços por conta própria; use #pragma unroll apenas quando as medições mostrarem que isso ajuda.

Evite cargas de trabalho mistas nos laços

Um laço com dois casos que se alternam aleatoriamente derrota a previsão. Separe-o em dois laços (um para cada caso) quando possível.

// Slow: random switching
for (auto& x : v) {
    if (x.type == A) process_A(x);
    else            process_B(x);
}

// Faster: partition first
std::partition(v.begin(), v.end(), [](auto& x) { return x.type == A; });
for (size_t i = 0; i < boundary; ++i) process_A(v[i]);
for (size_t i = boundary; i < v.size(); ++i) process_B(v[i]);

Expanda as funções frequentemente executadas

A sobrecarga de uma chamada de função pode ser comparável ao corpo da função em laços críticos. As dicas inline ajudam; __attribute__((always_inline)) (GCC/Clang) é mais rigoroso.

Não confie na intuição

Os compiladores e as CPUs são muito inteligentes. Meça antes de otimizar. A versão "óbvia" sem desvios pode ser mais lenta que a versão com desvios depois que o preditor é treinado.

SIMD para laços amplos

A vetorização automática transforma um laço em instruções SIMD quando possível. Use código limpo, tipos simples e evite dependências de dados entre as iterações.

Otimização guiada por perfil (PGO)

Compile, execute, colete dados de análise e recompile com as dicas. Os compiladores usam esses dados para fazer previsões melhores sobre quais desvios são frequentemente executados.

Verificação rápida

Por que ordenar os dados antes de um laço de filtragem pode às vezes acelerar a execução?

Recapitulação

Desvios previstos incorretamente custam ciclos. Mantenha os desvios previsíveis (dados ordenados ajudam), use dicas de provável e improvável, particione as cargas de trabalho para manter os laços uniformes e confie no compilador para otimizar, a menos que a análise de desempenho prove o contrário.

Grátis para começar

Aprenda C++ com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
51
Aulas
203

Perguntas Frequentes

A aula “Previsão de ramificações e ciclos intensivos” é grátis?

Sim — o texto completo de “Previsão de ramificações e ciclos intensivos” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C++ Academy, atualize para CoddyKit PRO. O curso de C++ Academy inclui 4 aulas no total.

O que vou aprender em “Previsão de ramificações e ciclos intensivos”?

Ajude a CPU a prever ramificações e escreva ciclos que o compilador possa otimizar Você pratica C++ Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C++ Academy?

Nenhuma experiência prévia é necessária. C++ Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Previsão de ramificações e ciclos intensivos”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C++ Academy?

Sim. Cada aula de C++ Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Organizações de dados favoráveis à cache
  2. Previsão de ramificações e ciclos intensivos
  3. Criação de perfis com perf, vtune e Sanitizers
  4. Microavaliação de desempenho com Google Benchmark
← Voltar para C++ Academy