You are on page 1of 11

Princpios de Programao Paralela Utilizando MPI e

Anlise de Algoritmo de Multiplicao de Matrizes Utilizando


o Padro MPI
Franciele Zampieri, Gerson Eduardo Groth, Ronaldo Regis Posser
Departamento de Engenharias e Cincia Da Computao - Universidade Regional
Integrada do Alto Uruguai e das Misses Campus de Erechim
fran.zampy@gmail.com, ge.groth@gmail.com, rrpronaldo@gmail.com
Abstract. In the past few years it has been observed a growing acceptance and
use of parallel implementations on high performance applications, as on those
of general purpose, motivated by the emergence of new architectures that
integrate dozens of fast and low cost processors. With the emergence of the
parallel implementations, the sequential model of algorithms execution is
unable to solve properly the current problems; with this comes the parallel
programing e with it, the message trade librabries such as the MPI. This work
deals with the basic principles of implementations using the MPI, as well as
an analysis of an matrix multiplication algorithm using the standard MPI.
Resumo. Nos ltimos anos tem-se observado uma crescente aceitao e uso
de implementaes paralelas nas aplicaes de alto desempenho como
tambm nas de propsito geral, motivados pelo surgimento de novas
arquiteturas que integram dezenas de processadores rpidos e de baixo custo.
Com o surgimento das implementaes paralelas o modelo seqencial de
execuo de algoritmos passa a no resolver adequadamente os problemas
existentes, com isso surge a programao paralela e com ela as bibliotecas
para troca de mensagens como a MPI. O presente trabalho trata dos
princpios bsicos de implementaes utilizando MPI, bem como, uma anlise
de um algoritmo de multiplicao de matrizes utilizando o padro MPI.
Palavras chaves: paralelizao, troca de mensagem, processo.
1. Introduo
O termo Processamento Paralelo surgiu da necessidade de aumento na velocidade dos
processadores que estava esbarrando no custo e no limite da capacidade tecnolgica
para obteno de circuitos rpidos. A soluo ento tendeu ao emprego de vrios
processadores trabalhando em conjunto na obteno de uma maior capacidade de
processamento.
Mas o problema no termina. O desafio agora explorar uma maior
concorrncia nos algoritmos. Tradicionalmente, os algoritmos so escritos para serem
executados sequencialmente, sendo assim, quando executados em uma mquina paralela
fazem com que mesmo com mais de um ncleo os processadores continuem ociosos,
por suas aplicaes continuarem rodando em apenas um processador.
A soluo ento quebrar um problema em partes independentes de forma que
cada elemento de processamento pode executar sua parte do algoritmo simultaneamente
com outros, um em cada processador. Isto por sua vez gera uma dificuldade na gerncia
da comunicao e sincronizao dos vrios processos envolvidos na computao.
Para que possamos gerenciar a utilizao dessas mquinas em paralelo, alm da
rede de comunicao, necessrio uma camada de software. Para solucionar esse
problema foram criadas bibliotecas especializadas para tratamento da comunicao
entre processos e a sincronizao de processos concorrentes, chamadas bibliotecas para
troca de mensagens.
O padro MPI (Message Passing Interface) uma dessas bibliotecas de troca de
mensagens Tem como objetivo principal o desenvolvimento de aplicaes paralelas e a
reduo do tempo computacional. Buscando no simplesmente otimizar uma simples
medida de acelerao, mas tambm outras medidas como: eficincia e escalabilidade.
No decorrer do presente artigo ser apresentado os princpios para programao
utilizando MPI, bem como uma anlise de um algoritmo de multiplicao de matrizes
utilizando MPI, executando em uma mquina paralela.
2. Message Passing Interface MPI
O MPI um padro de biblioteca de passagem de mensagem para sistemas paralelos, ou
seja, quando temos um aplicativo rodando em vrios processos, em algum instante eles
precisam se comunicar entre si e quem faz essa interface de comunicao exatamente
essa biblioteca.
Esse padro foi desenvolvido procurando fornecer uma base comum de
desenvolvimento de programas paralelos em plataformas distintas. Assim, usando essa
biblioteca voc consegue escrever um programa que rode em vrias mquinas e essas
no precisam ter necessariamente a mesma arquitetura. De acordo com a inteno do
comit de padronizao MPI-Forum, o padro especifica apenas uma interface de
programao e sua concretizao em algumas linguagens de programao, C, C++,
Fortran 77 e Fortran 90. Detalhes de implementao so deixados totalmente por conta
do programador, de forma a flexibilizar o sistema e possibilitar implementaes
eficientes.
Uma aplicao constituda por um ou mais processos que se comunicam,
acionando-se funes para o envio e recebimento de mensagens entre os processos.
Inicialmente, na maioria das implementaes um conjunto fixo de processos criado.
Porm, esses processos podem executar diferentes programas. Por isso, o padro MPI
algumas vezes referido como MPMD (multiple program multiple data).
O usurio no precisa preocupar-se com possveis falhas na comunicao. Da
mesma forma, o MPI permite a escalabilidade permitindo, por exemplo, que uma
aplicao possa criar subgrupos de processos que permitem operaes de comunicao
coletiva para melhorar o alcance dos processos.



