Programação Paralela em Arquiteturas Multi-Core/Arquitetura Intel Core e Core 2: diferenças entre revisões

[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
Alymenbr (discussão | contribs)
Linha 101:
=== Intel Smart Memory Access ===
 
Intel Smart Memory Access é o nome de um conjunto de técnicas utilizada para aumentar oa ganhoperformance do sistema de acesso à memória do processador.

A primeira técnica utilizada para aumentar a performance obtido através do pré-carregamento <ref> Também conhecido pelo estrangeirismo ''prefetch'' </ref>de instruções e dados.
 
A microarquitetura possui 6 unidades independentes de pré-carregamento de dados:
- 2 unidades na cache de primeiro nível (L1) do primeiro núcleo
- 2 unidades na cache de primeiro nível (L1) do segundo núcleo
- 2 unidades na cache de segundo nível (L2) compartilhada entre os núcleos
 
A microarquiteturaCore possui também 2 unidades independentes de pré carregamento de instruções:
- 1 unidade na cache de primeiro nível (L1) do primeiro núcleo
- 1 unidade na cache de primeiro nível (L1) do segundo núcleo
 
 
As unidades guarda informações sobre o padrões de acesso das unidades de execução aos dados e padrões de execução do programa. Alguns desses padrões de acesso são:
- Assumir se um desvio condicional <ref>Também conhecido pelo estrangeirismo ''branch''</ref> provavelmente será tomado, baseado na probabilidade da instrução de desvio condicional alterar o fluxo de execução do programa de acordo com o histórico recente dos resultados deste desvio condicional específico. Quando o processador assume que o desvio será tomado, ele encontra o endereço de destino do desvio e começa a executar as instruções do novo local.
 
- Em um loop, os preditores de desvio <ref>Também conhecidos pelo estrangeirismo ''branch predictors''</ref> normalmente assumem que na próxima iteração a execução ocorrerá dentro do loop (a condição para saída do loop é considerada sempre como não verdadeira). Sendo assim, esse preditores de desvio sempre erram a previsão na iteração que sai do loop. A microarquitetura Core introduziu preditores queregistram em qual iteração um loop foi interrompido. Na próxima vez que o mesmo loop for executado, se o número de iterações antes de sair do loop for o mesmo, o preditor irá acertar a previsão da última iteração, prevendo-a como uma saída do loop
 
- Desvios condicionais indiretos (onde o endereço de destino é carregado de um registrador) são intrinsicamente difíceis de pré-carregar, já que a informação sobre o endereço de destino está indisponível durante o processo de predição. Quando os preditores assumem que um desvio condicional indireto será tomado, eles verificam em uma tabela se o desvio condicional indireto já foi tomado anteriormente e qual foi o seu endereço de destino naquela execução. Os preditores utilizam então esse endereço como o provável destino da execução atual.
 
 
 
 
A segunda técnica utilizada é a desambiguação de memória <ref> Também conhecido pelo estrangeirismo ''Memory disambiguation''</ref>. Os processadores modernos utilizam a execução fora de ordem; uma técnica que altera a ordem em que as instruções são realizadas para permitir que um número maior de instruções esteja em execução em um determinado momento.
 
Quando ocorre uma instrução STORE seguida de um LOAD, podem acontecer duas situações:
- O LOAD vai tentar carregar o dado que foi salvo pelo STORE, sendo assim a ordem de execução das instruções não pode ser alterada.
- O LOAD vai carregar um dado diferente do salvo pelo STORE, sendo assim ele pode ser executado antes do STORE
 
O problema é que para diferenciar os dois casos, é necessário saber os endereços de memória onde o STORE está salvando os dados. Este endeço só fica disponível alguns ciclos após o início da execução do STORE. Como consequência, o processador deve aguardar um ciclo após o início da execução do STORE para decidir se o LOAD já pode começar a ser executado (em paralelo com o STORE) ou se o seu início deve ser postergado para depois da finalização da execução do STORE.
 
Estudos<ref>
S. Sethumadhavan, et al. Scalable Hardware Memory Disambiguation for High ILP Processors. In 36th Annual International Symposium on Microarchitecture, 2003.</ref> indicam que em mais de 97% dos casos não existe dependência entre os dados de STORE e LOAD consecutivos. Isso quer dizer que o LOAD poderia até ser executado antes do STORE.
Como resultado, uma instrução ADD após o LOAD-STORE, por exemplo, é executada em 5 ciclos (STORE -> define endereço -> LOAD-> espera load -> ADD), enquanto poderia ter sido executada em 3 ciclos (LOAD -> STORE / espera load -> ADD).
 
Para solucionar o problema, a microarquitetura Core possui algoritmos que determinas com uma grande probabilidade se um par de instruções STORE-LOAD estão operando sobre os mesmos dados, sem a necessidade de aguardar a definição dos endereços de memórias que as instruções estariam acessando.
 
=== Intel Advanced Digital Media Boost ===