Pipeline Execução sequencial das instruções Uma etapa do ciclo de instrução se inicia após a conclusão da anterior Uma máquina com este tipo de execução é chamada de SISD (Single Instruction Single Data) Para aumentar a velocidade de execução de uma instrução, era necessário aumentar o clock do processador e melhorar a tecnologia dos semicondutores As etapas do ciclo de instrução permaneciam sendo realizadas seqüencialmente Sobreposição temporal das etapas da execução de instruções As etapas de um ciclo de instrução vão ocorrer simultaneamente, porém sobre instruções diferentes Cada uma das etapas do ciclo de instrução recebe o nome de estágio Cada estágio é executado por uma unidade do processador: ◦ Unidade ◦ Unidade ◦ Unidade ◦ Unidade ◦ Unidade de de de de de Busca de Instrução (BI) Decodificação (D) Busca de Operandos (BO) Execução da Instrução (E) Escrita de Resultados (ER) Processador Unidade De BI instrução Unidade De D instrução Unidade De BO Unidade De E instrução Unidade instrução De ER Existem no pipeline situações em que a instrução seguinte não pode ser executada no próximo ciclo de clock: conflitos Existem três tipos de conflitos: ◦ Conflitos Estruturais ◦ Conflitos de Controle ◦ Conflitos de Dados Ocorre quando duas instruções estão em etapas diferentes mas estão utilizando o mesmo hardware, por exemplo, a memória No diagrama anterior ocorrem vários conflitos para acessar a memória, por exemplo: ◦ No instante de tempo 5, a instrução 5 está sendo buscada na memória junto com os operandos da instrução 3 Conflito Se a memória for uma só, não é possível atender as duas requisições ao mesmo tempo ◦ A memória principal (ou cache) possui somente uma porta para atendimento de requisições Nas máquinas modernas existem duas memórias cache: cache de dados e cache de instruções O estágio de busca de instruções irá buscar a instrução 5 na cache de instruções e ao mesmo tempo o estágio de busca de operandos acessa a cache de dados Problema resolvido (para casos em que temos cache separadas) Ocorre quando uma instrução que está no pipeline é um desvio condicional Enquanto esta instrução não passar pelo estágio de execução, não se sabe qual é a próxima instrução a ser executada Ocorrerá, então, uma parada no pipeline (bolha) ◦ Queda no desempenho do pipeline Para entendermos o que acontece no pipeline quando uma instrução de desvio é executada, iremos analisar o trecho de código a seguir Considere que o código está armazenado na memória na ordem ilustrada Instr. Instr. Instr. Instr. Instr. Instr. Instr. 1 2 3 4 5 6 7 Instr. 8 Instr. 9 Instr. 10 Instr. 11 cin>>x>>valor; Instrução de menor = 0; desvio maior = 0; condicional If (valor< x) { maior = menor; Desvio menor= valor; cout<< “qualquer coisa”; } Fluxo de else { execução menor = maior; seqüencial maior = valor; } cin>> k; K++; A técnica mais utilizada para resolver o conflito de controle é a predição ou previsão de desvios ◦ A unidade de busca de instrução tenta prever se o desvio será tomado ou não ◦ Esta previsão é baseada em uma tabela de histórico de desvios A tabela de histórico é uma memória cache pequena associada ao estágio de busca de instrução do pipeline e tem cerca de 90 % de precisão ◦ Esta tabela contém todas as instruções de desvio de um programa, informando se houve desvio ou não da última vez que a instrução foi executada ◦ Se uma instrução de desvio condicional provocou um desvio da última vez que ela foi executada, da próxima vez que esta instrução for executada, a unidade de busca irá considerar que haverá desvio novamente int F, N; F = 1; cin >> N; Em caso de estruturas de repetição, é considerado que sempre ocorrerá desvio If (N = = 0) cout << “Fatorial de 0 é 1”; else { F = N; while (N !=1){ F = F * (N-1); N = N –1; } cout << “Fatorial de N é”, F; } Desvio Fluxo de execução seqüencial Quando a previsão está correta, o pipeline prossegue na velocidade máxima Quando a previsão falha, o pipeline é esvaziado e as instruções corretas são buscadas A execução de uma instrução depende do resultado de outra que ainda está no pipeline Exemplo: suponha que tenhamos uma instrução de carga imediatamente seguida por uma instrução de subtração que utilize o resultado da carga LDA Op ACC (OP) SUB Op ACC ACC - (OP) A operação SUB precisa do conteúdo do ACC no 4o estágio do pipeline A operação LDA só escreve o resultado no ACC no 5o estágio do pipeline Neste caso vai ocorrer uma bolha no pipeline Bolha A solução para resolver este conflito é a reordenação das instruções ◦ As instruções que não estão conflitando são adiantadas Reordenação LDA Op LDA Op SUB Op GET Op GET Op SUB Op