2.1 Classificao dos Mtodos de Paralelizao
Antes de mostrarmos melhor como funciona o MPI, suas caractersticas e funes
principais, iremos apresentar os mtodos de classificao de programas paralelos.
Qualquer programa paralelo pode ser classificado de acordo com os seguintes critrios:
1. Localizao dos dados e do programa executvel;
2. Diviso de trabalho;
3. Espera de mensagens.
2.1.1 Localizao dos dados e do Programa executvel
Quanto localizao dos dados um programa MPI pode ser classificado em:
SPMD (Single Program, Multiple Data): Cada processo roda exatamente o mesmo
programa (embora algumas partes do programa sejam executadas somente pelo
processo mestre), mas com um conjunto diferente de dados. Dessa forma, os dados so
divididos pelo processo mestre e distribudos entre os processos escravos, ou seja, cada
processo receber informaes diferentes;
SPSD (Single Programa, Single Data): Todos os processos executam somente um
programa, utilizando-se dos mesmos dados que os demais.
MPSD (Multiple Program, Single Data): Cada processo executa um diferente
programa, porm usando os mesmos dados. Os dados so passados de um processo para
o outro em cada iterao. o caso usado no processamento de udio, onde o conjunto
de dados passam por filtros distintos, sendo que cada filtro est rodando em um
processo diferente;
MPMD (Multiple Program, Multiple Data): Um nico processo (mestre) distribui as
tarefas entre os processos escravos. Os processos escravos executam diferentes
programas, mas tambm podem executar o mesmo programa. Cada processo escravo
executa sua tarefa independentemente, e s se comunica com o processo mestre quando
chegar ao final de sua tarefa. Cada processo escravo opera sobre dados diferentes.
2.1.2 Diviso de trabalho
Segundo os critrios de diviso de trabalho, os programas MPI podem ser classificados
em SPMD-real e SPMD-ME:
SPMD-real: Neste modelo, o mestre controla toda a execuo do programa, alm de
coordenar o envio de mensagens dele para os escravos e o recebimento de mensagens
enviadas dos escravos para ele. O mestre tambm recebe sua parte de dados e realiza os
clculos, assim como os processos escravos.
SPMD-ME (mestre-escravo): Neste modelo, o mestre apenas controla a execuo do
programa, enquanto que os escravos realizam toda a parte pesada dos clculos.
Em geral, o primeiro modelo leva uma certa vantagem, pois h um processador a
mais para realizar os clculos, enquanto que no modelo mestre-escravo, o mestre pode
ficar muito tempo ocioso, esperando pelas mensagens dos processos escravos.

