• Nenhum resultado encontrado

O padrão OpenMP para computação paralela. Danilo Ehrhardt Ferreira Bento Orientador: Marco Dimas Gubitoso

N/A
N/A
Protected

Academic year: 2022

Share "O padrão OpenMP para computação paralela. Danilo Ehrhardt Ferreira Bento Orientador: Marco Dimas Gubitoso"

Copied!
35
0
0

Texto

(1)

O padrão OpenMP para computação paralela Danilo Ehrhardt Ferreira Bento

<danilo@ime.usp.br>

Orientador: Marco Dimas Gubitoso

<gubi@ime.usp.br>

Seminários de Sistemas de Software Instituto de Matemática e Estatística

Universidade de São Paulo

(2)

13/11/2007 Danilo E. F. Bento <danilo@ime.usp.br> 2

Introdução

Artigo ”Attack of the Killer Micros” – Wall Street Journal, 1998 – dizia que sistemas computacionais feitos de diversos

processadores de baixo custo poderiam tornar os supercomputadores obsoletos.

400 computadores pessoais poderiam equiparar-se a um supercomputador ?

(3)

Introdução

Alguns problemas:

troca de informações:

velocidade;

latência.

mecanismos de controle:

concorrência;

coerência.

programas:

reengenharia;

novos algoritmos.

(4)

13/11/2007 Danilo E. F. Bento <danilo@ime.usp.br> 4

Introdução

Os microprocessadores ganharam grande

desempenho aproveitando-se da evolução dos supercomputadores, seus estudos e a quebra de barreiras técnicas que conseguiram.

Implementação destas melhorias em um curto espaço de tempo nos microprocessadores.

(5)

Introdução

A evolução dos microprocessadores está também associada à demanda por mais desempenho, impulsionada por:

Gráficos em 3D;

Interfaces gráficas com o usuário;

Multimídia;

Jogos.

(6)

13/11/2007 Danilo E. F. Bento <danilo@ime.usp.br> 6

Introdução

Com a evolução dos microprocessadores, um microprocessador de hoje pode ser

comparado a centenas de microprocessadores do passado, atingindo mais desempenho do

que era necessário para a substituição de alguns modelos de supercomputadores por um computador pessoal.

(7)

Introdução

Porque não agrupar diversos

microprocessadores modernos em um sistema?

SMP, ”Multithread”, ”Multicore”:

troca de informações através de memória compartilhada;

mecanismos de controle de coerência.

programas:

mecanismos de controle de concorrência;

reengenharia;

novos algoritmos.

(8)

13/11/2007 Danilo E. F. Bento <danilo@ime.usp.br> 8

Padrão

A API OpenMP especifica:

uma coleção de diretivas de compilador;

uma biblioteca de rotinas;

variáveis de ambiente.

Um modelo portável de programação paralela para arquiteturas de memória compartilhada.

(9)

Padrão

Usado para especificar paralelismo em

programas escritos nas linguagens C, C++ e Fortran:

ISO/IEC 9899:1990 (C90);

ISO/IEC 9899:1999 (C99);

ISO/IEC 14882:1998 (C++);

ISO/IEC 1539:1980 (Fortran 77);

ISO/IEC 1539:1991 (Fortran 90);

ISO/IEC 1539-1:1997 (Fortran 95).

Compiladores de diversos fabricantes dão suporte a API OpenMP.

(10)

13/11/2007 Danilo E. F. Bento <danilo@ime.usp.br> 10

Padrão

Modelo de execução paralela “fork-join”.

Projetado para programas que executam corretamente de forma seqüencial ou

paralela.

facilita a reengenharia de programas.

Pode ser usado em programas que sejam estritamente paralelos em sua concepção.

(11)

Padrão

Programas iniciam com apenas uma linha de execução (“thread”), chamada “thread”

inicial;

Programa segue a execução da “thread”

inicial, como uma execução seqüencial, até encontrar uma região de execução paralela;

Ao término da região paralela, somente a

“thread” principal segue a execução das instruções seguintes.

(12)

13/11/2007 Danilo E. F. Bento <danilo@ime.usp.br> 12

Padrão

OpenMP aproveita código existente,

paralelização pode ser implementada de forma incremental;

MPI requer reengenharia completa dos

programas, pode ser usado em sistemas sem memória compartilhada;

Pthread requer certa reengenharia, API requer uma certa iteração em mais baixo-nível.

(13)

API

Diretivas de compilador:

C/C++:

#pragma omp

Fortran:

!$omp

(14)

13/11/2007 Danilo E. F. Bento <danilo@ime.usp.br> 14

API

A construção parallel é a construção fundamental que inicia uma execução paralela.

