Você está na página 1de 117

Centro Nacional de Processamento de Alto Desempenho - SP

INTRODUO AO MPI

CENAPAD-SP

ndice
Introduo a Programao Paralela ................................................................................................. pag.03 1 - Idias e Conceitos ......................................................................................................... pag.03 2 - Comunicao entre Processadores ................................................................................ pag.08 3 - Criao de um Programa Paralelo .................................................................................pag.10 4 - Consideraes de Performance ......................................................................................pag.12 5 - Referncias ....................................................................................................................pag.16 Introduo a "Message-Passing" ..................................................................................................... pag.17 1 - O modelo: "Message-Passing" ...................................................................................... pag.17 2 - Bibliotecas "Message-Passing" ..................................................................................... pag.18 3 - Referncias ....................................................................................................................pag.24 Introduo ao MPI ............................................................................................................................. pag.25 1 - O que MPI ? ................................................................................................................pag.25 2 - Histrico ........................................................................................................................pag.26 3 - Conceitos e Definies ..................................................................................................pag.29 4 - Compilao no Ambiente SGI ........................................................................................pag.36 5 - Execuo ........................................................................................................................pag.37 6 - Rotinas Bsicas ..............................................................................................................pag.38 6.1 - Iniciar um processo MPI ................................................................ ................. pag.39 6.2 - Identificar um processo MPI ............................................................................pag.40 6.3 - Contar processos MPI ......................................................................................pag.41 6.4 - Enviar mensagens no MPI ................................................................................pag.42 6.5 - Receber mensagens no MPI .............................................................................pag.43 6.6 - Finalizar processos no MPI ..............................................................................pag.44 7 - MPI Message .................................................................................................................pag.45 7.1 - Dado .................................................................................................................pag.46 7.2 - Envelope ...........................................................................................................pag.48 8 - Exemplo de um programa bsico MPI .......................................................................... pag.49 9 - Comunicao "Point-to-Point" .................................................. pag.50 9.1 - Modos de Comunicao ...................................................................................pag.51 9.1.1 - "Blocking Synchronous Send" .................................................. pag.53 9.1.2 - "Blocking Ready Send" .............................................................pag.55 9.1.3 - "Blocking Buffered Send" .........................................................pag.57 9.1.4 - "Blocking Standard Send" .........................................................pag.59 9.2 - "Deadlock" ...................................................................................................pag.62 9.3 - Comunicao "Non-blocking" ......................................................................... pag.63 9.4 - Observaes .....................................................................................................pag.68 9.5 - Rotinas auxiliares .............................................................................................pag.69 9.6 - Recomendaes ................................................................................................pag.74 10 - Comunicao Coletiva ................................................................................................pag.75 10.1 - Sincronizao .................................................................................................pag.76 10.2 - "Data Movement" ...........................................................................................pag.77 10.2.1 - "Broadcast" ..............................................................................pag.77 10.2.2 - "Gather" e "Scatter" .................................................................pag.79 10.2.3 - "Allgather" ...............................................................................pag.86 10.2.4 - "All to All" ...............................................................................pag.88 10.2.5 - Rotinas de Computao Global ........................................................... pag.90 11 - Grupos ......................................................................................................................... pg.94 12 - Referncias ..................................................................................................................pag.102 13 - Laboratrios .................................................................................................................pag.103

INTRODUO A PROGRAMAO PARALELA


1 - IDEIAS E CONCEITOS

O que paralelismo ?

uma estratgia para obter resultados mais rpidos, de grandes e complexas tarefas.

O paralelismo efetuado: - Dividindo-se uma tarefa, em vrias pequenas tarefas; - Distribuindo-se as pequenas tarefas por entre vrios processadores, que iro execut-las simultaneamente; - Coordenar esses processadores.

Programao Serial

Tradicionalmente, os programas de um computador so elaborados para serem executados em mquinas seriais:

Somente um processador;

Uma instruo executada por vez;

Tempo de execuo ir depender de quo rpido a informao se "movimenta" pelo hardware.

Necessidade de Processamento mais Rpido Existem vrias classes de problemas que necessitam de processamento mais rpido: Problemas de modelagem e simulao, baseados em sucessivas aproximaes e de clculos cada vez mais precisos. Problemas que dependem de manipulao de imensas bases de dados: Processamento de sinal e imagem; Visualizao de dados; Banco de Dados. Grandes desafios computacionais: Modelagem de Clima; Turbulncia de Fluidos; Disperso de Poluio; Engenharia Gentica; Circulao de Correntes Martimas; Modelagem de Semicondutores; Sistema de Combusto.
5

Computao Paralela Necessidades para se possuir um ambiente de computao paralela: Mltiplos processadores; Memria centralizada ou distribuda; Um ambiente que possibilite criar e manipular um processamento paralelo: - Sistema Operacional; - Modelos de Programao Paralela. Um algoritmo paralelo e um programa paralelo.

Programao Paralela

Necessidades para se programar em paralelo:

Decomposio do algoritmo, ou dos dados, em "pedaos";

Distribuio dos "pedaos" por entre processadores diferentes, que trabalhem simultaneamente;

Coordenao do trabalho e da comunicao entre esses processadores;

2 - COMUNICAO ENTRE PROCESSADORES A maneira como os processadores se comunicam dependente da arquitetura de memria utilizada no ambiente, que por sua vez, ir influenciar na maneira de se escrever um programa paralelo.

Memria Compartilhada Mltiplos processadores operam de maneira independente, mas compartilham os recursos de uma nica memria; Somente um processador por vez pode acessar um endereo na memria compartilhada; A sincronizao necessria no acesso, para leitura e gravao da memria, pelas tarefas paralelas. A "coerncia" do ambiente mantida pelo Sistema Operacional; Vantagens: fcil de usar e a transferncia de dados rpida. Desvantagens: Limita o nmero de processadores (! 64 processadores )

Exemplos: Cray Y-MP, Convex C-2, Cray C-90.


8

Memria Distribuida "#Mltiplos processadores operam independentemente, sendo que, cada um possui sua prpria memria; "#Os dados so compartilhados atravs de uma interface de comunicao (rede ou switch), utilizando-se "Message-Passing"; "#O usurio responsvel pela sincronizao das tarefas; "#Vantagens: No existem limites para nmero de processadores e cada processador acessa, sem interferncia e rapidamente, sua prpria memria; "#Desvantagens: Elevado "overhead" devido a comunicao e o usurio responsvel pelo envio e recebimento dos dados. "#Exemplos: nCUBE, Intel Hypercube, IBM SP, CM-5
9

3 - CRIAO DE UM PROGRAMA PARALELO Decomposio do Programa

Para se decompor um programa em pequenas tarefas que sero executadas em paralelo, necessrio se ter a idia da decomposio funcional e da decomposio de domnio. Decomposio Funcional - O problema decomposto em diferentes tarefas, gerando diversos programas, que sero distribudos por entre mltiplos processadores, para execuo simultnea;

Decomposio de Domnio

- Os dados so decompostos em grupos, que sero distribudos por entre mltiplos processadores que executaro, simultaneamente, um mesmo programa;

10

Comunicao do Programa Em programao paralela, essencial que se compreenda a comunicao que ocorre entre os processadores: "Message-Passing Library" - A programao da comunicao explicita, ou seja, o programador responsvel pela comunicao entre os processos;

"Compiladores Paralelos" ( Data Parallel Compilers ) - O programador no necessita entender dos mtodos de comunicao, que feita pelo compilador

Os mtodos de comunicao para "Message-Passing" e para "Data Parallel", so exatamente os mesmos. Point to Point One to All Broadcast All to All Broadcast Collective Computations

