Computação paralela ou processamento paralelo constitui-se na
exploração de eventos computacionais concorrentes, através
de unidades de processamento que cooperam e comunicam-se entre si. O objetivo
principal do processamento paralelo é a busca de um melhor desempenho
para aplicações computacionais que necessitam de uma maior
potência computacional, muitas vezes não alcançada em
arquiteturas sequenciais.
A exploração de eventos concorrentes pode ser realizada em
diferentes níveis. Em um nível mais próximo ao hardware,
o paralelismo pode existir nas unidades funcionais que compõem a UCP
(Unidade Central de Processamento). Nesse nível, a
granulação representa o tamanho da unidade de trabalho destinada
aos processadores, sendo diretamente relacionada ao hardware e medida em
número de instruções.
A forma de execução paralela tem sido empregada com sucesso
em arquiteturas de hardware que possuem múltiplas unidades funcionais
e empregam técnicas de pipeline. A técnica pipeline representa
uma forma de paralelismo temporal, caracterizado quando existe a execução
de eventos sobrepostos no tempo. A tarefa a ser executada é
dividida em subtarefas, cada uma destas sendo executada por um estágio
de hardware especializado, que trabalha de maneira concorrente com os
demais estágios envolvidos na computação.
Outra maneira de obter paralelismo em nível de instruções
de máquina é através da utilização de
ambientes de paralelização automática, onde o compilador é
responsável por, a partir de um programa sequencial, gerar
um programa paralelo.
Em um nível intermediário, o paralelismo pode ser explorado
através de procedimentos ou subrotinas de programas paralelos que
são atribuídos aos elementos de processamento e executados
concorrentemente. Geralmente, o paralelismo através de procedimentos
necessita do suporte explícito de linguagens de programação
paralela.
Embora seja possível aumentar o desempenho no processo computacional
utilizando o paralelismo em níveis de instruções de
máquina e procedimentos, uma solução altamente
empregada é a utilização de granulação
grossa. Nesse nível mais alto, o trabalho a ser realizado é
dividido em tarefas, que são executadas concorrentemente. Seguindo
essa idéia, uma aplicação paralela é um conjunto
de tarefas que interagem entre si para realizar um determinado trabalho.
A computação paralela realizada em sistemas computacionais
distribuídos, ou computação paralela distribuída,
é uma área desafiante. Técnicas e modelos comuns para
construção, partição e mapeamento de programas
paralelos utilizados no passado, muitas vezes possuem sua viabilidade
reduzida em sistemas distribuídos. Características
intrínsecas desses sistemas, como heterogeneidade, fraco acoplamento
dos recursos, presença de aplicações com diferentes
necessidades computacionais e satisfação de usuários
que utilizam interativamente o sistema, criam necessidades adicionais para
o software paralelo.
Na programação sequencial, os recursos são empregados
através de uma linguagem de montagem, ou, de uma maneira mais usual,
através de linguagens de alto nível como C, Pascal ou Fortran.
Essas linguagens permitem o uso de abstrações (por exemplo if,
else, while), que são traduzidas automaticamente em código
executável pelo compilador. A programação paralela
necessita de recursos não disponíveis diretamente nessas
linguagens. Essa necessidade é gerada pela inclusão de novas
fontes de complexidade a programação sequencial. Na
programação paralela, são necessários
mecanismos para definir quais tarefas serão executadas concorrentemente,
mecanismos para a ativação e finalização dessas
tarefas e métodos para coordenar a interação entre elas.
As linguagens concorrentes permitem a criação de programas paralelos
através de construções próprias da linguagem. Um
exemplo dessa categoria é a linguagem Occam, baseada no paradigma CSP,
que permite a criação de aplicações paralelas
com o paralelismo procedural em máquinas com memória
distribuída.
O estudo numérico preciso de escoamentos de fluidos pode se tornar muito caro, principalmente se
forem utilizadas a simulação de grandes Escalas -- LES (do inglês: Large
Eddy Simulation) ou a simulação numérica direta -- DNS (do inglês:
Direct Numerical Simulation). Uma das alternativas para estes estudos é a utilização
de técnicas de paralelização para simulação numérica em
microcomputadores (cluster de PC's). O principal objetivo desta pesquisa é a
paralelização de códigos numéricos permitindo o acesso mais rápido
ao resultados numéricos. Desta forma pode-se acessar mais rapidamente os resultados de
simulações que levariam um tempo computacional muito grande se fossem executados em
um único microprocessador.