C/C++:

#pragma omp parallel [cláusula[ [, ]cláusula] ...] nova-linha bloco-estruturado

Fortran:

!$omp parallel [cláusula[[,] cláusula]...]

bloco-estruturado

!$omp end parallel

(15)

API

A construção parallel possui as seguintes cláusulas:

C/C++:

if(expressão-condicional)

private(lista)

firstprivate(lista)

default(shared | none)

shared(lista)

copyin(lista)

reduction(operador: lista) num_threads(inteiro)

(16)

13/11/2007 Danilo E. F. Bento <danilo@ime.usp.br> 16

API

Fortran:

if(expressão-condicional)

private(lista)

firstprivate(lista)

default(private | shared | none)

shared(lista)

copyin(lista)

reduction(operador: lista)

num_threads(inteiro)

(17)

API

Exemplo em C:

#include <stdio.h>

int main() {

#pragma omp parallel

printf(”Hello world!\n”);

return 0;

}

$ gcc-4.2 -fopenmp \

> -o hello hello.c

$ ./hello

Hello world!

Hello world!

$

(18)

13/11/2007 Danilo E. F. Bento <danilo@ime.usp.br> 18

API

Algumas subrotinas da bilbioteca:

omp_set_num_threads

omp_get_num_threads

omp_get_max_threads

omp_get_thread_num

omp_get_num_procs

omp_in_parallel

(19)

API

Exemplo em C:

#include <stdio.h>

#include <omp.h>

int main() { int tid;

if(omp_in_parallel()) printf("oops... parallel\n");

#pragma omp parallel private(tid) {

tid = omp_get_thread_num();

if(tid == 0) {

int tnum = omp_get_num_threads();

printf("%d threads.\n", tnum);

(20)

13/11/2007 Danilo E. F. Bento <danilo@ime.usp.br> 20

API

Exemplo em C (continuação):

printf("Hello world! Thread %d.\n", tid);

if(omp_in_parallel()) printf("parallel\n");

}

if(omp_in_parallel()) printf("oops again... parallel\n");

return 0;

}

(21)

API

Exemplo em C (saída em tela):

$ gcc-4.2 -fopenmp -lgomp hello2.c -o hello2

$ ./hello2 2 threads.

Hello world! Thread 0.

parallel

Hello world! Thread 1.

parallel

$

(22)

13/11/2007 Danilo E. F. Bento <danilo@ime.usp.br> 22

API

A construção ”loop” é uma construção para divisão de trabalho.

C/C++:

#pragma omp for [cláusula[ [, ]cláusula] ...] nova-linha bloco-estruturado

Fortran:

!$omp do [cláusula[[,] cláusula]...]

bloco-estruturado

!$omp end do [nowait]

(23)

API

Uma cláusula importante na construções de

”loop” é a cláusula schedule:

schedule(tipo[, tamanho])

O tipo define como o trabalho é dividido e pode ser:

static – uniformemente entre as ”threads”;

dinamic – dinâmicamente entre as ”threads”;

guided – dinâmicamente entre as ”threads”, mas com tamanhos cada vez menores;

runtime – decidido em tempo de execução.

(24)

13/11/2007 Danilo E. F. Bento <danilo@ime.usp.br> 24

API

Exemplo em C:

#include <stdio.h>

#include <omp.h>

int main () { int i;

#pragma omp parallel

#pragma omp for

for (i=1; i<5; i++) /* i is private by default */

printf("i=%d thread=%d\n", i, omp_get_thread_num());

return 0;

}

(25)

API

Exemplo em C:

#include <stdio.h>

#include <omp.h>

int main () { int i;

#pragma omp parallel for

for (i=1; i<5; i++) /* i is private by default */

printf("i=%d thread=%d\n", i, omp_get_thread_num());

return 0;

}

(26)

13/11/2007 Danilo E. F. Bento <danilo@ime.usp.br> 26

API

Exemplo em C:

$ gcc-4.2 -fopenmp -lgomp ompfor.c -o ompfor

$ ./ompfor

i=3 thread=1 i=4 thread=1 i=1 thread=0 i=2 thread=0

$

(27)

API

Variáveis de ambiente:

OMP_SCHEDULE

OMP_NUM_THREADS

OMP_DYNAMIC

OMP_NESTED

(28)

13/11/2007 Danilo E. F. Bento <danilo@ime.usp.br> 28

API

Exemplo:

$ OMP_NUM_THREADS=4 ./ompfor i=1 thread=0

i=4 thread=3 i=2 thread=1 i=3 thread=2

$

(29)

API

A construção sections é uma construção para divisão de trabalho, onde cada section é

