Como as CPUs são tão loucas?

0
Estou passando por um livro sobre C e ele disse: "Escreva um programa que conte de 1 a 300 milhões, imprimindo o número apenas se for um múltiplo de 100 milhões. Use um cronômetro para divertir o programa!"

Eu não estava exatamente empenhado em sincronizá-lo, mas sem qualquer otimização com o GCC o tempo é de cerca de 0,85 segundos e com a otimização de cerca de metade disso.

Como os processadores são rápidos? Eu suponho que eles usam alguma maneira especial para contar (ou é como o gcc compila isso?), Mas o que eles fazem para contar tão rápido?

    
por dsadsads 25.06.2014 / 02:14

2 respostas

3

Isso dependeria muito da sua definição de rápido.

Um processador de 3Ghz tem três bilhões de ciclos por segundo. A quantidade de instruções que podem ser executadas por ciclo depende de muitas coisas, incluindo o conjunto de instruções, núcleos, arquitetura e qual tarefa está sendo executada. Os processadores são projetados e otimizados para fazer o máximo possível durante um único ciclo.

Mas vamos dizer um cenário de pior caso de uma instrução por ciclo para esta tarefa bastante simples.

A questão então se torna "por que leva um total de 0,85 segundos apenas para contar para 300 milhões? Afinal, é um incremento simples com um teste para conclusão. Deve levar muito menos tempo do que isso.

O que está atrasando é a saída periódica. Operações de entrada / saída são o gargalo aqui e são geralmente. A quantidade de código necessária para produzir um número simples é maior do que o contador e deve interagir com os subsistemas da CPU para obter as informações na tela.

Pegue sua impressão e veja o quão rápido ela é executada.

    
por 25.06.2014 / 02:45
0

Um processador de 1 GHz é capaz de executar 1 bilhão de instruções a cada segundo (Ignorando Hyperthreading Pipelining multicore e outros recursos de cpu para permitir que várias instruções sejam executadas de uma só vez.

A instrução para incrementar seu contador é de apenas 1 instrução, dependendo de como sua verificação de 100 milhões e como o gcc otimiza a verificação pode chegar a algumas instruções, que provavelmente também é insignificante como compiladores modernos olharem à frente / branch previsão, o que significa que sua CPU presumirá que o número não é um múltiplo de 100 milhões e continuará incrementando seu contador até obter o resultado da comparação real e, no caso de ser um múltiplo de 100 milhões, ele irá retornar a verifique e execute sua declaração de impressão, que será relativamente lenta, pois precisa lidar com o hardware fora da CPU.

Portanto, aumentar o número de impressões diminuiria a velocidade de 2 maneiras, 1 falharia no teste com mais frequência, mas o tempo extra gasto na impressão seria muito mais significativo.

    
por 25.06.2014 / 02:49