5.1 Analyse forskningsspørsmål
5.1.2 Hvilke drivere og barrierer påvirker prosessen?
O tipo de processamento paralelo utilizado neste trabalho pode ser definido como o uso simultâneo de múltiplos processadores para reduzir o tempo de execução de um programa. Outras formas de paralelismo, como no nível de bits, isto é, na implementação de uma instrução, ou no nível de instrução - múltiplas instruções de máquina sendo executadas simultaneamente - não são relevantes ao problema em estudo.
Essa forma de processamento paralelo requer máquinas com múltiplos processadores e/ou um cluster, sistemas operacionais capazes de suportar e de gerenciar esses processadores e aplicações que explorem essa forma de paralelismo. Existem três tipos de arquiteturas de hardware para esta forma de processamento paralelo [19]:
Arquiteturas de Memória Compartilhada (SMP): máquinas de memória
compartilhada possuem uma memória global acessível a todos os processadores. Cada processador possui alguma memória local e o mesmo sistema operacional controla todos os processadores. Os processadores operam de maneira independente, porém apenas um processador por vez pode escrever em um endereço da memória compartilhada. A principal característica de sistemas de memória compartilhada é que o tempo de acesso à memória é independente do processador, embora isto não elimine a disputa por acessos a memória, mesmo para operações de leitura. A vantagem desta arquitetura é a facilidade no uso e a rapidez na transferência de dados entre processadores. Entretanto o número de processadores é limitado pela complexidade do sistema de acesso simultâneo à memória, resultando em baixa escalabilidade, que é a principal limitação dessa arquitetura.
Arquiteturas de Memória Distribuída (Cluster): máquinas de memória distribuída
não compartilham memória, cada processador possui sua própria memória, invisível a todos os outros processadores. Os processos de uma aplicação paralela utilizam troca de mensagens para obter ou alterar os dados nas memórias dos outros processos. A vantagem dessa arquitetura é sua escalabilidade, maior que em máquinas com memória compartilhada, exatamente por não possuir acesso
simultâneo à memória. Além disso, cada processador acessa sem interferência sua memória local. A principal desvantagem é o elevado custo computacional de comunicação entre os processadores.
Arquiteturas Híbridas (SMP Cluster): trata-se de um conjunto de nós de
processamento, onde cada nó é uma máquina com memória compartilhada. Os processadores do nó compartilham uma memória local comum e cada nó da rede pode compartilhar dados de memória com outro nó da rede através de troca de mensagens, [20].
Atualmente duas ferramentas se tornaram o padrão “de fato” para a implementação de aplicações paralelas nestas arquiteturas:
Message Passing Interface (MPI): é o padrão da indústria para programação em
sistemas de memória distribuída, é baseado no modelo de troca de mensagens, com controle explícito do paralelismo. Os processos só são capazes de ler e escrever em sua respectiva memória local. Os dados são copiados para a memória local usando chamadas de sub-rotinas. A norma de interface de programação de aplicativos – Application Programming Interface (API) - do modelo MPI define um conjunto de funções e procedimentos que implementam o modelo de passagem de mensagens[14].
Características do padrão MPI:
Códigos MPI podem ser executados tanto em arquitetura de memória distribuída como de memória compartilhada.
Implementações genéricas de MPI têm sido portadas para quase todos os sistemas.
Particularmente adaptáveis para paralelismo em cluster. Existe um grande número de bibliotecas MPI otimizadas. Cada processo tem sua própria memória local.
Os dados são copiados através de mensagens entre memórias locais e são enviados e recebidos via chamadas explícita de sub-rotinas.
Open Specifications for Multi-Processing (OpenMP): é um padrão da indústria
combinação de diretivas de compilação, biblioteca de rotinas e variáveis de ambiente, que é utilizada para especificar o paralelismo em máquinas de memória compartilhada. As diretivas são adicionadas ao código para especificar ao compilador a presença de uma região a ser executada em paralelo, juntamente com algumas instruções sobre o modo como a região deve ser paralelizada [95].
Características do padrão OpenMP:
Códigos OpenMP executam em máquinas de memória compartilhada. Bastante portátil.
Utiliza diretrizes que ajudam o compilador a paralelizar o código.
Cada processo vê a mesma memória global, mas tem a sua própria memória local.
Trocas implícitas de mensagens.
Alto nível de abstração (superiores ao MPI).
A eficácia do paralelismo depende de como a computação sequencial é dividida entre os processos que compõe o programa paralelo. Esta divisão é conhecida como partição do problema. As principais formas de distribuir a solução de um problema são: a partição de tarefas e a partição de domínio. Nesta última, os dados do problema são divididos entre os processos.
Na partição de tarefas, as tarefas que compõe a solução do problema são divididas entre os processos. Ou seja, na partição de domínio cada processo executa a mesma computação em parte do conjunto de dados, enquanto na partição de tarefas cada processo executa uma tarefa sobre todos os dados. Um fator importante para a eficácia da paralelização, independente do modo de partição do problemas, é garantir que a carga de trabalho seja bem distribuída entre os processadores. Este fator é denominado balanceamento de carga
Em teoria, um modelo de memória compartilhada, como OpenMP, deveria oferecer uma estratégia mais eficiente de paralelização. Assim, uma combinação dos paradigmas de memória compartilhada e paralelização por passagem de mensagem dentro da mesma aplicação (modo híbrido de programação) pode prestar um serviço mais eficiente do que a estratégia de paralelização apenas por troca de mensagens
[96], [86]. Diversos trabalhos têm sido realizados para avaliar uma utilização destes dois paradigmas, individualmente e em conjunto [97], [96], [98].