executada em uma ”thread”.

C/C++:

#pragma omp sections [cláusula[ [, ]cláusula] ...] nova-linha {

[#pragma omp section nova-linha]

bloco-estruturado

[#pragma omp section nova-linha bloco-estruturado]

}

(30)

13/11/2007 Danilo E. F. Bento <danilo@ime.usp.br> 30

API

Fortran:

!$omp sections [cláusula[[,] cláusula]...]

[!$omp section]

bloco-estruturado [!$omp section

bloco-estruturado]

!$omp end sections [nowait]

(31)

API

Exemplo em C:

#include <stdio.h>

#include <omp.h>

int main () { int i;

#pragma omp parallel sections private(i) {

#pragma omp section

for (i=1; i<5; i++) printf("loop=1 i=%d thread=%d\n", i, omp_get_thread_num());

#pragma omp section

for (i=1; i<5; i++) printf("loop=2 i=%d thread=%d\n", i, omp_get_thread_num());

}

(32)

13/11/2007 Danilo E. F. Bento <danilo@ime.usp.br> 32

API

Exemplo (saída):

$ OMP_NUM_THREADS=4 ./ompforsections loop=1 i=1 thread=0

loop=1 i=2 thread=0 loop=1 i=3 thread=0 loop=1 i=4 thread=0 loop=2 i=1 thread=2 loop=2 i=2 thread=2 loop=2 i=3 thread=2 loop=2 i=4 thread=2

$

(33)

API

Outras construções:

single – executada em uma ”thread”;

master – executada na ”thread” principal;

critical – uma ”thread” por vez;

barrier – ”threads” aguardam outras chegarem a este ponto antes de continuarem a execução;

atomic – evita que uma região de memória seja atualizada simultâneamente por mais multiplas

”threads”;

flush – força o sincronismo da região de memória

(34)

13/11/2007 Danilo E. F. Bento <danilo@ime.usp.br> 34

Implementações

Fabricante Plataforma Fujitsu/Lahey Intel Linux

Fujitsu/Lahey Fujitsu Solaris

HP P A-RISC/Itanium HP -UX

HP Tru64

IBM P owerP C AIX/Linux

Intel IA32/Itanium Linux/Windows

Intel Intel Mac OS X

KAI Software Lab Intel Linux/Windows

P GI Intel Linux/Solaris/Windows

SGI MIP S IRIX

Sun Microsystems SP ARC/x86/x64 Solaris

Crescent Bay Software IA32/Itanium/x64/P owerP C Linux Crescent Bay Software SGI Altix

Crescent Bay Software Mac OS X

gcc Diversas

(35)

Referências

DOWD, Kevin e SEVERANCE, Charles R. High

Performance Computing. 2. ed. O'Reilly, 1998.

OpenMP Architecture Review Board. OpenMP

Application Program Interface: Version 2.5. 2005.

Disponível em <http://www.openmp.org/drupal/mp- documents/spec25.pdf>. Acesso em 26/09/2007.

OpenMP Architecture Review Board. Compilers and Platforms. 2007. Disponível em

<http://www.openmp.org/drupal/node/view/9#Compilers

>. Acesso em 26/09/2007.

GCC team. GCC 4.2 Release Series Changes, New Features, and Fixes. 2007. Disponível em

<http://gcc.gnu.org/gcc-4.2/changes.html>. Acesso em 29/09/2007.

Referências

Documentos relacionados

O uso crescente das tecnologias digitais e das redes de comunicação interativa acompanha e amplifica uma profunda mutação na relação com o saber (LÉVY, 1999, p. Os alunos estão

A meteorologia tem um grande impacto na pontualidade e principalmente na segurança das operações aéreas, tendo em vista que a maioria dos aeroportos

Método Iterativo do tipo decomposição de domínio Ótimo para computação paralela. alta granularidade (computação/comunicação)

O MPI é um padrão para desenvolvimento de aplicações distribuídas Disponível na forma de bibliotecas para linguagens C, C++ e Fortran SPMD – Single Program Multiple Data – todos

e) Oportunidades de mercado: a exigência de certificação da madeira para atingir o mercado internacional de forma efetiva, faz com que as empresas que praticam

(Praia do Suá, Santa Lucia e Bento Ferreira). Bento

Esta ´e a m ´etrica mais importante e a que deve ser usada para comparar os desempenhos de vers ˜oes s ´erie e paralela do mesmo programa, uma vez que ´e a que incide sobre o

Para a realização da técnica de aplicação do MODELLATA escolha a ponteira de acordo com o objetivo terapêutico seguindo as sugestões de guia para a terapia, conforme página