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!
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