Wednesday, September 06, 2006

Programação para dual core (ou multi core) com a LAM MPI

Com a disponibilidade de processadores com múltiplos núcleos
de processamento (multicore), os desenvolvedores de software
precisam saber utilizar ferramentas de desenvolvimento (ou mesmo
desenvolvê-las) para o aproveitamento desse recurso. Uma
possibilidade é utilizar a MPI (message passing interface)
como biblioteca de comunicação. Este artigo traz um
exemplo simples em FORTRAN 77, que calcula o fatorial de 10
utilizando dois processadores. É importante notar que se você
tiver vários computadores em rede (linux, unix...), a MPI pode
ser empregada para usá-los!

O primeiro passo é instalar a LAM-MPI.

Você pode baixar o pacote para o Slackware 10.x aqui.
A instalação é direta, com o comando installpkg
lam-7.0.2-i686-1.tgz
(como
root)
.


Depois, salve o código abaixo num novo arquivo texto chamado mpitest.f


ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc


c  Programa com o minimo necessario 
c na inplementacao de passagem de informacao
c com a MPI
c
c Rodrigo M.S. de Oliveira


program mpitest

include 'mpif.h'
integer myrank, ierr, nnodes, status(MPI_STATUS_SIZE), buffpos
real x,y

call MPI_INIT (ierr)
call MPI_COMM_SIZE (MPI_COMM_WORLD, nnodes, ierr)
call MPI_COMM_RANK (MPI_COMM_WORLD, myrank, ierr)



if(myrank.eq.0)then

x=1.0
do i=1,5
x=x*(i)
enddo

call MPI_SEND(x,1,MPI_REAL,1,99,MPI_COMM_WORLD,ierr)

else
if(myrank.eq.1)then

y=1.0
do i=6,10
y=y*(i)
enddo


call MPI_RECV(x,1,MPI_REAL,0,99,MPI_COMM_WORLD,status,ierr)

write(*,*) '10!=',x*y

endif
endif

call MPI_FINALIZE (ierr)
stop

end program
ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc

Neste código, as funções em azul claro são da biblioteca MPI e devem ser chamadas com
a instrução call. As três primeiras, MPI_INIT, MPI_COMM_SIZE e MPI_COMM_RANK sempre
devem estar no programa após as declarações das variaveis. Aliás, declará-las explicitamente
(sem usar o comando implicit) é uma boa idéia. A variável myrank é utilizada para se
determinar em que processador se está trabalhando (0, 1, 2 ...).
MPI_SEND e MPI_RECV são, como os nomes sugerem, utilizadas para a troca de mensagens.
A sintaxe dessas funções é a seguinte: MPI_SEND (a1,1,a2,a3,a4,MPI_COMM_WORLD,ierr),
na qual a1 é o valor a ser enviado, a2 é o tipo da variavel a1, a3 é o processador de destino e
a4 é o código único que identifica a troca de mensagens (a ser controlado pelo programador),
MPI_RECV
(a5,1,a2,a6,a4,MPI_COMM_WORLD,status,ierr)
, onde a5 é a variavel de destino,
a6 é o processador de onde vem a informação.

O próximo passo é compilar o código. O segunte comando pode ser usado:
hf77 mpitest.f -o mpitest -O

A topologia da máquina paralela deve ser especificada, pois, como dito anteriormente, a MPI
pode operar com outros micros da rede que tenham MPI (dadas as devidas permissões).
Então, um arquivo texto deve ser criado com a lista de máquinas que vão ser usadas para rodar
o programa. Como vamos aqui usar os dois núcleos do processador local, um arquivo texto topologia
deve conter o seguinte:

localhost
localhost

São duas vezes mesmo. Se fossem 4 núcleos, localhost apareceria 4 vezes.

Salvo o arquivo, basta dar o comando

lamboot -v topologia
para montar a topologia.

Agora basta rodar o programa com o comando
mpirun -np 2 mpitest
com o argumento de np sendo o número de processadores empregados.

Para desmontar a topologia. basta dar o comando
wipe -v topologia

Obs: o kernel do sistema deve ser recompilado para suportar múltiplas CPUs (SMP),
de forma que, assim, realmente serão usados os dois núcleos.

É isso aí... em breve a versão em C será publicada.
Abraços!

0 Comments:

Post a Comment

<< Home