2.1.3 Espera de Mensagens
Quanto espera por mensagens, um programa MPI pode ser classificado em bloqueante
ou no-bloqueante.
Bloqueante (blocking): O processo que receber a mensagem fica esperando
at que a mensagem chegue. S ento emite um sinal de ok, desbloqueando o
processo, para que execute suas tarefas;
No-Bloqueante (non-blocking): O processo no precisa ficar aguardando um
sinal de recebimento do processo ao qual a mensagem foi enviada. O processo apenas
envia a mensagem, sem preocupar-se se ela foi ou no entregue ao destinatrio.
2.2 O Modelo de Programao do MPI
O modelo de programao paralela MPI, uma coleo de processos que executa um
programa escrito em uma linguagem seqencial padro contendo chamadas para uma
biblioteca de funes que envia e recebe mensagens. Neste modelo, um grupo de
processos tem acesso suas memrias locais. A informao enviada da memria local
de um processo memria local do processo remoto usando formatos de mensagem
pr-definida. A comunicao dos processos est baseada no envio e recebimento de
mensagens. Dados transferidos entre processos necessitam da cooperao dos
processos, de forma que, cada envio de mensagem deveria ter um recebimento de
mensagem correspondente. O modelo computacional de passagem de mensagem no
inclui sintaxe de linguagens nem biblioteca e completamente independente do
hardware.
O MPI utilizado para solucionar vrios problemas que necessitam de
processamento mais rpido, como problemas de modelagem e simulao,
processamento de imagens, manipulao de imensa base de dados. No modelo de
programao MPI, uma computao inclui um ou mais processos que se comunicam
chamando rotinas de biblioteca para enviar e receber mensagens a outros processos. Na
maioria das implementaes de MPI, um conjunto fixo de processos criado para
iniciar o programa, e um processo criado por processador. Porm, estes processos,
podem executar programas diferentes.
Elementos importantes em implementaes paralelas so a comunicao de
dados entre processos paralelos e o balanceamento da carga. Dado o fato do nmero de
processos no MPI ser normalmente fixo, os processos podem usar mecanismos de
comunicao ponto a ponto, operaes para enviar mensagens de um determinado
processo a outro. Um grupo de processos pode invocar operaes coletivas de
comunicao para executar operaes globais. O MPI capaz de suportar comunicao
assncrona e programao modular, atravs de mecanismos de comunicadores que
permitem ao usurio MPI definir mdulos que encapsulem estruturas de comunicao
interna.
Os algoritmos que criam um processo para cada processador podem ser
implementados diretamente, utilizando-se comunicao ponto a ponto ou coletivas. Os
algoritmos que implementam a criao de tarefas dinmicas ou que garantem a
execuo concorrente de muitas tarefas, num nico processador, precisam de um
refinamento nas implementaes com o MPI.
2.3 MPI Princpios Bsicos
MPI no uma linguagem de programao, mas uma biblioteca padro que usada para
enviar mensagens entre vrios processos. Estes processos podem ser localizados no
mesmo sistema (uma mquina multi-core) ou sobre um conjunto de mquinas
distribudas, cada uma com sua memria privada, como clusters.
A grande desvantagem do MPI a complexidade e dificuldade de se
implementar cdigos utilizando-se dessa biblioteca. Em MPI, todo paralelismo
explcito, ou seja, o programador responsvel por identificar o paralelismo, dividindo
as tarefas entre os processos, sincronizando os processos, caso necessrio.
Embora o MPI seja um sistema complexo, segue trs princpios bsicos:
inicializao do ambiente para comunicao, comunicao de dados entre processadores
e, quando a comunicao for terminada, finalizao do sistema de troca de mensagens.
Alm de ter um amplo conjunto de funes possvel escrever vrios programas
utilizando apenas seis dessas funes, que servem basicamente para: iniciar, terminar,
executar e identificar processos, enviar e receber mensagens.
Todos os procedimentos acima, exceto os dois primeiros, possuem um
manipulador de comunicao como argumento. Esse manipulador identifica o grupo de
processos e o contexto das operaes que sero executadas. Os comunicadores
proporcionam o mecanismo para identificar um subconjunto de processos, durante o
desenvolvimento de programas modulares, assegurando que as mensagens, planejadas
para diferentes propsitos, no sejam confundidas.
As funes MPI_INIT e MPI_FINALIZE so usadas, respectivamente, para
iniciar e finalizar uma execuo MPI. A MPI_INIT deve ser a primeira funo a ser
chamada, pois ela quem estabelece o ambiente necessrio para executar MPI, sendo
tambm responsvel pela sincronizao de todos os processos de inicializao. J a
funo MPI_FINALIZE simplesmente utilizada para finalizar um processo MPI.
A funo MPI_COMM_SIZE determina o nmero de processos da execuo
corrente e a MPI_COMM_RANK usada para identificar os processos, usando um
nmero inteiro. Os processos pertencentes a um grupo so identificados com um
nmero inteiro precedido de um zero.
A funo MPI_SEND utilizada basicamente para o envio de mensagens e a
MPI_RECV para o recebimento das mensagens. Em MPI_RECV pode-se especificar a
origem (source), ou seja, pode-se permitir o recebimento de mensagens vindas de um
nico processo especfico, ou de qualquer processo. Esta segunda opo permite receber
dados que tenham qualquer origem, porm, a primeira opo prefervel porque as
mensagens chegam na ordem de tempo em que foram enviadas.
As mensagens enviadas ou recebidas pelas funes MPI_Send e MPI_Recv
respectivamente, so compostas por duas partes: o dado, o qual deseja-se enviar ou
receber, e o envelope com informaes da rota dos dados. A mensagem tambm poder
conter uma varivel inteira de retorno contendo o status da rotina.
O dado possui trs parmetros: o endereo onde se localiza o dado ou, no caso
de vetores e matrizes, o endereo inicial do vetor/matriz; o nmero de elementos que
esse dado possui; e o tipo de dado, dentre eles, MPI_CHAR (caracter), MPI_INT
(inteiro) e MPI_DOUBLE (ponto flutuante).
O envelope, assim como o dado, possui trs argumentos: identificao do
processo que envia ou do processo que recebe a mensagem (rank); o rtulo (tag) da
mensagem; e o comunicador (MPI communicator) que identifica o grupo de processos e
o contexto de comunicao.
Analisa-se ento que, antes dos aspectos mais complexos do MPI, que a
programao de troca de mensagens no especifica, ou seja, a chegada das mensagens
enviadas por dois processos A e B ao processo C no definida. Isto , o MPI no
garante que uma mensagem, enviada de um processo A e de um processo B, chegue na
ordem em que foram enviadas. A responsabilidade do recebimento das mensagens na
ordem de envio depende do programador especificar na execuo, quando for
solicitado.
2.4 MPI Operaes Globais
O MPI fornece uma serie de funes especializadas de comunicao que executam
operaes, como por exemplo: todos os processos podem precisar transpor uma matriz
distribuda ou somar um conjunto de nmeros distribudos em cada um dos processos.
Necessitando freqentemente de algoritmos paralelos com operaes coordenadas que
envolvam mltiplos processos. Essas operaes podem ser implementadas por um
programador, utilizando-se das funes de recebimento e envio de funes. Segue
algumas funes que podem ser utilizadas nessas situaes:
A funo MPI_BARRIER( ) utilizada para que haja um sincronismo na
execuo de processos de grupo. Faz com que nenhum processo realize qualquer
instruo, at que todos os processos tenham passado por essa barreira. Essa uma
maneira simples de assegurar que as mensagens geradas no se misturem separando-as
em duas etapas de execuo. Por exemplo, a funo MPI_BARRIER pode ser inserida,
antes de uma segunda operao de envio, para garantir um determinismo na execuo.
evidente, nesse exemplo e em outros, que a necessidade de barreiras explcitas pode ser
evitada pelo uso de tag, de origem e/ou contextos especficos.
A funo MPI_BCAST( ) utilizada para implementar um processo que realize
a disperso de dados do tipo um para todos, no qual um nico processo origem envia
um dado para todos os outros processos e cada processo recebe esse dado.
A funo MPI_GATHER( ) realiza o processo inverso da MPI_BCAST( ), ela
implementa um processo de juno dos dados de todos os processos em um nico
processo. Todos os processos, incluindo a origem, enviam dados localizados na origem.
Esse processo coloca os dados em locais contguos e no opostos, com dados do
processo n, precedendo os dados do processo n+1.
A funo MPI_SCATTER( ) implementa uma operao de disperso de um
conjunto de dados para todos os processos, isto , o reverso da MPI_GATHER. Note a
pequena diferena entre essa funo e a MPI_BCAST: enquanto na MPI_BCAST, todo
processo recebe o mesmo valor do processo de origem, no MPI_SCATTER, todo
processo recebe um valor diferente.
A MPI tambm fornece operaes de reduo. As funes MPI_REDUCE( ) e
MPI_ALLREDUCE( ) implementam operaes de reduo. Eles combinam valores
fornecidos no buffer de entrada de cada processo, usando operaes especificas, e
retorna o valor combinado, ou para o buffer de sada de um nico processo da origem
(MPI_REDUCE) ou para os buffers de sada de todos os processos
(MPI_ALLREDUCE). Essas operaes incluem o mximo, o mnimo (MPI_MAX,
MPI_MIN), soma, produto (MPI_SUM, MPIPROD) e as operaes lgicas.
Existem muitas outras funes MPI, que no foram descritas neste texto que
objetiva dar os princpios bsicos de uma implementao. Algumas caractersticas no
cobertas so: a possibilidade de comunicao assncrona, quando um clculo acessa
elementos de uma estrutura de dados compartilhados em um modo no estruturado; a
composio modular usada quando so implementados programas grandes de sistemas
complexos onde mdulos so implementados independentemente; o uso de ferramentas
que ajudam a melhorar o desempenho dos algoritmos, investigando o ambiente dentro
do qual esto sendo executados; o uso de diferentes tipos de dados, usados, por
exemplo, para fazer a converso entre diferentes representaes de dados em ambientes
heterogneos.
Tambm importante assinalar as diferenas do MPI para o MPI-2, dada pela
incorporao de gerenciamento dinmico de processos e na manipulao de Threads, o
que sempre foi um problema para as bibliotecas de troca de mensagens. No MPI-2 tem-
se a possibilidade de restringir o acesso comunicao de algumas Threads, como por
exemplo, apenas uma Thread (a principal) pode executar as funes do MPI.
3. Compilao e Execuo
Basicamente h quatro passos principais para compilar e executar um programa usando
funes MPI:
1) Utilizar compiladores que reconheam os procedimentos MPI automaticamente,
ou adicionar manualmente as bibliotecas MPI no momento de compilao;
2) Verificar quais e quantos so os ns disponveis;
3) Fixar parmetros para o ambiente paralelo como, por exemplo, escolher os ns a
serem usados na execuo da aplicao;
4) Executar o programa.
De forma geral, os comandos para compilar e executar, respectivamente, um
programa MPI so: mpicc nomedoprograma.c -o nomedoprograma , onde
nomedoprograma.c o nome do programa em MPI mais a extenso referente
linguagem de programao usada (nesse caso C), e nomedoprograma o nome que ser
dado ao arquivo executvel. Para executar deve ser digitado na linha de comando:
mpirun -np 4 nomedoprograma , onde 4 refere-se ao nmero de processos criados, e
nomedoprograma representa o arquivo executvel.
4. Implementao Algoritmo de Multiplicao de Matrizes
Numa multiplicao de matrizes, quando a ordem da matriz bastante elevada, sua
execuo sequencial acaba tornando-se lenta. Uma alternativa para esse problema a
computao paralela, dividindo a matriz em vrios processos, cada processo sendo
executado em uma mquina distinta ou, at mesmo, em mquinas multi-core.
Existem vrias solues possveis para resolver o problema da multiplicao de
matrizes. Uma dessas solues seria dividir a primeira matriz em colunas e enviar
coluna a coluna para os processos escravos. Outra forma seria dividir a primeira matriz
por linhas e ento envi-las para os processos escravos.
A soluo utilizada, nesse caso, uma pequena variao da segunda. O processo
mestre divide igualmente o nmero de linhas para cada processo escravo. Caso sobrem
linhas (resto da diviso de linhas por processos escravos) elas sero enviadas uma a uma
para os primeiros processos escravos.
Os processos escravos, por sua vez, efetuam a multiplicao de cada posio que
lhes foram enviadas, retornando ao processo mestre as linhas calculadas juntamente
com a soma parcial dos elementos calculados por ele.
Por fim, o processo mestre calcula, a partir da soma parcial enviada pelos
processos escravos, a soma total da matriz resultante. Concluindo a execuo, o
processo mestre mostra a matriz resultante e, logo aps, exibe a soma total da matriz.
A implementao do algoritmo de multiplicao de matrizes quadradas foi
escrito em C, usando as funes MPI_Send e MPI_Recev para envio e recebimento de
mensagens.
Os testes foram realizados no Sistema Operacional Ubuntu verso 8.04, usando a
interface OpenMPI, sobre a verso MPI-2. A mquina possui as seguintes principais
configuraes:
Processador Intel(R) Core(TM)2 Duo CPU E4500 2.20GHz
Memria 2.0 GB
Abaixo seguem as tabelas com os resultados obtidos:
Tabela 1. Resultados dos testes do algoritmo sequencial
ORDEM TEMPO
100X100 0.01s
200X200 0.08s
300X300 0.26s
400X400 0.82s
500X500 2.08s







