Introdução
Arquiteturas Paralelas Programação Paralela Geração de Malhas
Particionamento de Malhas (Grafos) Balanceamento de Carga ro P ar an ae ns e de C om pu ta çã o Balanceamento de Carga ro P ar an ae ns e de C om pu ta çã o
Relembrando alguns conceitos da Parte I:
O que é Computação Científica ?
Projeto e analise de algoritmos para a solução de problemas em ciências e engenharia.
E Computação Científica Paralela o que é ?
Projeto e análise de algoritmos para a solução de problemas em ciências e engenharia adotando técnicas de paralelismo, para que
En co nt ro P ar an ae ns e de C om pu ta çã o
ciências e engenharia adotando técnicas de paralelismo, para que esses algoritmos possam ser executados em máquinas paralelas. Essa abordagem visa a obtenção de resultados de maneira mais
rápida, os quais nem sempre poderiam ser obtidos
seqüencialmente. En co nt ro P ar an ae ns e de C om pu ta çã o
Parte II – Objetivos
Apresentar o ambiente computacional utilizado na computação científica paralela
Apresentar algumas técnicas, bibliotecas e ferramentas utilizadas ro P ar an ae ns e de C om pu ta çã o ro P ar an ae ns e de C om pu ta çã o
Conceitos Básicos:
Concorrência x Paralelismo
Concorrência
(pseudo-paralelismo):
Vários processos têm suas
execuções intercaladas Paralelismo (físico): En co nt ro P ar an ae ns e de C om pu ta çã o Paralelismo (físico): Necessidade de mais de um processador
Mais de um processo sendo
executado no mesmo intervalo de tempo Enco nt ro P ar an ae ns e de C om pu ta çã o
Há três maneiras de fazer qualquer tarefa mais rápido:
1. Trabalhar mais rápido (CPU)
2. Trabalhar de maneira mais inteligente (Algoritmo) 3. Pedir ajuda (Processamento Paralelo)
Algumas classes de problemas:
ro P ar an ae ns e de C om pu ta çã o
Algumas classes de problemas:
São grandes demais para máquinas seqüenciais: tempo de execução muito longo ou exigem muita memória
ro P ar an ae ns e de C om pu ta çã o
Classificação de Flynn
Fluxos de instruções e fluxos de dados 4 classes:
SISD - Single Instruction/Single Data stream SIMD - Single Instruction/Multiple Data stream MISD – Multiple Instruction/Single Data
MIMD - Multiple Instruction/Multiple Data stream
En co nt ro P ar an ae ns e de C om pu ta çã o
MIMD - Multiple Instruction/Multiple Data stream
MIMD: classe dos computadores paralelos
Arquiteturas MIMD ainda podem ser divididas em duas
subcategorias: memória compartilhada En co nt ro P ar an ae ns e de C om pu ta çã o
Memória Compartilhada:
Todos os processadores possuem acesso a uma memória
compartilhada
Multiprocessadores
Comunicação: através da memória compartilhada
ro P ar an ae ns e de C om pu ta çã o ro P ar an ae ns e de C om pu ta çã o
Memória Distribuída:
Multicomputadores
Neste tipo de arquitetura, cada nó tem seu processador, sua
unidade de controle e sua memória local
Cada processador pode executar um processo independente sobre
seus próprios dados
Estrutura de rede é fundamental
En co nt ro P ar an ae ns e de C om pu ta çã o
Comunicação: troca de mensagens
En co nt ro P ar an ae ns e de C om pu ta çã o
Tendências:
Processadores vetoriais
poucos processadores vetoriais memória compartilhada
já não aparecem no top 500
SMP
processadores de uso geral memória compartilhada co nt ro P ar an ae ns e de C om pu ta çã o memória compartilhada
MPP (Massively Parallel Processors)
multicomputador constituído de milhares de processadores de uso geral rede proprietária
DOE/NNSA/LLNL (USA) eServer Blue Gene Solution(IBM) 131072 procs
Clusters cont ro P ar an ae ns e de C om pu ta çã o
Cluster:
Clusters são agregados de máquinas independentes interconectados através de uma rede;
Hardware (máquinas + redes de interconexão)
Máquinas que formam o cluster:
Multiprocessadas formando uma arquitetura
En co nt ro P ar an ae ns e de C om pu ta çã o
Multiprocessadas formando uma arquitetura com memória distribuída entre os nodos e compartilhada entre os processadores (memória híbrida)
Monoprocessadas formando uma arquitetura
com apenas memória distribuída Enco
nt ro P ar an ae ns e de C om pu ta çã o
Modo de programação depende da arquitetura:
Memória compartilhada Memória distribuída
Biblioteca de multithreading: exploração do paralelismo
intra-nodal: Pthreads POSIX; ro P ar an ae ns e de C om pu ta çã o Pthreads POSIX; OpenMP; ro P ar an ae ns e de C om pu ta çã o
Padrão Posix
EEE POSIX 1003.1c standard (1995)
Distribuída junto ao sistema Operacional Linux Pthreads é definido como um conjunto de
procedimentos e tipos em C (pthread.h)
Contém mais de 60 funções
En co nt ro P ar an ae ns e de C om pu ta çã o
Contém mais de 60 funções
Compilação:
gcc –o <nome_exec> <nome_fonte> -lpthread Enco
nt ro P ar an ae ns e de C om pu ta çã o
Um thread é definido por uma função
Descreve o corpo de execução de um thread Função pode receber parâmetros (void *) Ao final de sua execução, retorna um valor (void *) void *: flexibilidade ro P ar an ae ns e de C om pu ta çã o
Protótipo
void <nome_func> (void *args) ro Par
an ae ns e de C om pu ta çã o
Criação de threads: pthread_create
int pthread_create(pthread_t *tid, const pthread_arrt_t
atrib, void * funcao(void *), void *args)
funcao: nome da função a ser executada
atrib: atributos para a execução (NULL para default) args: parâmetros de entrada para a thread
tid:identificador da thread
En co nt ro P ar an ae ns e de C om pu ta çã o
tid:identificador da thread
En co nt ro P ar an ae ns e de C om pu ta çã o
Término de thread:
return ou pthread_exit;
Ciclo de vida de um thread refere-se ao tempo necessário à execução da função
Ao executar sua última instrução, o thread é destruído ro P ar an ae ns e de C om pu ta çã o destruído pthread_exit(void *);
Termina a thread, retornando um dado
ro P ar an ae ns e de C om pu ta çã o
En co nt ro P ar an ae ns e de C om pu ta çã o #include <pthread.h> #include <stdio.h> #define NUM_THREADS 5
void *PrintHello(void *threadid) {
printf("\n%d: Hello World!\n", threadid);
pthread_exit(NULL);
}
int main (int argc, char *argv[]) { En co nt ro P ar an ae ns e de C om pu ta çã o { pthread_t threads[NUM_THREADS]; int rc, t; for(t=0; t<NUM_THREADS; t++){ printf("Creating thread %d\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
if (rc){
printf("ERROR; return code - pthread_create() is %d\n", rc); exit(-1);
Sincronização entre threads: pthread_join Sincronização explícita: ro P ar an ae ns e de C om pu ta çã o ro P ar an ae ns e de C om pu ta çã o
Sincronização entre threads
pthread_join(pthread_t tid, void **ret)
tid: identificação da thread a ser sincronizada ret: endereço de memória do dado retornado
Invocação à pthread_join bloqueia a thread
invocante, enquanto a sincronização não tenha terminado En co nt ro P ar an ae ns e de C om pu ta çã o terminado for(t=0; t<NUM_THREADS; t++) {
rc = pthread_join(thread[t], (void **)&ret);
} En co nt ro P ar an ae ns e de C om pu ta çã o
Passagem de Parâmetros
Através de memória compartilhada (variáveis globais) Alteração visível para todas as threads
Através de parâmetros da função específica da thread Tipo void*
Para a passagem de mais parâmetros, criar uma struct e fazer o cast (void *) Exemplo: ro P ar an ae ns e de C om pu ta çã o Exemplo:
void * thread_function( void *) { int code = 0; ro Par an ae ns e de C om pu ta çã o
En co nt ro P ar an ae ns e de C om pu ta çã o En co nt ro P ar an ae ns e de C om pu ta çã o
Padrão
Diversas implementações: LAM, MPICH, MPI-F... 125 funções C e Fortran Paralelismo Explícito ro P ar an ae ns e de C om pu ta çã o Paralelismo Explícito Primitivas: Gerência de processos ro P ar an ae ns e de C om pu ta çã o
Compilação:
mpicc –o <exec> <fonte.c>
Execução:
mpirun –np <num_proc> <exec> -nolocal -machinefile <nomearq>
En co nt ro P ar an ae ns e de C om pu ta çã o Exemplo:
mpirun –np 10 teste -nolocal -machinefile nodos
En co nt ro P ar an ae ns e de C om pu ta çã o
Rotinas Básicas MPI_Init MPI_Comm_rank MPI_Comm size MPI_Send MPI_Recv ro P ar an ae ns e de C om pu ta çã o MPI_Recv MPI_Finalize MPI_Bcast ro P ar an ae ns e de C om pu ta çã o
//Exemplo 1
#include "mpi.h“ #include <stdio.h>
int main( int argc, char * argv[ ] ) {
int processId; /* rank dos processos */
int noProcesses; /* Número de processos */ int nameSize; /* Tamanho do nome */
char computerName[MPI_MAX_PROCESSOR_NAME]; En co nt ro P ar an ae ns e de C om pu ta çã o char computerName[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &noProcesses);
MPI_Comm_rank(MPI_COMM_WORLD, &processId);
MPI_Get_processor_name(computerName, &nameSize);
printf("Hello from process %d on %s\n", processId, computerName); Enco
nt ro P ar an ae ns e de C om pu ta çã o
//Exemplo 2
#include <stdio.h> #include "mpi.h“
int main(int argc, char **argv) {
int myrank,src, dest, p, tag = 1;
En co nt ro P ar an ae ns e de C om pu ta çã o if (myrank != 0) {
sprintf(msg, "Hello world from process %d\n", myrank); dest = 0;
MPI_Send(msg, strlen(msg)+1, MPI_CHAR, dest, tag, MPI_COMM_WORLD);
} else
int myrank,src, dest, p, tag = 1; char msg[256];
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, Enco nt ro P ar an ae ns e de C om pu ta çã o {
printf("Hello world from process %d\n", myrank); for (src = 1; src < p; src++)
{
MPI_Recv(msg, 256, MPI_CHAR, src, tag, MPI_COMM_WORLD, &status);
//Exemplo 3
#include <stdio.h> #include <stdlib.h> #include "mpi.h“
int main(int argc, char **argv ) { char message[20]; En co nt ro P ar an ae ns e de C om pu ta çã o if(rank == 0) {
strcpy(message, "Hello, world"); }
MPI_Bcast(&message, 20, MPI_CHAR, 0, MPI_COMM_WORLD); printf("process ID :: %d\t%s\n", rank, char message[20]; int rank; int size; MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD,&size); MPI_Comm_rank(MPI_COMM_WORLD,&rank); En co nt ro P ar an ae ns e de C om pu ta çã o printf("process ID :: %d\t%s\n", rank, message); MPI_Finalize(); return 0; }
ro P ar an ae ns e de C om pu ta çã o ro P ar an ae ns e de C om pu ta çã o
O domínio para aplicações paralelas é, geralmente,
representado por uma malha bi ou tri-dimensional
Uma malha é uma estrutura composta por vértices (ou
nodos) e arestas
Modelos matemáticos podem ser discretizados
empregando estas estruturas
En co nt ro P ar an ae ns e de C om pu ta çã o Tipos Estruturadas Não estruturadas En co nt ro P ar an ae ns e de C om pu ta çã o
Software para a geração de malhas: Triangle
Desenvolvido em C, por Jonathan R. Shewchuk, para a
geração e construção de malhas bidimensionais
http://www.cs.cmu.edu/~quake/triangle.html Visualizador: Showme ro P ar an ae ns e de C om pu ta çã o ro P ar an ae ns e de C om pu ta çã o
Entrada de dados (PSLG): Primeira linha: Número de vértices Dimensão (sempre 2) Atributos (geralmente 0) Marcadores de fronteira (0 ou 1) Linhas seguintes:
<Número do vértice> <x> <y> <marcador> Uma linha: En co nt ro P ar an ae ns e de C om pu ta çã o Exemplo: 4 2 0 0 1 0 0 2 1 0 3 1 1 4 0 1 Uma linha: Número de segmentos Marcadores de fronteira Linhas seguintes:
<Número do segmento> <vértice1> <vértice2> Uma linha Número de buracos En co nt ro P ar an ae ns e de C om pu ta çã o 4 0 1 1 2 2 2 3 3 3 4 4 4 1
Saída de dados:
Arquivo de nodos (.node) Arquivo de elementos (.ele) Arquivo de áreas (.area) Arquivo de arestas (.edge)
Arquivos de vizinhança (.neigh)
ro P ar an ae ns e de C om pu ta çã o ro P ar an ae ns e de C om pu ta çã o
Triangle:
Execução: triangle [-pqn] input_file
Opções:
p : gera a malha a partir de um PSLG
q : gera malhas com triângulos com ângulos maiores que 20
graus (melhor qualidade)
En co nt ro P ar an ae ns e de C om pu ta çã o
graus (melhor qualidade)
n : gera a lista de vizinhança de cada triângulo
Demais opções: http://www.cs.cmu.edu/~quake/triangle.switch.html En co nt ro P ar an ae ns e de C om pu ta çã o
ro P ar an ae ns e de C om pu ta çã o ro P ar an ae ns e de C om pu ta çã o
O particionamento de uma malha é equivalente
ao particionamento de um grafo
Particionamento de um grafo (PG):
Consiste em dividir seus vértices em K subconjuntos, de forma que estes subconjuntos sejam balanceados (com o mesmo número de vértices), e que o número
En co nt ro P ar an ae ns e de C om pu ta çã o
(com o mesmo número de vértices), e que o número de arestas entre eles seja minimizado;
En co nt ro P ar an ae ns e de C om pu ta çã o
Na computação paralela o maior uso de grafos está no
particionamento da malha entre os processadores
O PG é um problema NP-difícil. Assim não se pode
encontrar soluções ótimas para o mesmo, mas uma
aproximação através do emprego de métodos heurísticos
Algumas heurísticas: co nt ro P ar an ae ns e de C om pu ta çã o Particionamento em faixas Métodos de Bissecção Método Multinível co nt ro P ar an ae ns e de C om pu ta çã o
METIS
Disponível em:
http://glaros.dtc.umn.edu/gkhome/metis/metis/overview
Conjunto de algoritmos multinível implementados METIS: Programas
kmetis (mais de 8 partições)
En co nt ro P ar an ae ns e de C om pu ta çã o
kmetis (mais de 8 partições)
pmetis (quantidade pequena de partições) partdmesh (particionamento de elementos) partnmesh (particionamento nos nós)
En co nt ro P ar an ae ns e de C om pu ta çã o
Execução:
pmetis GraphFile Nparts kmetis GraphFile Nparts partnmesh MeshFile Nparts partdmesh MeshFile Nparts
ro P ar an ae ns e de C om pu ta çã o Exemplo: pmetis teste.dat 8 ro P ar an ae ns e de C om pu ta çã o
METIS: Formato de arquivos
Grafos simples (sem peso nas arestas e vértices): Primeira linha:
Número de vértices Número de arestas
As demais n linhas armazenam informações estruturais do grafo
En co nt ro P ar an ae ns e de C om pu ta çã o En co nt ro P ar an ae ns e de C om pu ta çã o 7 11 5 3 2 1 3 4 2 3 6 7 1 3 6 5 4 7
METIS: Formato de arquivos Malha
Primeira linha
Números de elementos da malha Tipo de elementos:
Triângulos (1), tetraedro (2), hexaedro (cubo) (3), ou quadriláteros (4)
As outras n linhas armazenam os nodos de cada elemento
ro P ar an ae ns e de C om pu ta çã o
As outras n linhas armazenam os nodos de cada elemento
ro P ar an ae ns e de C om pu ta çã o 5 1
En co nt ro P ar an ae ns e de C om pu ta çã o En co nt ro P ar an ae ns e de C om pu ta çã o
O problema de balanceamento de carga consiste em
atribuir cargas proporcionais entre diversos processadores
Em aplicações paralelas que possuem pontos de
sincronismo o balanceamento de carga objetiva diminuir o tempo ocioso dos processadores
ro P ar an ae ns e de C om pu ta çã o ro P ar an ae ns e de C om pu ta çã o
Balanceamento de carga pode ser:
Estático:
Ocorre quando toda a informação para o balanceamento está
disponível antes do processamento.
Semi-estático:
Utilizado em situações onde o domínio é alterado lentamente
ao longo do tempo. Neste caso, pode-se empregar um algoritmo estático no início da aplicação e permitir que a mesma possua algum desbalanceamento após um certo número de passos, quando então é aplicado novamente o
En co nt ro P ar an ae ns e de C om pu ta çã o
número de passos, quando então é aplicado novamente o algoritmo estático.
Dinâmico:
Utilizado em situações onde a carga dos processadores varia
durante a execução tornando necessário a redistribuição de carga para manter o equilíbrio. Alguns autores não diferenciam balanceamento semi-estático de balanceamento
dinâmico. En co nt ro P ar an ae ns e de C om pu ta çã o
Avaliação do custo/benefício:
Deve ser considerada no cálculo do reparticionamento e/ou da
nova migração de dados, pois é necessário levar em conta que esse processo têm seu custo que pode ser significativo.
Detecção de carga:
É obtida usando métricas e/ou algoritmos que indiquem quais
processadores estão desbalanceados. Como o custo de redistribuir a carga é elevado, pois deve-se parar o
ro P ar an ae ns e de C om pu ta çã o
processadores estão desbalanceados. Como o custo de redistribuir a carga é elevado, pois deve-se parar o processamento e recalcular a malha local ou global, então antes de reparticioná-la e mapeá-la novamente, deve-se verificar se a
relação custo/beneficio é compensatória. ro Par
an ae ns e de C om pu ta çã o
O balanceamento deve ser feito de forma a atender três
requisitos básicos:
A carga de trabalho deve ser bem balanceada entre os
processadores;
A comunicação entre os processadores deve ser minimizada; O tempo de execução do algoritmo de balanceamento deve ser
tal que o ganho obtido com seu uso seja maior que o custo de sua execução. En co nt ro P ar an ae ns e de C om pu ta çã o sua execução.
O balanceamento de carga dinâmico pode ser
classificado em três tipos: Difusão; Reparticionamento; Scratch-remap. En co nt ro P ar an ae ns e de C om pu ta çã o
Difusão
Garantem uma partição de boa qualidade, com pouca
comunicação entre os subdomínios e com pouca movimentação de dados para a realização da nova partição
Em domínios com um desbalanceamento alto concentrado em
determinadas regiões, algoritmos difusivos podem resultar em uma migração de células excessivamente alta, devido à
ro P ar an ae ns e de C om pu ta çã o
uma migração de células excessivamente alta, devido à propagação da difusão em grandes áreas
Neste esquema, a cada passo de tempo, cada processador
avalia sua carga e compara sua carga com a dos seus vizinhos.
ro P ar an ae ns e de C om pu ta çã o
Difusão
Um aspecto importante dos métodos de difusão é a sua
convergência, se será atingida uma situação onda a carga esteja bem distribuída e o número de passos necessários para atingir essa situação. En co nt ro P ar an ae ns e de C om pu ta çã o En co nt ro P ar an ae ns e de C om pu ta çã o
Reparticionamento
Quando a malha é alterada durante a execução, essa estratégia
recalcula o particionamento partindo do zero, sem levar em conta as informações atuais do particionamento.
ro P ar an ae ns e de C om pu ta çã o ro P ar an ae ns e de C om pu ta çã o
Scratch-remap
Calculam uma nova partição e mapeiam a nova partição para a
partição existente.
Estes algoritmos funcionam bem para grafos com um
desbalanceamento alto e concentrado em algumas sub-regiões do domínio.
Em domínios com um desbalanceamento baixo ou bem
En co nt ro P ar an ae ns e de C om pu ta çã o
Em domínios com um desbalanceamento baixo ou bem
distribuído em todo o domínio, esta abordagem pode resultar em uma transferência excessiva de células, se comparado aos algoritmos de difusão multinível.
En co nt ro P ar an ae ns e de C om pu ta çã o
Mapeamento:
O problema do particionamento de malha e balanceamento
de carga pode ser visto como um problema de mapeamento
de grafos
Deve-se encontrar um mapeamento, do grafo da aplicação
para o grafo da arquitetura, de modo a maximizar a relação computação/comunicação
Assim, o mapeamento deve considerar a arquitetura e a rede
de interconexão, e com essas informações construir uma
nt ro P ar an ae ns e de C om pu ta çã o
de interconexão, e com essas informações construir uma
solução visando a diminuição das comunicações e do
balanceamento de carga nt ro P ar an ae ns e de C om pu ta çã o
Resolução de sistemas de equações via Multigrid Guilherme Galante – dissertação de mestrado
Estudo e implementação de métodos de resolução de
sistemas:
Utilizando malhas não estruturadas na discretização dos
domínios En co nt ro P ar an ae ns e de C om pu ta çã o domínios
Empregando métodos multigrid e decomposição de
domínios
Aplicar os métodos de solução na solução problemas reais:
Transferência de calor Hidrodinâmica (UnHIDRA) En co nt ro P ar an ae ns e de C om pu ta çã o
ro P ar an ae ns e de C om pu ta çã o Escopo do Trabalho ro P ar an ae ns e de C om pu ta çã o
Etapa 1: Geração e Particionamento de Malhas En co nt ro P ar an ae ns e de C om pu ta çã o *
informação das malhas
Etapa2: Criação da Hierarquia de Malhas
En co nt ro P ar an ae ns e de C om pu ta çã o
Etapa 3: Montagem dos sistemas de Equações ro P ar an ae ns e de C om pu ta çã o ro P ar an ae ns e de C om pu ta çã o
Etapa 3: Resolução Paralela En co nt ro P ar an ae ns e de C om pu ta çã o Métodos Iterativos GMRES Multigrid Full Multigrid V
Métodos de Decomposição de Domínio En
co nt ro P ar an ae ns e de C om pu ta çã o
ro P ar an ae ns e de C om pu ta çã o Hidrodinâmica Guaíba - Níveis da Água ro P ar an ae ns e de C om pu ta çã o
En co nt ro P ar an ae ns e de C om pu ta çã o Transferência de Calor En co nt ro P ar an ae ns e de C om pu ta çã o
ro P ar an ae ns e de C om pu ta çã o Guilherme Galante www.inf.unioeste.br/~guilherme Professor Assistente Informática – Unioeste gui.galante@gmail.com Rogério L. Rizzi ro P ar an ae ns e de C om pu ta çã o Rogério L. Rizzi Professor Adjunto Matemática – Unioeste rogeriorizzi@gmail.com