SUMÁRIO 1 INTRODUÇÃO
2. ÁLGEBRA LINEAR EM ARQUITETURAS MULTICORE
2.1 Arquiteturas Multicore
O paralelismo, atualmente, está presente em todos os níveis da Computação indo desde o pa- ralelismo de instruções em um pipeline, passando pelos processadores multicore, colocados como solução para o problema de limitação no crescimento do clock, até sistemas distribuídos de larga escala como as grades computacionais. Nos últimos 20 anos, os fabricantes de microprocessadores exploraram altos graus de Instruction Level Parallelism (ILP). Baseando-se nisso, muitas gerações de processadores foram construídas aumentando-se cada vez mais a frequência do clock e com pi- pelines cada vez mais profundos. As aplicações beneficiavam-se naturalmente dessas inovações e, como consequência, para atingir maior desempenho bastava simplesmente delegar aos compiladores a exploração eficiente do ILP.
Porém, devido a vários fatores, em especial às limitações físicas, tornou-se necessário alterar o foco do paralelismo do ILP para o TLP (Thread Level Parallelism). Nesse, o ganho de desempenho é alcançado através da replicação das unidades de execução (cores) ao passo que se mantêm os clocks em uma faixa na qual o consumo de energia e dissipação de calor são menores e, portanto, menos problemáticos [BUT08]. Ao longo dos anos, diversas foram as tentativas de desenvolver compiladores paralelizantes. Entretanto, esses se demonstraram úteis apenas em algumas classes restritas de problemas. Assim, no contexto dos computadores multicore, não é possível fundamentar-se apenas nos compiladores para obter ganhos de desempenho. Faz-se necessário reescrever as aplicações de modo a tirar proveito do paralelismo de granularidade fina.
Embora a obsolescência dos paradigmas tradicionais esteja ocorrendo de maneira bastante rápida, não há, ainda, uma alternativa bem compreendida a qual possa ser utilizada como base única para os desenvolvedores. Diferentemente das premissas adotadas em modelos anteriores, os núcleos de um processador multicore não podem ser considerados independentemente, ou seja, arquiteturas
32
multicore não devem ser vistas como novas SMP (Symmetric Multiprocessor ). Isso porque, tais núcleos compartilham recursos intra-chip (inclusive múltiplos caches e TLB (Translation Lookahead Buffer ), o que não ocorria com os múltiplos processadores independentes [BUT08], [CHA08].
Essa situação tende a ser agravada considerando que se espera, futuramente, ter uma variedade de combinações de componentes, como a mistura de diferentes núcleos, aceleradores de hardware e sistemas de memória diversificados. Os autores de [BUT08], [CHA08], [CHA07a], [CHA07b] apontam alguns fatores como causas desse aumento:
• “Mais transistores e clocks mais lentos”: tal abordagem tende a elevar o número de cores nos processadores e, por consequência, a quantidade de paralelismo requerido. Modelos ba- seados em pipelines profundos e estreitos tendem a perder espaço para os designs baseados em pipelines rasos e amplos. Com isso, para extrair desempenho dos multicores, os pro- gramadores terão de explorar um nível maior de paralelismo, ou seja, explorá-lo em nível de múltiplos threads (thread-level parallelism (TLP)). Serão necessários, para tal, mecanismos mais eficientes de comunicação entre os processadores e de sincronização para melhorar o gerenciamento dos recursos. Dessa forma, a abordagem adotada pelos designs superescalares, na qual a complexidade do paralelismo era mascarada em hardware por uma combinação de paralelismo crescente em nível de instrução (ILP) e pipelines profundos e estreitos, deixa de ser satisfatória. Necessita-se, portanto, que o paralelismo seja explorado em software.
• “Muro de memória mais espesso”: a eficiência na comunicação tende a se tornar cada vez mais essencial. Os pinos que conectam processador e memória principal transformaram-se em um gargalo devido ao crescimento do número de pinos e à queda da largura de banda por pino. Assim, estima-se que a lacuna de desempenho existente entre processador e memória, a qual já é de aproximadamente mil ciclos, cresça em torno de 50% por ano. Adicionalmente, estima-se que o número de cores em um único chip duplicará a cada 18 meses. Uma vez que as limitações de espaço físico inibirão o crescimento dos recursos de cache na mesma proporção, a quantidade de cache por core tende a diminuir cada vez mais. Com isso, pode-se esperar aumento significativo em problemas como largura de banda da memória, latência de memória e fragmentação de cache.
• “Limitações dos processadores commodity devem aumentar a heterogeneidade e complexidade dos sistemas”: sabe-se que, por motivos econômicos, os sistemas petascale serão construídos com processadores commodity of-the-shelf (de prateleira). Infelizmente, as arquiteturas de propósito geral não são capazes de atingir as características requeridas pelas aplicações de pesquisa de ponta. Consequentemente, em adição aos diferentes níveis de multithreading que os sistemas multicore deverão explorar (nível de core, de socket, de placa e nível de memória distribuída), os mesmos deverão, também, incorporar uma diversidade de elementos de processamento para uso específico, tais como GPUs (Graphics Processing Unit), FPGAs (Field Programmable Gate Array ), dentre outros. Tal heterogeneidade incrementará ainda
33
mais complexidade de controle e programação. Uma vez que os designs oferecidos hoje pelos fabricantes já divergem entre si e que configurações de hardware heterogêneas já podem ser facilmente encontradas, não se pode esperar obter uma categoria de arquitetura comum para a qual desenvolver os modelos de programação futuros.
Embora ainda não se tenha claro quais as estratégias futuras que os fabricantes utilizarão para manter o crescimento do número de núcleos, é possível identificar algumas propriedades que os algoritmos deverão apresentar para alcançar níveis mais altos de TLP:
• Granularidade fina: os cores são e, provavelmente, continuarão sendo associados com memó- rias locais relativamente pequenas. Assim, deve-se reorganizar as operações em tarefas que operem sob pequenas porções de dados para reduzir o tráfego no barramento e aumentar a localidade de dados.
• Não sincronismo: uma vez que o grau de TLP cresce e a granularidade diminui, a presença de pontos de sincronização em uma execução paralela afeta seriamente a eficiência de um algoritmo. Deve-se, portanto, evitá-los.