Tabela 2. Tempo e SpeedUp's obtidos com o uso da biblioteca MPI
Nmero de Processos
2 3 4
Ordem
das
Matrizes
Tempo SpeedUp Tempo SpeedUp Tempo SpeedUp
100X100 0.03s 0.333 0.05s 0.2 0.06s 0.166
200X200 0.11s 0.727 0.11s 0.727 0.11s 0.727
300X300 0.30s 0.866 0.27s 0.962 0.22s 1.181
400X400 0.83s 0.987 0.60s 1.366 0.47s 1.744
500X500 1.98s 1.05 1.45s 1.434 0.99s 2.101
O fato de alguns testes no resultarem SpeedUp superior a 1, ou seja, no
obterem ganho de desempenho com o uso do algoritmo paralelo deve-se, inicialmente,
ao fato das matrizes serem relativamente pequenas, tornando o tempo gasto com a
preparao e posterior execuo em paralelo maior que o tempo de execuo do
algoritmo sequencial.
Nota-se que, quanto maior for a ordem da matriz, maior ser o desempenho de
programas paralelos em relao a programas sequenciais. Porm, estes testes foram
realizados em uma mquina multi-core. Sem dvida de que, com matrizes com ordem
elevada, mquinas paralelas, como clusters, teriam um desempenho muito maior em
relao a uma mquina multi-core.
Analisando os resultados, percebe-se que,o programa rodando com 4 processos
j supera o desempenho do programa sequencial a partir da matriz de Ordem 300X300.
Enquanto que o programa rodando com apenas 2 processos s supera a execuo
sequencial a partir da matriz de Ordem 500X500. Isso deve-se ao fato de que um dos
ncleos do processador (ocupado pelo processo mestre) fica ocioso por muito tempo, j
que todo clculo pesado realizado pelo segundo ncleo (ocupado pelo processo
escravo).
Conclui-se, com os testes realizados, que a execuo paralela com MPI obtm
um desempenho muito maior que a execuo sequencial com matrizes de ordem mdia
a alta (ordem 500X500, o speedUp usando 4 processos j superior a 2). Portanto, seria
um desperdcio de tempo fazer programas em MPI para realizar clculos simples.
5. Concluso
Conclui-se, com esse artigo, que os programas cada vez mais necessitam explorar o
paralelismo, devido ao crescimento e a popularizao de mquinas multi-core e de
clusters. A biblioteca MPI tem por objetivo facilitar essa tarefa de paralelizao. Ela
torna-se a responsvel por fazer a comunicao entre os processos. Essa comunicao
ocorre por troca de mensagens, ou seja, por qualquer conjunto de bits enviados de um
computador para outro. Porm, a MPI exige bastante do programador, pois ele quem
tem que identificar o paralelismo, dividir as tarefas entre os processos, sincronizando-os
quando necessrio.
A fim de comprovar de que importante, hoje em dia, escrever aplicaes que
explorem o paralelismo, foram realizados testes entre dois programas, um sequencial e
outro usando MPI, para multiplicao de matrizes. Aps realizados os testes, foi
comprovado que, para matrizes pequenas, com ordem abaixo de 200X200, no
compensa o uso de MPI. Porm, com matrizes acima disso, a execuo paralela passou
a ser muito mais rpida que a sequencial.
Diante disso, verifica-se que a implementao de algoritmos utilizando
programao paralela no tarefa trivial, pois exige conhecimento avanado do
programador em relao sincronizao e comunicao dos processos criados.
Portanto, a programao paralela utilizando padro MPI, torna-se indicada para
algoritmos de grande complexidade, com elevado nmero de clculos, nos quais ser
alcanado um desempenho considervel das aplicaes paralelas em relao ao modelo
sequencial.
Referncias
da Costa, C. M., Stringhini, D., Cavalheiro, G. G. H. (2002). Programao concorrente:
Threads, MPI e PVM. 2a Escola Regional de Alto Desempenho ERAD 2002, 1:3165.

