Conceptual Foundations
BY POPULATION AGE AND YEAR WHEN EFFECTS OCCUR
Desde o surgimento dos primeiros microprocessadores, no início da década de 1970, até por volta do ano de 2004, a grande maioria dos computadores dispunha de uma única CPU. Durante esse período, aumentavam de forma significativa a cada ano tanto a frequência de operação das CPUs quanto a quantidade de transistores nelas instalados, resultando em incrementos de desempenho computacional em progressão geométrica.
Por limitações físicas, esta sequência evolucionária infelizmente se encerrou. Chegou- se a um ponto em que novos aumentos de frequência fariam com que os processadores operassem em temperaturas excessivamente altas, inutilizando-os. Outra barreira era o con- sumo de energia, que se mostrou proibitivo para frequências muito elevadas. Dessa maneira, a frequência máxima das CPUs modernas estacionou num limite superior praticamente intransponível (SUTTER, 2004).
Para que o desempenho dos computadores continuasse a avançar, seria necessário adotar uma abordagem diferente daquela seguida até então. A solução surgiu na forma dos sistemas paralelos, que exigem que programadores particionem os problemas em
Capítulo 3. Referencial teórico 32
subproblemas menores, passíveis de serem computados de maneira concorrente em diversas linhas de execução simultâneas. Em tais sistemas, vários nós de processamento operando de forma simultânea e coordenada podem oferecer um melhor desempenho, na medida em que a comunicação entre estes nós ocorra de maneira eficiente e que se adicionem novos nós ao sistema.
A partir de 2005, praticamente todos os novos modelos de computadores de mesa e
notebooks passaram a conter múltiplos processadores. Em 2011 essa mudança se consolidou
também entre os smartphones e tablets, e, em 2012, foi descontinuado o último console de videogame equipado com um único processador (SUTTER, 2012). No segmento de processamento de alto desempenho, onde se destacam os softwares de computação científica, a transição já havia ocorrido bem antes, como forma de contornar as limitações dos sistemas monoprocessados (também chamados de “seriais” ou “sequenciais”).
Por causa da impossibilidade de avanço dos computadores com um único processa- dor, e também pelo fato de que diversas categorias de aplicações se beneficiam fortemente da utilização de múltiplos processadores, a computação paralela é um caminho sem volta. Dessa maneira, para extrair o máximo desempenho dos sistemas modernos, é essencial que os profissionais envolvidos com desenvolvimento de software se capacitem nos conceitos e ferramentas de programação utilizados na construção de soluções paralelas. Essa capa- citação vem se mostrando um grande desafio para a indústria da computação, tanto na academia quanto no mercado de trabalho, diante da necessidade de revisar e atualizar um enorme corpo de conhecimentos construídos sobre a premissa de sistemas monoprocessados, bem como as ferramentas derivadas destes conhecimentos.
3.2.1
A Lei de Amdahl
O desenvolvimento de soluções paralelas requer uma visão fundamentalmente diferente daquela empregada em soluções seriais, tendo como aspecto central o conceito da subdivisão de problemas: dado um determinado problema, como subdividi-lo em problemas menores, de tal maneira que estes subproblemas possam ser executados simultaneamente com a melhor eficiência possível? Quando se trata de paralelismo, não há soluções genéricas e definitivas, e cada problema exige sua própria análise.
Comecemos definindo o termo “speedup”, que quantifica o ganho de desempenho entre dois sistemas diferentes que executam a mesma tarefa:
s = t2 t1
, (3.41)
onde:
s = speedup;
t1 = tempo de execução da tarefa no primeiro sistema;
Capítulo 3. Referencial teórico 33
No contexto do paralelismo, o speedup paralelo é o ganho de desempenho de um sistema paralelo quando comparado à sua versão serial:
sp = ts tp , (3.42) onde: sp = speedup paralelo;
ts = tempo de execução da tarefa no sistema serial;
tp = tempo de execução da tarefa no sistema paralelo.
Determinados problemas se beneficiam mais fortemente da paralelização, e portanto apresentam um speedup elevado quando comparados às respectivas versões seriais. Há outros problemas, no entanto, em que o speedup é bastante reduzido, o que indica que a abordagem de paralelismo escolhida é ineficiente (e potencialmente indesejável). O
speedup máximo na paralelização de um problema foi expresso por Amdahl (1967)
conforme segue: S = 1 rs+ rp n , com rs+ rp = 1 , (3.43) onde: S = speedup máximo;
rs = fração estritamente serial do problema (porcentagem variando de 0 a 1, onde 1
significa 100%);
rp = fração paralelizável do problema (porcentagem variando de 0 a 1, onde 1 significa
100%);
n = número de processadores disponíveis.
Quanto mais extensa for a fração do problema que se mostre impossível de paralelizar — ou seja, quanto mais próximo rs estiver do valor 1 —, mais o speedup máximo S tenderá
ao valor 1, o que indica que a paralelização do problema é inviável. Por outro lado, num cenário de paralelismo ideal, rs será igual a 0 e rp será igual a 1, e portanto o speedup
máximo será: S = 1 rs+ rp n = 1 0 + 1 n = n . (3.44)
O speedup máximo expresso por Amdahl é excepcionalmente difícil de obter, por causa de uma variedade de fatores limitantes. Entre tais fatores, pode-se citar o esforço necessário para coordenar os vários processadores do sistema paralelo, o que impede a utilização do conjunto total a plena capacidade. Outro fator a considerar é a afinidade de memória, pois o custo de leitura/gravação dos vários segmentos da memória do sistema
Capítulo 3. Referencial teórico 34
pode não ser homogêneo para todos os processadores disponíveis. Pode-se mencionar ainda o problema do falso compartilhamento, no qual uma operação de gravação executada por um processador num determinado segmento de memória pode invalidar as linhas de cache de outro processador que esteja utilizando aquele mesmo segmento, forçando que este último realize leituras a partir da memória do sistema, e não do cache, com consequente perda de desempenho.
Outro fator a considerar ao trabalhar com paralelismo é a eficiência paralela, dada por: ep = sp n , (3.45) onde: ep = eficiência paralela; sp = speedup paralelo;
n = número de processadores utilizados na obtenção de sp.
Conforme vimos em (3.44), o speedup paralelo máximo é igual a n, e portanto a eficiência paralela máxima será:
ep =
sp
n =
n
n = 1 . (3.46)
Quanto mais próxima a eficiência paralela estiver do valor 1 conforme se aumenta o número de processadores, melhor será a escalabilidade da implementação paralela em questão. O speedup paralelo e a eficiência paralela podem variar tanto em função do número de processadores quanto do tamanho do problema.
35
4 Metodologia
Descrevemos neste capítulo a forma como implementamos o modelo de Costa (1995), com comentários sobre estratégias de otimização e paralelização para o problema. Fazemos a análise da complexidade computacional da simulação em função de seus parâmetros de entrada, tanto em forma serial quanto paralela. Discutimos ainda algumas contribuições ao trabalho original de Costa, com consequências de estabilidade, precisão e desempenho para a implementação exposta no presente trabalho.