Kapittel 2: Mangfoldsbegrepet og avgrensing av koordinatoroppdraget
2.4. Utsatte, marginaliserte og underrepresenterte grupper
A programação paralela caracteriza-se pelo uso de vários recursos computacio- nais para resolver um problema. Esses problemas são divididos em várias partes, em que cada parte vai ser executada em simultâneo por vários processadores. A explora- ção da concorrência é a chave para a programação paralela. Em teoria, utilizar mais recursos para resolver um problema, vai diminuir o seu tempo de execução. Estes re- cursos podem ser um único computador com vários processadores, vários computado- res interligados entre si ou uma combinação dos dois. Tem que se ter cuidado para ga- rantir que a sobrecarga da gestão da concorrência não aumente o tempo de execução do programa. Para além disso, a divisão equilibrada do trabalho pelos vários processa- dores pode por vezes, ser complicada.
Tradicionalmente, grande parte do software desenvolvido utilizava apenas um único processador, onde as instruções são executadas sequencialmente. O crescimento do desempenho dos processadores tem sido impulsionado pelo aumento da densidade de transístores nos circuitos integrados. À medida que o tamanho dos transístores di- minui, o seu tempo de computação diminui, permitindo aumentar a frequência do re- lógio que dita o número de operações por unidade de tempo que o circuito integrado consegue fazer, bem como o seu consumo de energia. No entanto, o aumento da fre- quência do relógio não pode prosseguir porque não é possível dissipar o calor gerado no interior do circuito. Como o número de transístores que se podem colocar continua a aumentar, optou-se por colocar múltiplos processadores num único circuito integra- do [12].
Contudo, adicionar mais processadores não vai aumentar o desempenho de pro- gramas sequenciais, porque tais programas não podem tirar partido da sua existência. Por outro lado, o desenvolvimento de algumas aplicações é mais fácil, se forem cons- truídas como um conjunto de processos cooperantes (e.g. simulações na área da meteo- rologia compostas por diversos módulos). Surge assim a necessidade de existência de ambientes de programação que suportem mecanismos para a gestão de processos, e para a sua comunicação e sincronização. Quando se escreve um programa em que exis- tem vários processos cooperantes, a criação de processos e as operações de comunica- ção e sincronização podem ser realizadas de duas formas:
Explicitamente: O programa contém as instruções que especificam que proces- sos são inicializados e executados de forma paralela. O programador tem con- trolo absoluto sobre a execução paralela.
Implicitamente: O compilador tem a tarefa de adicionar as instruções necessá- rias para o programa executar de forma paralela.
13
Assim, uma dimensão a considerar na paralelização é a divisão do trabalho que tem de ter em atenção a arquitectura subjacente, ou seja, o modelo de programação pode e deve tirar partido do sistema paralelo sobre o qual vai executar. Existem dois tipos principais de sistemas paralelos, de memória partilhada e memória distribuída:
Em sistemas de memória partilhada, os processos podem partilhar o acesso à memória do computador usando-a como forma de comunicação e coordenação entre si. Isto é suportado porque cada processador pode ler e escrever em todas as posições de memória, podendo cada CPU observar todas as alterações efectu- adas pelos processos, tendo no entanto que ter em linha de conta a consistência dos dados. Podemos coordenar os processos fazendo com que cada um examine e actualize posições de memória partilhada e, por exemplo, execute partes dife- rentes do código, de acordo com esses valores num determinado instante.
Em sistemas de memória distribuída, cada processador tem apenas acesso à sua memória privada, obrigando a que a troca de informação seja realizada por troca de mensagens por uma rede de interligação. Isto quer dizer que o programador de aplicações tem de ter à sua disposição mecanismos explícitos para transferir informação entre os espaços de endereçamento de processos que residem em CPUs distintos. O desempenho destes sistemas depende de dois factores:
A taxa de transferência entre CPUs (em bytes / segundo);
A latência de comunicação que é o tempo gasto na comunicação entre dois CPUs mesmo quando a quantidade de informação transferida é muito pequena.
Quando os processos trabalham independentemente uns dos outros, desenvolver programas paralelos não é uma tarefa muito complicada. Tudo se torna mais comple- xo quando os processos necessitam de coordenar o seu trabalho e trocar informação entre si. Nos sistemas de memória partilhada, este factor pode limitar a eficiência da paralelização, devido a latências, limitação da largura de banda e também consistência dos dados (é importante distribuir bem o trabalho entre todos e sincronizar cada um deles antes de começarem a executar a sua parte do trabalho).
Pela lei de Amdahl [13], a fracção de código sequencial nestes programas, ou seja, a parte do código que não pode ser paralelizado (e.g. leitura de dados de um ficheiro), limita a aceleração que se pode atingir utilizando vários CPUs, visto que o tempo de execução nunca vai ser inferior ao tempo de execução da parte intrinsecamente se- quencial do código.
À medida que o poder computacional aumenta, o número de problemas que po- demos considerar resolver também aumenta, devido ao facto de conseguirmos proces-
14
sar estes problemas num mais curto espaço de tempo. Conseguimos assim manipular grandes volumes de dados e desenvolver modelos muito mais detalhados, não estando limitados apenas pelo poder computacional de um único computador. Por exemplo, na área de processamento de imagens, é possível diminuir o tempo de processamento di- vidindo partes da imagem entre os processos a executar em paralelo.