Capitulo_5_9

download Capitulo_5_9

of 14

Transcript of Capitulo_5_9

  • 7/25/2019 Capitulo_5_9

    1/14

    5.9 Material avanado: Implementandocontroladores de cache

    A seo comea com o SystemVerilog do controlador de cache da Seo 5.7 em oito fi-guras. Depois, entra nos detalhes de um protocolo de coerncia de cache de exemplo e asdificuldades na implementao de tal protocolo.

    SystemVerilog de um controlador de cache simples

    A linguagem de descrio de hardware que estamos usando nesta seo SystemVerilog. Amaior mudana das verses anteriores do Verilog que ele apanha estruturas da linguagemC para tornar o cdigo mais fcil de ler. As Figuras de 5.9.1 a 5.9.8 mostram a descrioem SystemVerilog do controlador de cache.

    As Figuras 5.9.1 e 5.9.2 declaram as estruturas que so usadas na definio da cache nasfiguras seguintes. Por exemplo, a estrutura de tag de cache (cache_tag_type) contmum bit de validade (valid), um bit de modificao (dirty) e um campo de tag de 18

    bits (tag [TAGMSB:TAGLSB]). A Figura 5.9.3 mostra o diagrama em blocos da cacheusando os nomes da descrio Verilog.

    package cache_def;

    // estruturas de dados para tag e dados de cache

    parameter int TAGMSB = 31; //tag msb

    parameter int TAGLSB = 14; //tag lsb

    // estrutura de dados para tag de cache

    typedef struct packed {

    bit valid; //bit valid

    bit dirty; //bit dirty

    bit [TAGMSB:TAGLSB]tag; //tag bits}cache_tag_type;

    // estrutura de dados para solicitao de memria cache

    typedef struct {

    bit [9:0]index; // ndice de 10 bits

    bit we; // write enable

    }cache_req_type;

    // dados da linha de cache de 128 bits

    typedef bit [127:0]cache_data_type;

    FIGURA 5.9.1Declaraes de tipo no SystemVerilog para as tags e dados de cache. O campo de tagtem 18 bits delargura e o campo de ndice tem 10 bits de largura, enquanto um campo de 2 bits (bits 3-2) usado para indexar obloco e selecionar a word do bloco. O restante da declarao de tipo encontrado na figura seguinte.

  • 7/25/2019 Capitulo_5_9

    2/14

    2 Material Complementar ELSEVIER

    // Estruturas de dados para interface CPUControlador de cache

    // Solicitao de CPU (CPU->controlador de cache)

    typedef struct {

    bit [31:0]addr; // endereo de solicitao de 32 bits

    bit [31:0]data; // dados de solicitao de 32 bits (usados naescrita)

    bit rw; // tipo de solicitao: 0 = leitura, 1 = escrita

    bit valid; // solicitao vlida

    }cpu_req_type;

    // Resultado da cache (controlador de cache->cpu)

    typedef struct {

    bit [31:0]data; // dados de 32 bits

    bit ready; // resultado est pronto

    }cpu_result_type;

    //------------------------------------------------------------------

    // estruturas de dados para controlador de cacheinterface de memria

    // solicitao de memria (controlador de cache->memria)

    typedef struct {

    bit [31:0]addr; // solicita endereo do byte

    bit [127:0]data; // dados de solicitao de 128 bits (usado na

    escrita)

    bit rw; // tipo de solicitao : 0 = leitura, 1 = escrita

    bit valid; // solicitao vlida

    }mem_req_type;

    // resposta do controlador de memria (memria -> controlador de cache)

    typedef struct {cache_data_typedata; // dados de 128 bits lidos de volta

    bit ready; // dados prontos

    }mem_data_type;

    endpackage

    FIGURA 5.9.2Declaraes de tipo em SystemVerilog para as interfaces CPU-cache e cache-memria. Estas soquase idnticas, exceto que os dados tm 32 bits de largura entre a CPU e a cache, e 128 bits entre a cache e a memria.

  • 7/25/2019 Capitulo_5_9

    3/14

    5.9 Material avanado: Implementando controladores de cache 3

    FIGURA 5.9.3Diagrama em blocos da cache simples usando os nomes do Verilog. No aparecem aqui os write enables para a memria de tag da cache e

    para a memria de dados da cache, ou os sinais de controle para multiplexadores que fornecem dados para a varivel Data Write. Em vez de ter write enablesseparados em cada word do bloco da cache de dados, o Verilog l o valor antigo do bloco no Data Write e depois atualiza a word nessa varivel em uma escrita.Depois, ele escreve o bloco inteiro de 128 bits.

    A Figura 5.9.4 instancia mdulos para os dados de cache (dm_cache_data) e tag decache (dm_cache_tag). Essas memrias podem ser lidas a qualquer momento, mas asescritas s ocorrem na transio positiva do clock (posedge(clk)) e somente se writeenable for 1 (data_req.we ou tag_req.we).

    /*cache: memria de dados, nica porta, 1024 blocos*/

    module dm_cache_data(input bit clk,

    input cache_req_type data_req,// requisita dados/comando, p.e.

    RW, valid

    input cache_data_type data_write, // porta de escrita (linha de

    128 bits)

    output cache_data_type data_read); // porta de leitura

    timeunit 1ns; timeprecision 1ps;

    cache_data_typedata_mem[0:1023];

    initial begin

    for (int i=0; i

  • 7/25/2019 Capitulo_5_9

    4/14

    4 Material Complementar ELSEVIER

    assign data_read = data_mem[data_req.index];

    always_ff @(posedge(clk)) begin

    if (data_req.we)

    data_mem[data_req.index] memria)

    output cpu_result_type cpu_res //resultado da cache (ca-

    che->CPU)

    );

    timeunit 1ns;

    timeprecision 1ps;

  • 7/25/2019 Capitulo_5_9

    5/14

  • 7/25/2019 Capitulo_5_9

    6/14

    6 Material Complementar ELSEVIER

    case(cpu_req.addr[3:2])

    2b00:data_write[31:0] = cpu_req.data;

    2b01:data_write[63:32] = cpu_req.data;

    2b10:data_write[95:64] = cpu_req.data;

    2b11:data_write[127:96] = cpu_req.data;

    endcase

    /*leitura da word correta (32 bits) da cache (para CPU)*/

    case(cpu_req.addr[3:2])

    2b00:v_cpu_res.data = data_read[31:0];

    2b01:v_cpu_res.data = data_read[63:32];

    2b10:v_cpu_res.data = data_read[95:64];

    2b11:v_cpu_res.data = data_read[127:96];

    endcase

    /*endereo da requisio de memria (apanhado da req. de CPU)*/

    v_mem_req.addr = cpu_req.addr;

    /*dados de requisio de memria (usados na escrita)*/

    v_mem_req.data = data_read;

    v_mem_req.rw = 0;

    FIGURA 5.9.6FSM no SystemVerilog, parte II.Esta seo descreve o valor default de todos os sinais. As figuras se-guintes definiro esses valores para um ciclo de clock, e esse Verilog retornar a esses valores no ciclo de clock seguinte.

    As duas ltimas figuras mostram a FSM como uma grande instruo case (case(rstate)), com as quatro divises de estado nas duas figuras. A Figura 5.9.7 comea como estado Idle (idle), que simplesmente vai para o estado Compare Tag (compare_tag)se a CPU fizer uma requisio vlida. Depois, ela descreve a maior parte do estado CompareTag. O estado Compare Tag verifica se as tags combinam e a entrada vlida. Se for, entoela primeiro define o sinal Cache Ready (v_cpu_res.ready). Se a requisio for uma

    escrita, ela define o campo de tag, o bit de validade e o bit de modificao. O estado seguinte Idle. Se for uma perda de cache, ento o estado se prepara para mudar a entrada da tage os bits de validade e modificao. Se o bloco a ser substitudo estiver limpo ou invlido,o prximo estado Allocate.

    //----------------------- FSM da cache-------------------------

    case(rstate)

    /*estado idle*/

    idle : begin

    /*Se houver requisio de CPU, ento compara tag de cache*/

    if (cpu_req.valid)

    vstate = compare_tag;

    end

    /*estado compare_tag*/compare_tag : begin

    /*acerto de cache (tag combina e entrada de cache vlida)*/

    if (cpu_req.addr[TAGMSB:TAGLSB] == tag_read.tag && tag_read.va-

    lid) begin

    v_cpu_res.ready = 1;

    /*acerto de escrita*/

    if (cpu_req.rw) begin

    /*linha de cache read/modify*/

    tag_req.we = 1; data_req.we = 1;

  • 7/25/2019 Capitulo_5_9

    7/14

    5.9 Material avanado: Implementando controladores de cache 7

    /*sem mudana na tag*/

    tag_write.tag = tag_read.tag;

    tag_write.valid = 1;

    /*linha de cache modifcada*/

    tag_write.dirty = 1;

    end

    /*xaction terminada*/

    vstate = idle;

    end

    /*perda de cache*/

    else begin

    /*gera nova tag*/

    tag_req.we = 1;

    tag_write.valid = 1;

    /*nova tag*/

    tag_write.tag = cpu_req.addr[TAGMSB:TAGLSB];

    /*linha de cache modifcada se houver escrita*/

    tag_write.dirty = cpu_req.rw;

    /*gera requisio de memria na perda de cache*/

    v_mem_req.valid = 1;

    /*perda compulsria ou perda com bloco limpo*/

    if (tag_read.valid == 1b0 || tag_read.dirty == 1b0)

    /*espera at novo bloco ser alocado*/

    vstate = allocate;

    FIGURA 5.9.7FSM in SystemVerilog, parte III. Estados reais da FSM via instrues case nesta e na figura seguinte.Esta figura tem o estado Idle e a maior parte do estado Compare Tag.

    A Figura 5.9.8 continua o estado Compare Tag. Se o bloco a ser substitudo for modifica-do, ento o prximo estado Write-Back. A figura mostra o estado Allocate (allocate)em seguida, que simplesmente l o novo bloco. Ele continua realizando o loop at que amemria esteja pronta; quando estiver, ela vai para o estado Compare Tag. Isso seguidona figura pelo estado Write-Back (write_back). Como mostra a figura, o estado Wri-te-Back simplesmente escreve o bloco modificado na memria, mais uma vez realizandoum loop at que a memria esteja pronta. Quando a memria estiver pronta, indicandoque a escrita est concluda, passamos ao estado Allocate.

    else begin

    /*perda com linha modifcada*/

    /*endereo de write back*/

    v_mem_req.addr = {tag_read.tag, cpu_req.addr[TAGLSB-1:0]};

    v_mem_req.rw = 1;/*espera at escrita terminar*/

    vstate = write_back;

    end

    end

    end

    /*wait alocao de nova linha de cache*/

    allocate: begin

    /*controlador de memria respondeu*/

    if (mem_data.ready) begin

    /*compara tag novamente na perda de escrita (modifcar word

    correta)*/

  • 7/25/2019 Capitulo_5_9

    8/14

    8 Material Complementar ELSEVIER

    vstate = compare_tag;

    data_write = mem_data.data;

    /*atualiza dados da linha de cache*/

    data_req.we = 1;

    end

    end/*espera write back da linha de cache modifcada*/

    write_back : begin

    /*write back completado*/

    if (mem_data.ready) begin

    /*emite nova req. de memria (alocando nova linha)*/

    v_mem_req.valid = 1;

    v_mem_req.rw = 0;

    vstate = allocate;

    end

    end

    endcase

    end

    always_ff @(posedge(clk)) begin

    if (rst)

    rstate

  • 7/25/2019 Capitulo_5_9

    9/14

    5.9 Material avanado: Implementando controladores de cache 9

    em um item de dados compartilhado no pode realmente ser completada at que obtenha oacesso ao barramento. Todos os esquemas de coerncia exigem algum mtodo de serializaros acessos ao mesmo bloco de cache, seja serializando o acesso ao meio de comunicaoou outra estrutura compartilhada.

    Alm de invalidar cpias pendentes de um bloco de cache que est sendo escrito, tam-

    bm precisamos localizar um item de dados quando houver uma falta de cache. Em umacache write-through, fcil encontrar o valor recente de um item de dados, pois todos osdados escritos sempre so enviados memria, da qual o valor mais recente de um itemde dados sempre pode ser apanhado. Em um projeto com largura de banda de memriaadequada para dar suporte ao trfego dos processadores, o uso de write-through simplificaa implementao da coerncia de cache.

    Para uma cache write-back, encontrar o valor de dados mais recente mais difcil, poiso valor mais recente de um item de dados pode estar em uma cache, em vez da memria.Felizmente, as caches write-back podem usar o mesmo esquema de verificao para perdasde cache e para escritas: cada processador verifica todos os endereos colocados no bar-ramento. Se um processador descobrir que tem uma cpia modificada do bloco de cachesolicitado, ele oferece esse bloco de cache em resposta requisio de leitura e faz com queo acesso memria seja abortado. A complexidade extra vem de ter de recuperar o blocode cache da cache de um processador, o que pode levar mais tempo do que recuper-loda memria compartilhada se os processadores estiverem em chips separados. Como ascaches write-back geram requisitos inferiores para a largura de banda da memria, elaspodem admitir maiores quantidades de processadores mais rpidos e tm sido a tcnicaescolhida na maioria dos multiprocessadores, apesar da complexidade adicional da coe-rncia da manuteno. Portanto, examinaremos a implementao da coerncia com ascaches write-back.

    As tags de cache normais podem ser usadas para implementar o processo de verificao,e o bit de validade para cada bloco torna a invalidao fcil de implementar. As faltas deleitura, sejam elas geradas por uma invalidao ou por algum outro evento, tambm sofceis, pois simplesmente contam com a capacidade de verificao. Para as escritas, gos-taramos de saber se quaisquer outras cpias do bloco so colocadas em cache, pois no

    existem outras cpias em cache, e a escrita no precisa ser colocada no barramento emuma cache write-back. No enviar a escrita reduz o tempo gasto pela escrita e a largurade banda exigida.

    Para descobrir se um bloco de cache compartilhado ou no, podemos acrescentar umbit de estado extra associado a cada bloco de cache, assim como temos um bit de validade eum bit de modificao. Ao acrescentar um bit indicando se o bloco compartilhado, pode-mos decidir se uma escrita dever gerar uma invalidao. Quando ocorrer uma escrita emum bloco no estado compartilhado, a cache gera uma invalidao no barramento e marcao bloco como exclusivo. Nenhuma outra invalidao ser enviada por esse processadorpara esse bloco. O processador com a nica cpia de um bloco de cache normalmente chamado deproprietrio do bloco de cache.

    Quando uma invalidao enviada, o estado do bloco de cache do proprietrio al-

    terado de compartilhado para no compartilhado (ou exclusivo). Se outro processadormais tarde solicitar esse bloco de cache, o estado precisa se tornar compartilhado nova-mente. Como nosso cache de verificao tambm v quaisquer perdas, ele sabe quandoo bloco de cache exclusivo foi solicitado por outro processador e o estado deve se tornarcompartilhado.

    Cada transao de barramento precisa verificar as tags de endereo de cache, que po-tencialmente poderiam interferir com os acessos cache do processador. Um modo dereduzir essa interferncia duplicar as tags. A interferncia tambm pode ser reduzidaem uma cache multinvel direcionando as solicitaes de verificao para a cache L2, queo processador usa apenas quando tem uma perda na cache L1. Para que esse esquemafuncione, cada entrada na cache L1 precisa estar presente na cache L2, uma propriedadechamadapropriedade de incluso. Se a verificao receber um acerto na cache L2, ento elaprecisa decidir pela cache L1 para atualizar o estado e possivelmente recuperar os dados,

  • 7/25/2019 Capitulo_5_9

    10/14

    10 Material Complementar ELSEVIER

    o que normalmente exige um stall do processador. s vezes, ele pode ainda ser til paraduplicar as tags da cache secundria de modo a diminuir a disputa entre o processador ea atividade de verificao.

    Exemplo de um protocolo de coerncia de cache

    Um protocolo de coerncia de verificao normalmente implementado incorporandoum controlador de estados finitos em cada n. Esse controlador responde a solicitaes doprocessador e do barramento (ou outro meio de broadcast), alterando o estado do blocode cache selecionado, alm de usar o barramento para acessar dados ou invalid-los. Lo-gicamente, voc pode pensar em um controlador separado sendo associado a cada bloco;ou seja, as operaes de verificao ou solicitaes de cache para diferentes blocos podemprosseguir independentemente. Em implementaes reais, um nico controlador permiteque mltiplas operaes distingam blocos para prosseguir de forma intervalada (ou seja,uma operao pode ser iniciada antes que outra termine, embora somente um acesso cache ou um acesso ao barramento seja permitido de cada vez). Alm disso, lembre-se deque, embora nos refiramos a um barramento na descrio a seguir, qualquer rede de in-

    terconexo que aceita um broadcastpara todos os controladores de coerncia e suas cachesassociadas pode ser usada para implementar a verificao.O protocolo simples que consideramos tem trs estados: invlido, compartilhado e

    modificado. O estado compartilhado indica que o bloco potencialmente compartilhado,enquanto o estado modificado indica que o bloco foi atualizado na cache; observe que oestado modificado implicaque o bloco exclusivo. A Figura 5.9.9 mostra as solicitaesgeradas pelo mdulo de cache de processador em um n (na metade superior da tabela),alm daquelas vindo do barramento (na metade inferior da tabela). Esse protocolo parauma cache write-back, mas pode ser facilmente alterada a fim de trabalhar para uma cachewrite-through reinterpretando o estado modificado como um estado exclusivo e atuali-zando a cache nas escritas pelo modo normal para uma cache write-through. A extensomais comum desenvolvedor protocolo bsico o acrscimo de um estado exclusivo, quedescreve um bloco que no modificado, mas mantido em apenas uma cache; a legenda

    da Figura 5.9.9 descreve esse estado e seu acrscimo com mais detalhes.

    Solicitao OrigemEstado do bloco de

    cache endereado

    Tipo de ao da

    cacheFuno e explicao

    Acerto de leitura processadorcompartilhado ou

    modificadoacerto normal L dados na cache.

    Perda de leitura processador invlido normal missColoca perda de leitura no

    barramento.

    Perda de leitura processador compartilhado substituio

    Resolve perda de conflito:

    coloca perda de leitura no

    barramento.

    Perda de leitura processador modificado substituio

    Resolve perda de conflito:

    bloco write-back, depois

    coloca perda de leitura no

    barramento.Acerto de escrita processador modificado acerto normal Escreve dados na cache.

    Acerto de escrita processador compartilhado coerncia

    Coloca invalidao

    no barramento. Essas

    operaes normalmente so

    chamadas de upgrade ou

    perdas de propriedade,

    pois s alteram o estado.

    Perda de escrita processador invlido normal missColoca perda de escrita no

    barramento.

    Perda de escrita processador compartilhado substituio

    Resolve perda de conflito:

    coloca perda de escrita no

    barramento.

  • 7/25/2019 Capitulo_5_9

    11/14

    5.9 Material avanado: Implementando controladores de cache 11

    Perda de escrita processador modificado substituio

    Resolve perda de conflito:

    bloco write-back, depois

    coloca perda de escrita no

    barramento.

    Perda de leitura bus compartilhado nenhuma aoPermite que a memria

    atenda perda de leitura.

    Perda de leitura bus modificado coerncia

    Tenta compartilhar dados:

    coloca bloco de cache no

    barramento e muda o estado

    para compartilhado.

    Invalidar bus compartilhado coerncia

    Tenta escrever bloco

    compartilhado; invalida o

    bloco.

    Perda de escrita bus compartilhado coerncia

    Tenta escrever bloco que

    compartilhado; invalida o

    bloco de cache.

    Perda de escrita bus modificado coerncia

    Tenta escrever bloco que

    exclusivo em outro lugar:

    faz o write-back do bloco

    de cache e torna seu

    estado invlido.

    FIGURA 5.9.9O mecanismo de coerncia de cache recebe solicitaes do processador e do barramento, e respondea estas com base no tipo de solicitao, sejam acertos ou perdas na cache, e o estado do bloco de cache especificado

    na solicitao. A quarta coluna descreve o tipo de ao de cache como acerto ou falta normal (o mesmo que a cacheuniprocessador veria), substituio (uma perda de substituio de cache uniprocessador) ou coerncia (exigida paramanter a coerncia da cache); uma ao normal ou de substituio pode causar uma ao de coerncia, dependendo doestado do bloco em outras caches. Para perdas de leitura, perdas de escrita ou invalidaes verificadas no barramento,uma ao exigida apenas se os endereos de leitura ou escrita combinarem com um bloco na cache e o bloco for vlido.Alguns protocolos tambm introduzem um estado para designar quando um bloco est exclusivamente em uma cache,mas ainda no foi escrito. Esse estado pode surgir se um acesso de escrita for dividido em duas partes: obtendo o blocoexclusivamente em uma cache e depois atualizando-o subsequentemente; nesse protocolo, esse estado no modifi-cado exclusivo transiente, terminando assim que a escrita completada. Outros protocolos utilizam e mantm umestado exclusivo para um bloco no modificado. Em um protocolo de snooping, esse estado pode ser entrado quandoum processador l um bloco que no residente em qualquer outra cache. Como todos os acessos subsequentes soverificados, possvel manter a preciso desse estado. Em particular, se outro processador emitir uma falta de leitura,o estado alterado de exclusivo para compartilhado. A vantagem de acrescentar esse estado que uma escrita subse-

    quente em um bloco no estado exclusivo pelo mesmo processador no precisa adquirir acesso ao barramento ou geraruma invalidao, pois o bloco conhecido como estando exclusivamente nessa cache; o processador apenas muda oestado para modificado. Esse estado facilmente acrescentado usando o bit que codifica o estado coerente como umestado exclusivo e usando um bit de modificao para indicar que um bloco est modificado. O protocolo MESI, quecorresponde aos quatro estados que ele inclui (modificado, exclusivo, compartilhado shared e invlido), usa essaestrutura. O protocolo MOESI introduz outra extenso: o estado owned (possudo).

    Quando uma invalidao ou uma perda de escrita feita no barramento, quaisquerprocessadores com cpias do bloco de cache a invalida. Para uma cache write-through, osdados para uma perda de escrita sempre podem ser recuperados da memria. Para umaperda de escrita em uma cache write-back, se o bloco for exclusivo em apenas uma cache,essa cache tambm escreve o bloco de volta; caso contrrio, os dados podem ser lidos damemria.

    A Figura 5.9.10 mostra um diagrama de transio de estados finitos para um nico blo-co de cache usando um protocolo de invalidao de escrita e uma cache write-back. Parasimplificar, os trs estados do protocolo so duplicados de modo a representar transiescom base nas solicitaes do processador ( esquerda, que corresponde metade superiorda tabela na Figura 5.9.9), ao contrrio das transies com base nas solicitaes do bar-ramento ( direita, que corresponde metade inferior da tabela na Figura 5.9.9). O textoem negrito usado para distinguir as aes do barramento, ao contrrio das condiesem que uma transio de estado depende. O estado em cada n representa o estado dobloco de cache selecionado, especificado pela solicitao do processador ou do barramento.

  • 7/25/2019 Capitulo_5_9

    12/14

    12 Material Complementar ELSEVIER

    FIGURA 5.9.10Um protocolo de invalidao de escrita, coerncia de cache, para uma cache write-back, mostrando os estados e transies de estado para

    cada bloco na cache.Os estados da cache so mostrados em crculos, com qualquer acesso permitido pelo processador sem uma transio de estado mostradaentre parnteses sob o nome do estado. O estmulo causando uma mudana de estado aparece nos arcos de transio no tipo regular, e quaisquer aes do bar-ramento geradas como parte da transio de estado aparecem no arco de transio em negrito. As aes de estmulo se aplicam a um bloco na cache, e no a umendereo especfico na cache. Logo, uma perda de leitura em um bloco no estado compartilhado uma perda para esse bloco de cache, mas para um endereodiferente. O lado esquerdo do diagrama mostra transies de estado com base em aes do processador associadas a essa cache; o lado direito mostra transiescom base nas operaes sobre o barramento. Uma perda de leitura no estado exclusivo ou compartilhado e uma perda de escrita no estado exclusivo ocorremquando o endereo solicitado pelo processador no corresponde ao endereo no bloco da cache. Essa uma perda de substituio de cache padro. Uma tentativade escrever um bloco no estado compartilhado gera uma invalidao. Sempre que ocorre uma transao de barramento, todas as caches que contm o bloco de

    cache especificado na transao do barramento tomam a ao ditada pela metade direita do diagrama. O protocolo considera que a memria oferece dados emuma perda de leitura para um bloco que est limpo em todas as caches. Nas implementaes reais, esses dois conjuntos de diagramas de estado so combinados.Na prtica, existem muitas variaes sutis nos protocolos de invalidao, incluindo a introduo do estado no modificado exclusivo, como se um processadorou memria oferece dados em uma perda.

    Todos os estados nesse protocolo de cache seriam necessrios em uma cache unipro-cessador, em que corresponderiam aos estados invlido, vlido (e limpo) e modificado. Amaior parte das mudanas de estado indicadas pelos arcos na metade esquerda da Figura5.9.10 seria necessria em um cache de uniprocessador write-back, exceto pela invalidaoem um acerto de escrita em um bloco compartilhado. As mudanas de estado representadaspelos arcos na metade direita da Figura 5.9.10 so necessrias apenas por coerncia, e noapareceriam de forma alguma no controlador de cache de um uniprocessador.

    Para entender por que esse protocolo funciona, observe que qualquer bloco de cache

    vlido est no estado compartilhado em uma ou mais caches ou no estado exclusivo emexatamente uma cache. Qualquer transio para o estado exclusivo (que exigido paraum processador escrever no bloco) requer que uma invalidao ou perda de escrita sejacolocada no barramento, fazendo com que todas as caches tornem o bloco invlido. Almdisso, se alguma outra cache tivesse o bloco no estado exclusivo, ela geraria um write-back,que fornece o bloco contendo o endereo desejado. Finalmente, se uma perda de leituraocorrer no barramento de um bloco no estado exclusivo, a cache com a cpia exclusivamuda seu estado para compartilhado.

    As aes em cinza na Figura 5.9.11, que tratam de perdas de leitura e escrita no barra-mento, so basicamente o componente de verificao do protocolo. Uma outra propriedadeque preservada nesse protocolo, e na maioria dos outros protocolos, que qualquerbloco de memria no estado compartilhado est sempre atualizado na memria, o que

    simplifica a implementao.

  • 7/25/2019 Capitulo_5_9

    13/14

    5.9 Material avanado: Implementando controladores de cache 13

    FIGURA 5.9.11Diagrama de estado de coerncia de cache com as transies de estado induzidas pelo processador

    local mostrado em preto e pelas atividades de barramento mostradas em cinza. Assim como na Figura 5.9.10, asatividades em uma transio aparecem em negrito.

    Como j dissemos, h somente uma mquina de estados finitos por cache, com estmulosvindo do processador conectado ou do barramento. A Figura 5.9.11 mostra como as tran-sies de estado na metade direita da Figura 5.9.10 so combinadas com aquelas na metadeesquerda da figura para formar um nico diagrama de estados para cada bloco de cache.

    Embora nosso protocolo de cache simples esteja correto, ele omite uma srie de compli-caes que tornam a implementao muito mais intricada. A mais importante delas queo protocolo assume que as operaes sejam atmicas ou seja, uma operao pode serfeita de tal maneira que nenhuma operao possa ser intercalada. Por exemplo, o protocolodescrito considera que as perdas de escrita podem ser detectadas, adquirem o barramentoe recebem a resposta como uma nica ao atmica. Na realidade, isso no verdade. Demodo semelhante, se usssemos um switch, como todos os multiprocessadores recentesfazem, ento at mesmo as perdas de leitura tambm seriam atmicas.

    Aes no atmicas introduzem a possibilidade de que o protocolo possa realizardeadlock, significando que ele atinge um estado em que no pode continuar. Em breve,exploraremos como esses protocolos so implementados sem um barramento.

    Construir multiprocessadores de pequena escala (dois a quatro processadores) tornou-semuito fcil. Por exemplo, os processadores Intel Nehalem e o AMD Opteron so projetadospara uso nos multiprocessadores coerentes com cache e possuem uma interface externaque d suporte verificao e permite que dois a quatro processadores sejam conectadosdiretamente. Eles tambm possuem maiores caches no chip, para reduzir a utilizao dobarramento. No caso dos processadores Opteron, o suporte para interconexo de mltiplosprocessadores integrado ao chip processador, assim como as interfaces de memria. Nocaso do projeto da Intel, um sistema de dois processadores pode ser montado apenas com

  • 7/25/2019 Capitulo_5_9

    14/14

    14 Material Complementar ELSEVIER

    alguns chips externos adicionais de modo a interferir com o sistema de memria e E/S.Embora esses projetos no possam ser facilmente escalados para maiores quantidades deprocessadores, eles oferecem uma soluo muito econmica para dois a quatro proces-sadores.

    Implementando coerncia de cache de verifcao

    Como j vimos, a principal complicao na implementao real do protocolo de coernciade verificao que descrevemos que as perdas de escrita e upgrade no so atmicas emqualquer multiprocessador recente. As etapas de detectar uma perda de escrita ou upgra-de, comunicar com os outros processadores e a memria, obter o valor mais recente parauma perda de escrita e garantir que quaisquer invalidaes sejam processadas e atualizara cache no podem ser feitas como se usassem um nico ciclo.

    Em um sistema de barramento nico, essas etapas podem se tornar efetivamente atmi-cas arbitrando o barramento primeiro (antes de mudar o estado da cache) e no liberandoo barramento at que todas as aes sejam concludas. Como o processador pode saberquando todas as invalidaes foram concludas? Na maioria dos multiprocessadores basea-

    dos em barramento, uma nica linha usada para sinalizar quando todas as invalidaesnecessrias foram recebidas e esto sendo processadas. Aps esse sinal, o processador quegerou a perda pode liberar o barramento, sabendo que quaisquer aes exigidas seroconcludas antes de qualquer atividade relacionada prxima perda. Mantendo o barra-mento exclusivamente durante essas etapas, o processador efetivamente torna as etapasindividuais atmicas.

    Em um sistema sem um barramento, temos de encontrar algum outro mtodo detornar as etapas em uma perda atmicas. Em particular, preciso garantir que dois pro-cessadores que tentam escrever o mesmo bloco ao mesmo tempo, uma situao chamadade race, sejam estritamente ordenados: uma escrita processada antes que a prximaseja iniciada. No importa qual das duas escritas em uma race vence a corrida, apenasque haja um nico vencedor, cujas aes de coerncia so completadas primeiro. Em umsistema de verificao, garantir que uma race tenha apenas um vencedor realizado por

    meio do broadcastpara todas as perdas, bem como algumas propriedades bsicas da redede interconexo. Essas propriedades, junto com a capacidade de reiniciar o tratamento deperda do perdedor em uma race, so as chaves para implementar a coerncia de cache deverificao sem um barramento.

    O diabo est nos detalhes.Provrbio clssico