Fonte: http://www.icmc.usp.br/~lefraso/parallel.html Mathematics and Computing Sciences Institute Prof. Dr. Leandro Franco de Souza Parallel computing simulation of fluid flow Texto de Luciano J. Senger 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.