Silla, Paulo Roberto. (2008). Anlise de Um Algoritmo de Multiplicao de Matrizes
em Verso Paralela Utilizando MPI e PVM. Disponvel em:
http://www.protem.dc.uel.br/protem/drupal-5.12/files/Paulo.pdf. Acesso em:
25/04/2009.

Ignacio, Anbal Alberto Vilcapona, Ferreira Filho, Virglio Jos Martins. (2002). MPI:
uma ferramenta para implementao paralela. Vol.22, n.1, pp. 105-116. ISSN 0101-
7438.

Trevisan, Julio. (2005). Programao Paralela Utilizando MPI Aspectos Prticos.
Disponvel em http://www.grucad.ufsc.br/julio/doc/mpi.html. Acesso em: 29/05/2009.

Santos, Giovani. (2005). Tutorial sobre MPI. Disponvel em: http://www.ucb.br/prg/
professores/giovanni/disciplinas/2005-2/pc/tutorial_mpi.html. Acesso em: 29/05/2009.

Alvim, Adriana C. F. Bases de Programao MPI. Disponvel em:
http://www.uniriotec.br/~adriana/MPI/MPI.html. Acesso em: 01/06/2009.

de Freitas, Evandro L. Uma comparao entre os modelos de Message Passing MPI e
PVM. Disponvel em: http://www.inf.ufrgs.br/procpar/disc/cmp134/trabs/T2/981/
mpi.html. Acesso em: 30/05/2009

el Saifi, Mohammad M. PMPI: Uma implementao MPI Multi-Plataforma, Multi-
Linguagem. Disponvel em: http://www.teses.usp.br/teses/disponiveis/3/3141/tde-
08122006-154811/. Acesso em: 20/04/2009.