Execução especulativa

Execução especulativa é uma técnica de otimização na qual um processador (CPU) executa uma série de tarefas antes de ser solicitado, a fim de ter a informação pronta se for necessária em qualquer ponto. A execução especulativa usa processamento simultâneo e execução fora de ordem (OoOE) para antecipar e buscar dados que possam ser necessários em um último ponto. Elimina a espera de instruções apropriadas para o próximo passo.  A execução especulativa usa a previsão de ramos para adivinhar quais instruções provavelmente serão necessárias no futuro próximo e a análise do fluxo de dados para organizar as instruções para uma execução ótima (em vez de executá-las na ordem em que chegaram). O objetivo é reduzir o tempo total de execução e melhorar o desempenho geral da CPU.

Primeiro, o preditor do ramo adivinha qual ramo é mais provável de ser tomado no processo e então reúne o próximo conjunto de instruções associadas a esse ramo. Ele então começará a executá-los especulativamente antes de saber qual dos dois ramos ele realmente estará usando. Se o ramo adivinhou corretamente, então as instruções já estão alinhadas e não haverá atraso na execução. Se o branch predictor adivinhou incorretamente, então o sistema carrega a informação apropriada e procede com essas instruções em seu lugar. Entretanto, as taxas de precisão para os preditores de ramos são tipicamente acima de 95%, então a necessidade de recarregar novas informações é incomum.

Com a execução na ordem, uma parada no pipeline irá parar a CPU inteira até que o problema seja resolvido. Além disso, uma lacuna é criada entre a CPU e as velocidades da memória principal. À medida que a lacuna cresce, o tempo gasto à espera que a memória principal entregue informações à CPU também cresce, aumentando assim o tempo gasto à espera da execução. A execução especulativa fecha essa lacuna, mantendo a CPU ocupada e minimizando o tempo que ela passa ociosa, melhorando assim o desempenho geral do sistema.

A execução especulativa foi adotada pela Intel, que começou a usar o OoOE com seus microprocessadores Pentium Pro e Pentium II, Advanced Micro Devices (AMD), que a introduziu com o microprocessador K5, e Advanced RISC Machines (ARM), que começou a usá-lo com o microprocessador Cortex A9.

Embora a execução especulativa possa melhorar o desempenho de um sistema de computador, é importante notar que ela também pode causar falhas de segurança, como a vulnerabilidade da CPU derretida.