11

4 - CONSIDERAES DE PERFORMANCE Amdahl's Law A lei de Amdahl's determina o potencial de aumento de velocidade a partir da porcentagem de paralelismo de um programa ( f ): speedup = 1 / ( 1 - f ) Num programa, no qual no ocorra paralelismo, f=0, logo, speedup=1 ( No existe aumento na velocidade de processamento ); Num programa, no qual ocorra paralelismo total, f=1, logo, speedup infinito (Teoricamente). Se introduzirmos o nmero de processadores na poro paralela de processamento, a relao passar a ser modelada por: speedup = 1 / [ ( P/N ) + S ] P = Porcentagem paralela; N = Nmero de processadores; S = Porcentagem serial;
12

N 10 100 1000 10000

P = 0,50 1,82 1,98 1,99 1,99

P = 0,90 5,26 9,17 9,91 9,91

P = 0,99 9,17 50,25 90,99 99,02

13

Balanceamento de Carga ("Load Balancing")

- A distribuio das tarefas por entre os processadores, deve ser de uma maneira que o tempo da execuo paralela seja eficiente;

- Se as tarefas no forem distribudas de maneira balanceada, possvel que ocorra a espera pelo trmino do processamento de uma nica tarefa, para dar prosseguimento ao programa.

14

"Granularity"

a razo entre computao e comunicao:

Fine-Grain Tarefas executam um pequeno nmero de instrues entre ciclos de comunicao; Facilita o balanceamento de carga; Baixa computao, alta comunicao; possvel que ocorra mais comunicao do que computao, diminuindo a performance.

Coarse-Grain "# Tarefas executam um grande nmero de instrues entre cada ponto de sincronizao; "# Difcil de se obter um balanceamento de carga eficiente; "# Alta computao, baixa comunicao; "# Possibilita aumentar a performance.
15

5 - REFERNCIAS

1 - SP Parallel Programming Workshop Introduction to Parallel Programming MHPCC - Maui High Performance Computing Center Blaise Barney - 02 Julho 1996

2 - Seminrio: Overview of Parallel Processinng Kevin Morooney e Jeff Nucciarone - 17 Outubro 1995

16

INTRODUO A "MESSAGE-PASSING"

1 - O MODELO: "MESSAGE-PASSING" O modelo "Massage-Passing" um dos vrios modelos computacionais para conceituao de operaes de programa. O modelo "Message-Passing" definido como:

Conjunto de processos que possuem acesso memria local;

Comunicao dos processos baseados no envio e recebimento de mensagens;

A transferncia de dados entre processos requer operaes de cooperao entre cada processo (uma operao de envio deve "casar" com uma operao de recebimento).

17

2 - BIBLIOTECAS "MESSAGE-PASSING"

O conjunto operaes de comunicao, formam a base que permite a implementao de uma biblioteca de "Message-Passing":

Domnio pblico - PICL, PVM, PARMACS, P4, MPICH, etc; Privativas - MPL, NX, CMMD, MPI, etc;

Existem componentes comuns a todas as bibliotecas de "Message-Passing", que incluem:

Rotinas de gerncia de processos (iniciar, finalizar, determinar o nmero de processos, identificar processos ); Rotinas de comunicao "Point-to-Point" (Enviar e receber mensagens entre dois processos ); Rotinas de comunicao de grupos ("broadcast", sincronizar processos).
18

Terminologia de Comunicao Buffering Cpia temporria de mensagens entre endereos de memria efetuada pelo sistema como parte de seu protocolo de transmisso. A cpia ocorre entre o "buffer" do usurio (definido pelo processo) e o "buffer" do sistema (definido pela biblioteca); Uma rotina de comunicao "blocking", quando a finalizao da execuo da rotina, dependente de certos "eventos" (espera por determinada ao, antes de liberar a continuao do processamento);

Blocking

Non-blocking Uma rotina de comunicao "non-blocking", quando a finalizao da execuo da rotina, no depende de certos "eventos" (no h espera, o processo continua sendo executado normalmente); Sncrono Comunicao na qual o processo que envia a mensagem, no retorna a execuo normal, enquanto no haja um sinal do recebimento da mensagem pelo destinatrio; Comunicao na qual o processo que envia a mensagem, no espera que haja um sinal de recebimento da mensagem pelo destinatrio.

Assncrono

19

Comunicao "Point-to-Point" Os componentes bsicos de qualquer biblioteca de "Message-Passing" so as rotinas de comunicao "Point-to-Point" (transferncia de dados entre dois processos).

Bloking Send

Finaliza, quando o "buffer" de envio est pronto para ser reutilizado;

Receive Finaliza, quando o "buffer" de recebimento est pronto para ser reutilizado;

Nonblocking

Retorna imediatamente, aps envio ou recebimento de uma mensagem.

20

Comunicao Coletiva

As rotinas de comunicao coletivas so voltadas para coordenar grupos de processos.

Existem, basicamente, trs tipos de rotinas de comunicao coletiva:

Sincronizao Envio de dados: Broadcast, Scatter/Gather, All to All Computao Coletiva: Min, Max, Add, Multiply, etc

21

"Overhead"

Existem duas fontes de "overhead" em bibliotecas de "message-passing":

"System Overhead"

o trabalho efetuado pelo sistema para transferir um dado para seu processo de destino;

Ex.: Cpia de dados do "buffer" para a rede.

"Syncronization Overhead" o tempo gasto na espera de que um evento ocorra em um outro processo;

Ex.: Espera, pelo processo origem, do sinal de OK pelo processo destino.

22

Passos para se obter performance

Iniciar pelo programa serial otimizado;

Controlar o processo de "Granularity" (Aumentar o nmero de computao em relao a comunicao entre processos);

Utilize rotinas com comunicao non-blocking;

Evite utilizar rotinas de sincronizao de processos;

Evite, se possvel, "buffering";

Evite transferncia de grande quantidade de dados;

23

3 - REFERNCIAS Os dados apresentados nesta segunda parte foram obtidos dos seguintes documentos:

1 - SP Parallel Programming Workshop Message Passing Overview MHPCC - Maui High Performance Computing Center Blaise Barney - 03 Julho 1996

2 - MPI: The Complete Reference The MIT Press - Cambridge, Massachusetts Marc Snir, Steve Otto, Steven Huss-Lederman, David Walker Jack Dongarra

24

INTRODUO AO MPI
1 - O QUE MPI ? Message Passing Interface Uma biblioteca de "Massage-Passing", desenvolvida para ser padro em ambientes de memria distribuda, em "Message-Passing" e em computao paralela. "Message-Passing" portvel para qualquer arquitetura, tem aproximadamente 125 funes para programao e ferramentas para se analisar a performance. Utilizado por programas em C e FORTRAN. A plataforma alvo para o MPI, so os ambientes de memria distribuda, mquinas paralelas massivas, "clusters" de estaes de trabalho. Todo paralelismo explcito: o programador responsvel em identificar o paralelismo e implementar um algoritmo utilizando construes com o MPI.

25

2 - HISTRICO

Fins da dcada de 80

Memria distribuda, o desenvolvimento da computao paralela, ferramentas para desenvolver programas em ambientes paralelos, problemas com portabilidade, performance, funcionalidade e preo, determinaram a necessidade de se desenvolver um padro.

Abril de 1992

Workshop de padres de "Message-Passing" em ambientes de memria distribuda (Centro de Pesquisa em Computao Paralela, Williamsburg, Virginia); Discusso das necessidades bsicas e essenciais para se estabelecer um padro Message-Passing"; Criado um grupo de trabalho para dar continuidade ao processo de padronizao.
26

Novembro de 1992 Reunio em Minneapolis do grupo de trabalho e apresentao de um primeiro esboo de interface "Message-Passing" (MPI1). O Grupo adota procedimentos para a criao de um MPI Forum; MPIF consiste eventualmente de aproximadamente 175 pessoas de 40 organizaes, incluindo fabricantes de computadores, empresas de softwares, universidades e cientistas de aplicao. Novembro de 1993 Conferncia de Supercomputao 93 - Apresentao do esboo do padro MPI. Maio de 1994 Disponibilizao, como domnio pblico, da verso padro do MPI (MPI1 http://www.mcs.anl.gov/Projects/mpi/standard.html Dezembro de 1995 Conferncia de Supercomputao 95 - Reunio para discusso do MPI2 e suas extenses.
27

Implementaes de MPI

MPI-F: IBM Research MPICH: ANL/MSU - Domnio Publico UNIFY: Mississipi State University CHIMP: Edinburgh Parallel Computing Center LAM: Ohio Supercomputer Center

28

3 - CONCEITOS E DEFINIES Rank Todo processo tem uma nica identificao, atribuda pelo sistema quando o processo iniciado. Essa identificao continua e comea no zero at n-1 processos.

29

Group Grupo um conjunto ordenado de N processos. Todo e qualquer grupo associado a um "communicator" e, inicialmente, todos os processos so membros de um grupo com um "communicator" j pr-estabelecido (MPI_COMM_WORLD). Communicator O "communicator" define uma coleo de processos (grupo), que podero se comunicar entre si (contexto). O MPI utiliza essa combinao de grupo e contexto para garantir uma comunicao segura e evitar problemas no envio de mensagens entre os processos. possvel que uma aplicao de usurio utilize uma biblioteca de rotinas, que por sua vez, utilize "message-passing". Essa rotina pode usar uma mensagem idntica a mensagem do usurio. As rotinas do MPI exigem que seja especificado um "communicator" como argumento. MPI_COMM_WORLD o comunicador pr-definido que inclui todos os processos definidos pelo usurio, numa aplicao MPI.

30

AO DESEJADA

31

POSSVEL AO INDESEJADA

32

Aplication Buffer um endereo normal de memria (Ex: varivel) aonde se armazena um dado que o processo necessita enviar ou receber. System Buffer um endereo de memria reservado pelo sistema para armazenar mensagens. Dependendo do tipo de operao de send/receive, o dado no "aplication buffer" pode necessitar ser copiado de/para o "system buffer" ("Send Buffer" e "Receive Buffer"). Neste caso teremos comunicao assncrona. Blocking Comunication Uma rotina de comunicao dita "bloking", se a finalizao da chamada depender de certos eventos. Ex: Numa rotina de envio, o dado tem que ter sido enviado com sucesso, ou, ter sido salvo no "system buffer", indicando que o endereo do "aplication buffer" pode ser reutilizado. Numa rotina de recebimento, o dado tem que ser armazenado no "system buffer", indicando que o dado pode ser utilizado.
33

Non-Blocking Communication Uma rotina de comunicao dita "Non-blocking" , se a chamada retorna sem esperar qualquer evento que indique o fim ou o sucesso da rotina. Ex: No espera pela cpia de mensagens do "aplication buffer" para o "system buffer", ou a indicao do recebimento de uma mensagem.

OBS: da responsabilidade do programador, a certeza de que o "aplication buffer" esteja disponvel para ser reutilizado. Este tipo de comunicao utilizado para melhorar a relao entre computao e comunicao para efeitos de ganho de performance.

Standard Send Operao bsica de envio de mensagens usada para transmitir dados de um processo para outro. Synchronous Send Bloqueia at que ocorra um "receive" correspondente no processo de destino.
34

Buffered Send O programador cria um "buffer" para o dado antes dele ser enviado. Necessidade de se garantir um espao disponvel para um "buffer", na incerteza do espao do "System Buffer". Ready Send Tipo de "send" que pode ser usado se o programador tiver certeza de que exista um "receive" correspondente, j ativo. Standard Receive Operao bsica de recebimento de mensagens usado para aceitar os dados enviados por qualquer outro processo. Pode ser "blocking" e "non-blocking".

Return Code Valor inteiro retornado pelo sistema para indicar a finalizao da sub-rotina.

35

4 COMPILAO NO AMBIENTE SGI DO CENAPAD

A implementao do linkedio: FORTRAN 90

MPI definiu num nico comando, as tarefas de compilao e

ifort <fonte> -o <executvel> -lmpi C Standard

icc <fonte> -o <executvel> -lmpi C++ icpc <fonte> -o <executvel> -lmpi

OBS: possvel utilizar todas as opes de compilao dos compiladores C e FORTRAN.


36

5 EXECUO

mpirun -np <nmero de processos> <arquivo executvel>

A execuo de um programa, com rotinas MPI, no ambiente SGI/INTEL, feita atravs de um programa que configura e estabele o ambiente paralelo, ou seja, o mpirun.

37

6 - ROTINAS BSICAS Para um grande nmero de aplicaes, um conjunto de apenas 6 subrotinas MPI sero suficientes para desenvolver uma aplicao no MPI.

Arquivo de defaults

Necessrio para todos os programas ou rotinas que efetuam chamadas para a biblioteca MPI. Normalmente colocado no incio do programa.

#include mpi.h

FORTRAN

include mpif.h

38

6.1 - Inicializar um processo MPI MPI_INIT - Primeira rotina MPI utilizada. - Define e inicia o ambiente necessrio para executar o MPI. - Sincroniza todos os processos no inicio de uma aplicao MPI. C
int MPI_Init ( *argc, *argv)

FORTRAN argc argv mpierr

call MPI_INIT (mpierr)

Apontador para um parmetro da funo main; Apontador para um parmetro da funo main; Varivel inteira de retorno com o status da rotina. mpierr=0, Sucesso mpierr<0, Erro

39

6.2 - Identificar processo do MPI

MPI_COMM_RANK - Identifica o processo, dentro de um grupo de processos. - Valor inteiro, entre 0 e n-1 processos. C
int MPI_Comm_rank (comm, *rank)

FORTRAN

call MPI_COMM_RANK (comm, rank, mpierr)

comm rank mpierr

MPI communicator. Varivel inteira de retorno com o nmero de identificao do processo. Varivel inteira de retorno com o status da rotina.

40

6.3 - Contar processos no MPI MPI_COMM_SIZE - Retorna o nmero de processos dentro de um grupo de processos.

int MPI_Comm_size (comm, *size)

FORTRAN

call MPI_COMM_SIZE (comm, size, mpierr)

comm size mpierr

MPI Communicator. Varivel inteira de retorno com o nmero de processos iniciados durante uma aplicao MPI. Varivel inteira de retorno com o status da rotina

41

6.4 - Enviar menssagens no MPI MPI_SEND - "Blocking send". - A rotina s retorna aps o dado ter sido enviado. - Aps retorno, libera o "system buffer" e permite acesso ao "aplication buffer".
C FORTRAN int MPI_Send ( *sndbuf, count, datatype, dest, tag, comm) call MPI_SEND (sndbuf, count, datatype, dest, tag, comm, mpierr)

sndbuf count datatype dest tag comm mpierr

Endereo inicial do dado que ser enviado. Endereo do "aplication buffer". Nmero de elementos a serem enviados. Tipo do dado. Identificao do processo destino. Rtulo da mensagem. MPI communicator. Varivel inteira de retorno com o status da rotina.

42

6.5 - Receber mensagens no MPI MPI_RECV - "Blocking receive". - A rotina retorna aps o dado ter sido recebido e armazenado. - Aps retorno, libera o "system buffer".
C FORTRAN int MPI_Recv(*recvbuf, count, datatype, source, tag, comm.,*status) call MPI_RECV (recvbuf, count, datatype, source, tag, comm, status, mpierr)

recvbuf count datatype source tag comm status mpierr

Varivel indicando o endereo do "aplication buffer". Nmero de elementos a serem recebidos. Tipo do dado. Identificao da fonte. OBS: MPI_ANY_SOURCE Rtulo da mensagem. OBS: MPI_ANY_TAG MPI communicator. Vetor com informaes de source e tag. Varivel inteira de retorno com o status da rotina.

43

6.6 - Finalizar processos no MPI

MPI_FINALIZE

- Finaliza o processo para o MPI. - ltima rotina MPI a ser executada por uma aplicao MPI. - Sincroniza todos os processos na finalizao de uma aplicao MPI.

int MPI_Finalize()

FORTRAN

call MPI_FINALIZE (mpierr)

mpierr

Varivel inteira de retorno com o status da rotina.

44

7 - MPI Message

A passagem de mensagens entre processadores o mtodo de comunicao bsica num sistema de memria distribuda. No que consiste essas mensagens ?

Como se descreve uma mensagem do MPI ? Sempre, uma "MPI Message" contm duas partes: dado, na qual se deseja enviar ou receber, e o envelope com informaes da rota dos dados.

Mensagem=dado(3 parmetros) + envelope(3 parmetros)

Ex.:

call MPI_SEND(sndbuf, count, datatype, dest, tag, comm, DADO ENVELOPE

mpierr)

45

7.1 - DADO O dado representado por trs argumentos: 1- Endereo onde o dado se localiza; 2- Nmero de elementos do dado na mensagem; 3- Tipo do dado; Tipos Bsicos de Dados para C
MPI_CHAR MPI_SHORT MPI_INT MPI_LONG MPI_UNSIGNED_CHAR MPI_UNSIGNED_SHORT MPI_UNSIGNED MPI_UNSIGNED_LONG MPI_FLOAT MPI_DOUBLE MPI_LONG_DOUBLE MPI_BYTE MPI_PACKED
46

signed char signed short int signed int signed long int unsigned char unsigned short int unsigned int unsigned long int Float Double long double

Tipos Bsicos de Dados no FORTRAN


MPI_INTEGER MPI_REAL MPI_DOUBLE_PRECISION MPI_COMPLEX MPI_LOGICAL MPI_CHARACTER MPI_BYTE MPI_PACKED INTEGER REAL DOUBLE PRECISION COMPLEX LOGICAL CHARACTER(1)

47

7.2 - ENVELOPE

Determina como direcionar a mensagem:

Identificao do processo que envia ou do processo que recebe; Rtulo ("tag") da mensagem; "Communicator".

48

8 - Exemplo de um Programa Bsico MPI


program hello include 'mpif.h' integer me, nt, mpierr, tag, status(MPI_STATUS_SIZE) character(12) message call MPI_INIT(mpierr) call MPI_COMM_SIZE(MPI_COMM_WORLD, nt, mpierr) call MPI_COMM_RANK(MPI_COMM_WORLD, me, mpierr) tag = 100 if(me .eq. 0) then message = 'Hello, world' do i=1, nt-1 call MPI_SEND(message, 12, MPI_CHARACTER, i, tag, MPI_COMM_WORLD, mpierr) enddo else call MPI_RECV(message, 12, MPI_CHARACTER, 0, tag, MPI_COMM_WORLD, status, mpierr) endif print*, 'node', me, ':', message call MPI_FINALIZE(mpierr) end

49

9 - COMUNICAO "POINT-TO-POINT" "# Numa comunicao "Point-to-Point", um processo envia uma mensagem e um segundo processo a recebe. "# Existem vrias opes de programao utilizando-se comunicao "Point-to-Point", que determinam como o sistema ir trabalhar a mensagem. "# Opes que incluem, quatro modos de comunicao: synchronous, ready, buffered, e standard, e dois modos de processamento: "blocking" e "non-blocking". "# Existem quatro rotinas "blocking send" e quatro rotinas "non-blocking send", correspondentes aos quatro modos de comunicao. "# A rotina de "receive" no especifica o modo de comunicao. Simplesmente, ou a rotina "blocking" ou, "non-blocking".

50

9.1 - Modos de Comunicao

"Blocking Receive"

Existem quatro tipos de "blocking send", uma para cada modo de comunicao, mas apenas um "blocking receive" para receber os dados de qualquer "blocking send".

C FORTRAN

int MPI_Recv(*buf, count, datatype, source, tag, comm, status)

call MPI_RECV(buf, count, datatype, source, tag, comm, status, ierror)

51

Parmetros Comuns das Rotinas de Send e Receive buf Endereo do dado a ser enviado, normalmente o nome da varivel, do vetor ou da matriz; Varivel inteira que representa o nmero de elementos a serem enviados; Tipo do dado; Varivel inteira que identifica o processo de origem da mensagem, no contexto do "communicator"; Varivel inteira que identifica o processo destino, no contexto do "communicator"; Varivel inteira com o rtulo da mensagem; "Communicator" utilizado; Vetor com informaes sobre a mensagem; Cdigo de retorno com o status da rotina.
52

count datatype source

dest

tag comm status ierror

9.1.1 - "Blocking Synchronous Send"

C FORTRAN

int MPI_Ssend(*buf, count, datatype, dest, tag, comm) call MPI_SSEND(buf, count, datatype, dest, tag, comm, ierror)

Quando um MPI_Ssend executado, o processo que envia avisa ao processo que recebe que uma mensagem est pronta e esperando por um sinal de OK, para que ento, seja transferido o dado.

OBS: "System overhead" ocorre devido a cpia da mensagem do "send buffer" para a rede e da rede para o "receive buffer". "Synchronization overhead" ocorre devido ao tempo de espera de um dos processos pelo sinal de OK de outro processo. Neste modo, o "Synchronization overhead", pode ser significante.
53

Blocking Synchronous Send e Blocking Receive

54

9.1.2 - "Blocking Ready Send"

C FORTRAN

int MPI_Rsend(*buf, count, datatype, dest, tag, comm) call MPI_RSEND(buf, count, datatype, dest, tag, comm, ierror)

Quando um MPI_Rsend executado a mensagem enviada imediatamente para a rede. exigido que um sinal de OK do processo que ir receber, j tenha sido feito.

OBS: Este modo tenta minimizar o "System overhead" e o "Synchronization overhead" por parte do processo que envia. A nica espera ocorre durante a cpia do "send buffer" para a rede. O processo que recebe pode incorrer num significativo "Synchronization overhead". Depende de quo cedo executada a rotina.

Ateno, este modo somente dever ser utilizado se o programador tiver certeza que uma MPI_Recv, ser executado antes de um MPI_Rsend.
55

Blocking Ready Send e Blocking Receive

56

9.1.3 - "Blocking Buffered Send" C FORTRAN


int MPI_Bsend(*buf, count, datatype, dest, tag, comm) call MPI_BSEND(buf, count, datatype, dest, tag, comm, ierror)

Quando um MPI_Bsend executado a mensagem copiada do endereo de memria ("Aplication buffer") para um "buffer" definido pelo usurio, e ento, retorna a execuo normal do programa. aguardado um sinal de OK do processo que ir receber, para descarregar o "buffer". OBS: Ocorre "System overhead" devido a cpia da mensagem do "Aplication buffer" para o "buffer" definido pelo usurio. O "Synchronization overhead", no existe no processo que envia, mas significativo no processo que recebe, caso seja executado o "receive" antes de um "send". Ateno, neste modo, o usurio responsvel pela definio de um "buffer", de acordo com o tamanho dos dados que sero enviados. Utilizar as rotinas: MPI_Buffer_attach MPI_Buffer_detach
57

Blocking Buffered Send e Blocking Rceive

58

9.1.4 - "Blocking Standard Send" C FORTRAN


int MPI_Send(*buf, count, datatype, dest, tag, comm) call MPI_SEND(buf, count, datatype, dest, tag, comm, ierror)

Para este modo, ser necessrio analisar o tamanho da mensagem que ser transmitida, que varia de acordo com o nmero de processos iniciados. O "Default" um "buffer" de 4Kbytes. Message <= 4K Quando MPI_Send executado, a mensagem imediatamente transmitida para rede, e ento, para um "System buffer" do processo que ir receber a mensagem. OBS: O "Synchronization overhead" reduzido ao preo de se aumentar o "System overhead" devido as cpias extras que podem ocorrer, para o buffer. Message > 4K Quando MPI_Send executado a mensagem transmitida essencialmente igual ao modo "Synchronous".
59

Blocking Standard Send e Blocking Receive Message <= 4K

60

Blocking Standard Send e Blocking Receive Message > 4K

61

9.2 - "Deadlock" Fenmeno comum quando se utiliza "blocking communication". Acontece quando todos os processos esto aguardando por eventos que ainda no foram iniciados.

Arrume sua aplicao, de maneira que, exista casamento entre um Send e um Recv; Utilize "non-blocking communication".
62

9.3 - Comunicao "Non-blocking" Em uma comunicao "blocking", a execuo do programa suspensa at o "system buffer" estar pronto para uso. Quando se executa um "blocking send", significa que o dado tem que ter sido enviado do "system buffer" para a rede, liberando o "buffer" para ser novamente utilizado. Em uma comunicao "non-blocking", a execuo do programa continua imediatamente aps ter sido iniciado a comunicao. O programador no tem idia se a mensagem j foi enviada ou recebida. Em uma comunicao "non-blocking", necessrio bloquear a continuao da execuo do programa, ou averiguar o status do "system buffer", antes de reutiliz-lo. MPI_Wait MPI_Test Todas as sub-rotinas "non-blocking", possuem o prefixo MPI_Ixxxx, e mais um parmetro para identificar o status.

63

9.3.1 - Non-Blocking Synchronous Send C FORTRAN


int MPI_Issend(*buf, count, datatype, dest, tag, comm, *request) call MPI_ISSEND(buf, count, datatype, dest, tag, comm, request, ierror)

9.3.2 - Non-Blocking Ready Send C FORTRAN


int MPI_Irsend(*buf, count, datatype, dest, tag, comm,*request) call MPI_IRSEND(buf, count, datatype, dest, tag, comm, request, ierror)

9.3.3 - Non-Blocking Buffered Send C FORTRAN


int MPI_Ibsend(*buf, count, datatype, dest, tag, comm, *request) call MPI_IBSEND(buf, count, datatype, dest, tag, comm, request, ierror)

64

9.3.4 - Non-Blocking Standard Send C FORTRAN


int MPI_Isend(*buf, count, datatype, dest, tag, comm, *request) call MPI_ISEND(buf, count, datatype, dest, tag, comm, request, ierror)

9.3.5 - Non-Blocking Receive C FORTRAN


int MPI_Irecv(*buf, count, datatype, source, tag, comm, *request) call MPI_IRECV(buf, count, datatype, source, tag, comm, request, ierror)

65

Non-Blocking Standard Send e Non-Blocking Receive Message <= 4K

66

Non-Blocking Standard Send e Non-Blocking Receive Message > 4K

67

9.4 - Observaes

O modo "Synchronous" o mais seguro e ao mesmo tempo, o mais portvel (Qualquer tamanho de mensagens, em qualquer arquitetura, em qualquer ordem de execuo de "send" e "receive"). O modo "Ready" possui o menor ndice total de "overhead", no entanto, a execuo de um "receive" deve preceder a execuo de um "send". O modo "Buffered" elimina o "Synchronization overhead" e permite controle no tamanho do "buffer". O modo "Standard" a implementao bsica do MPI. As rotinas "Non-blocking" possuem a vantagem de continuar a execuo de um programa, mesmo se a mensagem ainda no tiver sido enviada. Elimina o "deadlock" e reduz o "system overhead". As rotinas "Non-blocking" necessitam de maior controle, que pode ser feito por rotinas auxiliares.

68

9.5 - Rotinas Auxiliares 9.5.1 - MPI_Buffer_attach C FORTRAN


int MPI_Buffer_attach (*buf, size) call MPI_BUFFER_ATTACH (buf, size, ierror )

buf size ierror

Varivel que identifica o endereo do "buffer"; Varivel inteira que determina o tamanho do "buffer" (em nmero de bytes); Varivel inteira com status da execuo da rotina.

Define para o MPI, um "buffer" de tamanho especfico, para ser utilizado no envio de mensagens. S utilizado no modo de "Blocking" ou "Non-blocking" do "Buffered Send".

OBS: Somente um "buffer" poder ser iniciado por processo, durante a execuo da aplicao.
69

9.5.2 - MPI_Buffer_detach

C FORTRAN

int MPI_Buffer_detach (*buffer, *size ) call MPI_BUFFER_DETACH (buf, size, ierror)

buf size ierror

Varivel que identifica o endereo do "buffer"; Varivel inteira que determina o tamanho do "buffer" (em nmero de bytes); Varivel inteira com status da execuo da rotina.

Elimina o "buffer" que foi iniciado anteriormente para o MPI. Esta operao bloqueia a execuo do programa at todas as mensagens terem sido transmitidas.

70

9.5.3 - MPI_Wait

C FORTRAN

int MPI_Wait (*request, *status) call MPI_WAIT (request, status, ierror)

request

Varivel inteira transparente que questiona o processo de determinadas aes. Parmetro fornecido pelas rotinas "non-blocking send" ; Vetor com informaes da mensagem; Varivel inteira com o status da execuo da rotina.

status ierror

Esta rotina bloqueia a execuo do programa at que seja completada a ao identificada pela varivel request ( null, inactive, active ).

71

9.5.4 - MPI_Test

C FORTRAN

int MPI_Test( *request, *flag, *status ) call MPI_TEST( request, flag, status, ierror )

request

Varivel inteira transparente que questiona o processo. Parmetro fornecido pelas rotinas "non-blocking send" ; Varivel lgica que identifica o valor de request. MPI_REQUEST_NULL determina flag=true e MPI_REQUEST_ACTIVE determina flag=false; Vetor com informaes da mensagem; Varivel inteira com o status da execuo da rotina.

flag

status ierror

Essa rotina apenas informa se uma operao "non-blocking send" foi concluda ou no.

72

9.5.5 - MPI_Type_size

C FORTRAN

int MPI_Type_size( datatype,*size) call MPI_TYPE_SIZE( datatype, size, ierror)

datatype Tipo do dado;

size

Varivel inteira com o tamanho, em bytes, para o tipo do dado;

ierror

Varivel inteira com o status da execuo da rotina.

Esta rotina retorna com o tamanho, em bytes, reservado para um tipo de dado.

73

9.6 Recomendaes

Em geral, razovel iniciar uma programao MPI utilizando-se de rotinas "blocking Standard Send" e "blocking Receive", por serem a implementao bsica do MPI; As rotinas blocking" so necessrias quando se necessita sincronizar processos. mais eficiente utilizar rotinas "blocking", quando se utiliza uma rotina "nonblocking" seguida de uma rotina "MPI_Wait". Se for necessrio trabalhar com rotinas "blocking", pode ser vantajoso iniciar com o modo "synchronous", para depois passar para o modo "standard"; Um prximo passo seria analisar o cdigo e avaliar a performance. Se "non-blocking receives" forem executados bem antes de seus correspondentes "sends", pode ser vantajoso utilizar o modo "ready"; Se existir um elevado "synchronization overhead" durante a tarefa de envio das mensagens, especialmente com grandes mensagens, o modo "buffered" pode ser mais eficiente.
74

10 - COMUNICAO COLETIVA

Comunicao coletiva envolve todos os processos em um grupo de processos. O objetivo deste tipo de comunicao o de manipular um pedao comum de informao. As rotinas de comunicao coletiva foram montadas utilizando-se as rotinas de comunicao "point-to-point" As rotinas de comunicao coletivas esto divididas em trs categorias: "synchronization", "data movement" e "global computation". Envolve comunicao coordenada entre processos de um grupo, identificados por um "communicator"; Todas as rotinas efetuam "block", at serem localmente finalizadas; No necessrio rotular as mensagens (tags).

75

10.1 Sincronizao BARRIER C FORTRAN


int MPI_Barrier ( comm )

call MPI_BARRIER (comm, ierr)

comm ierr

Inteiro que determina o "communicator"; Inteiro que retorna com o status da execuo da rotina.

Aplicaes paralelas em ambiente de memria distribuda, as vezes, necessrio que ocorra sincronizao implcita ou explicitamente. A rotina MPI_Barrier, sincroniza todos os processos de um grupo ("communicator").Um processo de um grupo que utilize MPI_Barrier, para de executar, at que todos os processos do mesmo grupo tambm executem um MPI_Barrier.

76

10.2 - "Data Movement" BROADCAST C FORTRAN buffer count datatype root comm
int MPI_Bcast(*buffer, count, datatype, root, comm)

call MPI_BCAST (buffer, count, datatype, root, comm, ierr)

Endereo inicial do dado a ser enviado; Inteiro que indica o nmero de elementos no buffer; Constante MPI que identifica o tipo de dado dos elementos no buffer; Inteiro com a identificao do processo que ir efetuar um broadcast; Identificao do communicator.

Rotina que permite a um processo enviar dados, de imediato, para todos os processos de um grupo. Todos os processos do grupo, devero executar um MPI_Bcast, com o mesmo comm e root.
77

78

"Gather" e "Scatter" Se um processo necessita distribuir dados em n segmentos iguais, onde o ensimo segmento enviado para ensimo processo num grupo de n processos, utiliza-se a rotina de SCATTER. Por outro lado, se um nico processo necessita coletar os dados distribudos em n processos de um grupo. Utiliza a rotina de GATHER.

79

SCATTER C FORTRAN
ierr) int MPI_Scatter(*sbuf, scount, stype, *rbuf, rcount, rtype, root, comm) call MPI_SCATTER(sbuf ,scount, stype, rbuf, rcount, rtype, root, comm,

sbuf

Endereo dos dados que sero distribudos("send buffer");

scount Nmero de elementos que sero distribudos para cada processo; stype rbuf Tipo de dado que ser distribudo; Endereo aonde os dados sero coletados ("receive buffer");

rcount Nmero de elementos que sero coletados; rtype root Tipo de dado que ser coletado; Identificao do processo que ir distribuir os dados;

comm Identificao do "communicator".


80

GATHER C FORTRAN sbuf


int MPI_Gather(*sbuf, scount, stype, *rbuf, rcount, rtype, root, comm) call MPI_GATHER(sbuf, scount, stype, rbuf, rcount, rtype, root, comm, ierr)

Endereo inicial dos dados que sero distribudos ("send buffer");

scount Nmero de elementos que sero distribudos para cada processo; stype rbuf Tipo de dado que ser distribudo; Endereo aonde os dados sero coletados ("receive buffer");

rcount Nmero de elementos que sero coletados; rtype root Tipo de dado coletado; Identificao do processo que ira coletar os dados;

comm Identificao do "communicator".

81

Exemplo 1 DIMENSION A(25,100), b(100), cpart(25), ctotal(100) INTEGER root DATA root/0/ DO I=1,25 cpart(I)=0. DO K=1,100 cpart(I) = cpart(I) + A(I,K)*b(K) END DO END DO call MPI_GATHER(cpart,25,MPI_REAL,ctotal,25,MPI_REAL,root, MPI_COMM_WORLD,ierr)

82

A: Matriz distribuda por linhas; b: Vetor compartilhado por todos os processos; c: Vetor atualizado por cada processo, independentemente.

83

Exemplo 2

real a(100), rbuf(MAX) . . . . . . . . . call mpi_gather(a,100,MPI_REAL,rbuf,100,MPI_REAL,root, comm, ierr)

84

Exemplo 3

real sbuf(MAX), rbuf(100) . . . . . . . . . call mpi_scatter(sbuf,100,MPI_REAL,rbuf,100,MPI_REAL, root,comm,ierr)

85

ALLGATHER C FORTRAN sbuf


int MPI_Allgather( *sbuf, scount, stype, *rbuf, rcount, rtype, comm) call MPI_ALLGATHER( sbuf, scount, stype, rbuf, rcount, rtype, comm, ierr)

Endereo inicial dos dados que sero distribudos ("send buffer");

scount Nmero de elementos que sero distribudos; stype rbuf Tipo de dado que ser distribudo; Endereo aonde o dado ser coletado ("receive buffer");

rcount Nmero de elementos que sero coletados; rtype Tipo de dado coletado;

comm Identificao do "communicator". Essa rotina ao ser executada faz com que todos os processos coletem os dados de cada processo da aplicao. Seria similar a cada processo efetuar um "brodcast".
86

87

ALL TO ALL C FORTRAN sbuf


int MPI_Alltoall( *sbuf, scount, stype, *rbuf, rcount, rtype, comm) call MPI_ALLTOALL( sbuf, scount, stype, rbuf, rcount, rtype, comm, ierr)

Endereo inicial dos dados que sero distribudos ("send buffer");

scount Nmero de elementos que sero distribudos; stype rbuf Tipo de dado que ser distribudo; Endereo aonde o dados sero coletados ("receive buffer");

rcount Nmero de elementos que sero coletados; rtype Tipo de dado coletado;

comm Identificao do "communicator". Esta rotina ao ser executada faz com que cada processo envie seus dados para todos os outros processos da aplicao. Seria similar a cada processo efetuar um "scatter".
88

89

10.3 - Rotinas de Computao Global

Uma das aes mais teis em operaes coletivas so as operaes globais de reduo ou combinao de operaes. O resultado parcial de um processo, em um grupo, combinado e retornado para um especfico processo utilizando-se algum tipo de funo de operao.

Tabela com Funes Pr-definidas de Operaes de Reduo

FUNO MPI_MAX MPI_MIN MPI_SUM MPI_PROD

RESULTADO valor mximo valor mnimo somatrio produto

C integer,float integer,float integer,float integer,float

FORTRAN integer,real,complex integer,real,complex integer,real,complex integer,real,complex

90

REDUCE C
int MPI_Reduce( *sbuf, *rbuf, count, stype, op, root, comm)

FORTRAN

call MPI_REDUCE(sbuf,rbuf,count,stype,op,root,comm,ierr)

sbuf rbuf

Endereo do dado que far parte de uma operao de reduo ("send buffer"); Endereo da varivel que coletar o resultado da reduo ("receive buffer");

count Nmero de elementos que faro parte da reduo; stype op root Tipo dos dados na operao de reduo; Tipo da operao de reduo; Identificao do processo que ir receber o resultado da operao de reduo;

comm Identificao do "communicator".

91

Exemplo 1

92

Exemplo 2 Simulao Dinmica de Florestas - Cada processo numa simulao dinmica de florestas, calcula o valor mximo de altura de arvore por regio; - O processo principal, que gera o resultado final, necessita saber, a altura mxima global (todas as regies).

INTEGER maxht, globmax . . (clculos que determinam a altura mxima) .


call MPI_REDUCE(maxht, globmax, 1, MPI_INTEGER, MPI_MAX, 0, MPI_COMM_WORLD, ierr)

IF (taskid.eq.0) then . . (Gera relatrio com os resultados) . END IF


93

11-GRUPOS

Grupo um conjunto ordenado de processos. Cada processo num grupo, possui um nico nmero de identificao; O MPI suporta o processamento de grupos, permitindo:
"# "#

Organizar processos em grupos, de acordo com a natureza da aplicao; Permitir operaes de Comunicao Coletiva entre alguns processos;

Um processo pode pertencer a mais de um grupo; Um grupo utiliza um communicator especfico que descreve o universo de comunicao entre os processos; Em MPI, grupo um objeto dinmico que pode ser criado e destrudo durante a execuo de um programa. O MPI possui cerca de 40 rotinas para manipulao e administrao de grupos.

94

GRUPOS e COMMUNICATOR
C0 MPI_COMM_WORLD
G0

G1

C1

C0

G2

C2

95

GROUP C FORTRAN
int MPI_Comm_group(comm , *group )

call MPI_COMM_GROUP (comm,group, ierr)

Determina o grupo associado a um determinado communicator.

comm

Communicator

group

Varivel inteira, transparente, de retorno com a identificao do grupo.

ierr

Status de execuo da rotina.

96

GROUP INCLUDE C FORTRAN


int MPI_Group_incl (group, n, *ranks, *newgroup)

call MPI_GROUP_INCL (group, n, ranks, newgroup, ierr)

Cria um novo grupo a partir de um grupo existente e somente com os processos identificados.

group

Varivel inteira, transparente, que identifica o grupo que j existe.

Nmero de elementos do novo grupo (Tambm indica o tamanho do conjunto de ranks).

ranks

Vetor com a identificao dos processos no grupo existente que sero includos.

newgroup

Varivel inteira, transparente, que ir armazenar a identificao do novo grupo.

ierr

Status de execuo da rotina.


97

GROUP EXCLUDE C FORTRAN


int MPI_Group_excl (group, n, *ranks, *newgroup)

call MPI_GROUP_EXCL (group, n, ranks, newgroup, ierr)

Cria um novo grupo a partir de um grupo existente e somente com os processos identificados.

group

Varivel inteira, transparente, que identifica o grupo que j existe.

Nmero de elementos do novo grupo (Tambm indica o tamanho do conjunto de ranks).

ranks

Vetor com a identificao dos processos no grupo existente que sero excludos

newgroup

Varivel inteira, transparente, que ir armazenar a identificao do novo grupo.

ierr

Status de execuo da rotina.


98

COMMUNICATOR CREATE C FORTRAN


int MPI_Comm_create (comm., group, *newcomm)

call MPI_COMM_CREATE (comm, group, newcomm, ierr)

Cria um novo communicator a partir do communicator existente para o novo grupo.

comm

Communicator no qual pertenciam os processos.

group

Varivel inteira, transparente, que identifica o novo grupo.

newcomm

Varivel inteira, transparente, que ir armazenar a identificao do novo communicator.

ierr

Status de execuo da rotina.


99

GROUP FREE C FORTRAN


int MPI_Group_free ( group)

call MPI_GROUP_FREE (group, ierr)

Apaga a definio de um grupo.

COMM FREE C FORTRAN


int MPI_Comm_free (*comm)

call MPI_COMM_FREE (comm., ierr)

Apaga a definio de um communicator.

100

Exemplo de GRUPO
PROGRAM mainprog IMPLICIT NONE INCLUDE "mpif.h" INTEGER INTEGER INTEGER INTEGER INTEGER INTEGER CALL MPI_Init(rstat) CALL MPI_Comm_group(MPI_COMM_WORLD, MPI_GROUP_WORLD, rstat) CALL MPI_Comm_rank(MPI_COMM_WORLD, me, rstat) CALL MPI_Group_excl(MPI_GROUP_WORLD, 1, ranks, grprem, rstat) CALL MPI_Comm_create(MPI_COMM_WORLD, grprem, commslave, rstat) IF (me /= 0) THEN CALL MPI_Reduce(send_buf, recv_buf, count, MPI_INTEGER, & MPI_SUM, 1, commslave, rstat) END IF CALL MPI_Reduce(send_buf2, recv_buf2, count2, MPI_INTEGER, & MPI_SUM, 0, MPI_COMM_WORLD, rstat) IF (commslave /= MPI_COMM_NULL) THEN CALL MPI_Comm_free(commslave, rstat) END IF CALL MPI_Group_free(MPI_GROUP_WORLD, rstat) CALL MPI_Group_free(grprem, rstat) CALL MPI_Finalize(rstat) END PROGRAM mainprog
101

:: me :: ranks = 0 :: send_buf, send_buf2, recv_buf, recv_buf2 :: count, count2 :: commslave, PI_GROUP_WORLD :: grprem, rstat ! Status variable

12 - REFERNCIAS 1Message Passing Interface (MPI) MHPCC - Maui High Performance Computing Center Blaise Barney - August 29, 1996 Programming Languages and Tools: MPI CTC - Cornell Theory Center April, 1996 MPI: A Message-Passing Interface Standard University of Tennesse, Knoxville, Tennesse May 5, 1994 MPI: The Complete Reference The MIT Press - Cambridge, Massachusetts Marc Snir, Steve Otto, Steven Huss-Lederman, David Walker, Jack Dongarra 1996

2-

3-

4-

102

1 LABORATRIO
Rotinas Bsicas do MPI
Exerccio 1 1 - Caminhe para o diretrio do primeiro exerccio do laboratrio. cd ./mpi/lab01/ex1 2 - Compile o programa hello.f ou hello.c com o script de compilao do MPI para o FORTRAN ou para o C. ifort hello.f -o hello -lmpi ou icc hello.c -o hello -lmpi 3 - Execute o programa vrias vezes, alterando a opo de nmero de processos iniciados. mpirun np n hello ( n = nmero de processos)

103

Exerccio 2

1 - Caminhe para o diretrio com o segundo exerccio do laboratrio. %cd ./mpi/lab01/ex2

Programa hello.ex1.c e hello.ex1.f Esses programas seguem o modelo SPMD ("Single Program Multiple Data), ou seja, o mesmo programa executa como um processo mestre e como um processo escravo. O processo mestre envia uma mensagem ("Hello world") para todos os processos escravos e imprime a mensagem na sada padro. Os processos escravos recebem a mensagem e, tambm, imprimem a mensagem na sada padro.

O exerccio est em alterar o programa, de maneira que, cada processo escravo imprima a mensagem e devolva-a ao processo mestre. O programa mestre recebe a mensagem de volta e imprime como "Hello, back".

2 - Adicione as rotinas necessrias ao programa em FORTRAN ou em C substituindo as linhas que possuem setas por rotinas do MPI, e complete a lgica de alguns comandos. Compile e execute o programa.

104

Exerccio 3

1 - Caminhe para o diretrio com o terceiro exerccio do laboratrio. %cd ./mpi/lab01/ex3

Um programa pode utilizar a idia do parmetro tag em rotinas de send e receive para distinguir as mensagens que esto sendo enviadas ou recebidas.

2 - Adicione as rotinas necessrias ao programa em FORTRAN ou em C substituindo as linhas que possuem setas por rotinas do MPI, de maneira que, o processo mestre envie duas mensagens ("Hello" e "World") para cada processo escravo, utilizando-se de duas tags diferentes.

3 - Os processos escravos devero receber as mensagens na ordem invertida e iro imprimir o resultado na sada padro. Compile e execute o programa.

105

Exerccio 4

1 - Caminhe para o diretrio com o quarto exerccio do laboratrio. %cd ./mpi/lab01/ex4

Neste exerccio, o processo mestre inicia um vetor e distribui partes desse vetor para vrios processos escravos. Cada processo escravo recebe a sua parte do vetor principal, efetua um clculo bastante simples e devolve os dados para o processo mestre.

2 - Adicione as rotinas necessrias ao programa em FORTRAN ou em C substituindo as linhas que possuem setas por rotinas do MPI. Compile e execute o programa.

106

Exerccio 5

1 - Caminhe para o diretrio com o quinto exerccio do laboratrio. %cd ./mpi/lab01/ex5

Este programa calcula o valor de PI, atravs de uma integral de aproximao. A idia do exerccio que se entenda o algoritmo paralelo implementado, apenas, para a integral, e corrija dois erros bem simples de finalizao dos resultados, pois o programa no est funcionando corretamente.

2 - Compile o programa e execute para verificar os erros e possveis correes

107

LABORATRIO

Comunicao Point-to-Point
Exerccio 1 1 - Caminhe para o diretrio com o primeiro exerccio do laboratrio. %cd ./mpi/lab02/ex1

Este exerccio tem como funo, demonstrar e comparar a performance dos quatro modos de comunicao, a partir da transmisso de um determinado dado (o tempo mnimo de processamento de um "blocking send"). OBS: - O programa no mede o tempo de comunicao completo e nem o total do "system overhead". - Todos os processos filhos iniciados, executam um "blocking receive", antes do processo pai executar um "blocking send". 2 - Analise o programa e observe a similaridade na sintaxe entre as rotinas de "blocking send", o passo necessrio para se executar um "buffered send" e o uso de "non-blocking receives". 3 - Compile o programa e execute-o iniciando apenas dois processos para que seja possvel realizar a medio: Execute vrias vezes o programa utilizando diferentes tamanhos de mensagens; Em particular compare os resultados da transmisso de dados de 1024 floats e 1025 floats.
108

Exerccio 2

1 - Caminhe para o diretrio com o segundo exerccio do laboratrio. %cd ./mpi/lab02/ex2

Este programa tenta demonstrar, que a utilizao de rotinas "non-blocking" so mais seguras que as rotinas "blocking".

2 - Compile e execute o programa iniciando apenas dois processos.

OBS: O programa ir imprimir vrias linhas na sada padro, e ento para. Ser necessrio executar um <ctrl> <c>, para finalizar o programa.

3 - Corrija o programa para que se possa executa-lo por completo. O que ser necessrio alterar ???

109

Exerccio 3

1 - Caminhe para o diretrio com o terceiro exerccio do laboratrio. %cd ./mpi/lab02/ex3

Este programa tenta demonstrar o tempo perdido em "synchronization overhead" para mensagens maiores de 4Kbytes. Existe uma rotina (sleep) que simula o tempo que poderia ser utilizado em computao.

2 - Compile primeiro a rotina sleep: %cc -c new_sleep.c

3 - Compile o programa principal: %mpxlf brecv.f new_sleep.o -o brecv ou %mpcc brecv.c new_sleep.o -o brecv

4 - Execute o programa iniciando apenas dois processos. Anote o tempo de execuo.

110

Exerccio 4

1 - Caminhe para o diretrio com o quarto exerccio do laboratrio. %cd ./mpi/lab02/ex4

2 - Edite o programa do exerccio anterior:

- Substitua o "blocking receive" por um "non-blocking receive" antes da rotina new_sleep;

- Adicione a rotina MPI_Wait antes da impresso de mensagem recebida, para se garantir do recebimento.

3 - Compile o programa, como foi feito no exerccio anterior.

4 - Execute o programa, iniciando apenas dois processos, e compare o tempo de execuo com a do exerccio anterior.

111

3 LABORATRIO
Comunicao Coletiva
Exerccio 1 1 - Caminhe para o diretrio com o primeiro exerccio do laboratrio: %cd ./mpi/lab03/ex1 - o processo mestre solicita a entrada de um nmero, que ser a semente para o clculo de um nmero randmico; - este nmero ser enviado para todos os processos. Adicione ao programa, no lugar da "seta", a rotina MPI adequada para esta operao; - cada processo calcular um nmero randmico, baseado no nmero de entrada informado; - o processo com o maior nmero de identificao calcular o valor mdio de todos os nmeros randmicos calculados. Adicione ao programa, no lugar da "seta", a rotina MPI adequada para esta operao; - cada processo ir calcular, novamente, mais 4 novos nmeros randmicos; - sero calculados o valor mximo e o desvio padro de todos os nmeros randmicos, e os resultados sero distribudos para todos os processos. Existem dois mtodos para efetuar essas tarefas, utilizando rotinas de comunicao coletiva diferentes. Adicione ao programa, no lugar das "setas", as rotinas MPI adequadas para cada mtodo. 2 - Compile o programa e execute.
112

Exerccio 2 1 - Caminhe para o diretrio com o segundo exerccio do laboratrio. %cd ./mpi/lab03/ex2

A idia do programa demonstrar a execuo da rotina MPI_SCATTER. Adicione os seus parmetros para que ela funcione adequadamente.

2 - Compile o programa e execute-o.

113

Exerccio 3

1 - Caminhe para o diretrio com o primeiro exerccio do laboratrio. %cd ./mpi/lab03/ex3

Este programa calcula o maior nmero primo dos nmeros primos calculados, at um limite determinado pelo programador. A idia e demonstrar a utilizao, apenas da rotina de operao de reduo, MPI_REDUCE. Substitua, adequadamente, os parmetros desta rotina, no programa.

2 - Compile o programa e execute-o.

114

Exerccio 4

1 - Caminhe para o diretrio com o quarto exerccio do laboratrio. %cd ./mpi/lab03/ex4 Este exerccio possui duas solues. 1.1 - Na primeira soluo, e utilizada as rotinas de send e receive para que os processos calculem o pedao do valor de pi. Ser necessrio utilizar uma funo com o algoritmo para o calculo de pi

- Compile o programa: ifort mpi_pi_send.f dboard.f -o mpi_pi_send -lmpi ou icc mpi_pi_send.c dboard.c -o mpi_pi_send -lmpi - Execute o programa: mpirun np 4 mpi_pi_send Analise o programa, com relao a utilizao das rotinas de send e receive.

115

1.2 - Na segunda soluo, utilizada apenas uma rotina, que coleta os resultados de todos os processos. - Adicione esta rotina ao programa mpi_pi_opt.f ou mpi_pi_opt.c - Compile o programa: ifort mpi_pi_opt.f dboard.f -o mpi_pi_opt -lmpi ou icc mpi_pi_opt.c dboard.c -o mpi_pi_opt -lmpi - Execute o programa: mpirun np 4 mpi_pi_opt

116

LABORATRIO

Grupo de Processos
Exerccio 1 1 - Caminhe para o diretrio com o primeiro exerccio do laboratrio: %cd ./mpi/lab04/ex1 Neste exerccio, sero criados dois grupos identificados como: processos mpares e processos pares. Adicione ao programa, no lugar da "seta", a rotina MPI adequada para esta operao;

117