Escolar Documentos
Profissional Documentos
Cultura Documentos
So Paulo
Apostila de Treinamento:
Introduo ao OpenMP
Reviso: 2014
ndice
1. Conceitos 03
1. Shared Memory 03
2. Distributed Memory 04
3. Data Parallel Programming 04
4. Threads/MultiThreads 05
2. Introduo ao OpenMP 07
1. O que OpenMP 07
2. Histrico 07
3. Modelo de Programao OpenMP 08
4. Diretivas OpenMP 10
1. Formato Fortran 10
2. Formato C/C++ 11
3. Construo PARALLEL 12
Exerccio 1 20
Exerccio 2 21
Exerccio 3 22
4. Construo Compartilhada 23
Diretiva DO / for 23
Diretiva SECTIONS 28
Diretiva SINGLE 32
Exerccio 4 33
Exerccio 5 34
Exerccio 6 35
5. Construo combinada PARALLEL/Compartilhada 36
Diretiva PARALLEL DO / parallel for 36
Diretiva PARALLEL SECTIONS 38
Exerccio 7 39
6. Construes de Sincronizao 40
Diretiva MASTER 41
Diretiva CRITICAL 41
Exerccio 8 43
Diretiva BARRIER 44
Diretiva ATOMIC 44
Diretiva FLUSH 45
Diretiva ORDERED 46
7. Regras de Operao das Diretivas 47
Exerccio 9 48
5. Rotinas 49
1. OMP_SET_NUM_THREADS 49
2. OMP_GET_NUM_THREADS 49
3. OMP_GET_MAX_THREADS 50
4. OMP_GET_THREAD_NUM 50
5. OMP_GET_NUM_PROCS 52
6. OMP_IN_PARALLEL 52
7. OMP_SET_DYNAMIC 52
8. OMP_GET_DYNAMIC 53
9. OMP_SET_NESTED 53
10. OMP_GET_NESTED 53
11. OMP_INIT_LOCK 54
12. OMP_DESTROY_LOCK 54
13. OMP_SET_LOCK 54
14. OMP_UNSET_LOCK 55
15. OMP_TEST_LOCK 55
6. Variveis de Ambiente 56
1. OMP_SCHEDULE 56
2. OMP_NUM_THREADS 56
3. OMP_DYNAMIC 56
4. OMP_NESTED 56
Exerccio 10 57
Exerccio 11 58
7. Referencias 59
2
1. Conceitos
O uso de paralelismo em computadores, e entre computadores, agora a regra e no mais a
exceo. Internamente em um processador, diversas unidades funcionais executam tarefas em
paralelo que esto escondidas no conjunto de instrues da arquitetura do processador, transparente
para o usurio.
1 Distributed Memory
Ambiente com vrios processadores, cada um com sua prpria memria e interconectados
por uma rede de comunicao. Programao complexa. O programador responsvel pela
comunicao entre os processadores.
Message-Passing
3
2 Shared Memory
Threads/Multithreads
Como cada processo possui seu prprio espao de endereamento, a comunicao entre os
subprocessos torna-se difcil e lenta, pois utiliza mecanismos tradicionais como pipes, sinais,
semforos, memria compartilhada ou troca de mensagem. Alm disto, o compartilhamento de
recursos comuns aos subprocessos concorrentes, como memria e arquivos abertos, no simples.
5
2. Introduo ao OpenMP
1 O que OpenMP?
Diretivas de Compilao;
Biblioteca de Execuo;
Variveis de Ambiente.
OpenMP est disponvel para uso com os compiladores C/C++ e Fortran, podendo ser
executado em ambientes Unix e Windows (Sistemas Multithreads). Definido e mantido por um
grupo composto na maioria por empresas de hardware e software, denominado como OpenMP ARB
(Architecture Review Board). Hardware: Compaq (Digital), Hewlett-Packard Company, Intel
Corporation, International Business Machines (IBM) , Kuck & Associates, Inc. (KAI) , Silicon
Graphics, Inc. , Sun Microsystems, Inc., U.S. Department of Energy ASCI program . Software:
Absoft Corporation , Edinburgh Portable Compilers , GENIAS Software GmBH , Myrias Computer
Technologies, Inc. , The Portland Group, Inc. (PGI) , ADINA R&D, Inc. , ANSYS, Inc. , Dash
Associates , Fluent, Inc. , ILOG CPLEX Division , Livermore Software Technology Corporation
(LSTC) , MECALOG SARL , Oxford Molecular Group PLC , The Numerical Algorithms Group
Ltd. (NAG).
2 Histrico
O primeiro padro, ANSI X3H5, para testes foi lanado em 1994, mas nunca foi adotado devido ao
grande uso e interesse, na poca, por mquinas de memria distribuda (clusters).
Um novo padro foi desenvolvido em 1997 a partir do padro anterior, quando as arquiteturas de
memria compartilhada se tornaram mais comum.
6
3. Modelo de Programao Paralela
7
Exemplo de estrutura OpenMP
Fortran
PROGRAM HELLO
INTEGER VAR1, VAR2, VAR3
*** Cdigo serial
.
.
.
*** Incio da seo paralela. Fork um grupo de threads.
C / C++
#include <omp.h>
main () {
int var1, var2, var3;
*** Cdigo serial
.
.
.
*** Incio da seo paralela. Fork um grupo de threads.
8
4-Diretivas OpenMP
4.1-Formato FORTRAN
Exemplo:
!$OMP o nico identificador aceito. Pode aparecer em qualquer coluna, mas deve ser precedido
por um espao em branco;
Diversas diretivas do Fortran OpenMP identificam sees do cdigo que sero executadas em
paralelo. Essas diretivas trabalham em pares, iniciando e finalizando a seo.
!$OMP diretiva
[ cdigo Fortran ]
9
4.2-Formato C/C++
Exemplo:
Case sensitive ;
Linhas de diretivas muito longas podem continuar em diversas linhas, acrescentando o caractere de
nova linha (\) no final da diretiva.
10
4.3 Construo PARALLEL
Identifica um bloco de cdigo que ser executa por mltiplos threads. a construo fundamental
do OpenMP.
Formato:
Bloco de cdigo
estrutura de bloco
Atributos:
IF
Especifica uma condio para que o grupo de threads seja criado, se o resultado for verdadeiro.
Se falso, a regio definida como paralela, ser executada somente pela thread mestre.
11
Observaes
1-Fork/Join
Quando uma thread chega a uma definio de regio paralela, ela cria um conjunto de
threads e passa a ser a thread mestre. A thread mestre faz parte do conjunto de threads e
possui o nmero de identificao 0.
12
2-O nmero de trheads
3-Threads dinmico
Um programa com vrias regies paralelas, utilizara o mesmo nmero de thread para
executar cada regio. Isso pode ser alterado permitindo que durante a execuo do programa, o
nmero de threads seja ajustado dinamicamente para uma determinada regio paralela. Dois
mtodos disponveis:
Uma regio paralela dentro de outra regio paralela resulta na criao de um novo grupo de
threads de apenas uma thread, por default. possvel definir um nmero maior de
threads, utilizando um dos dois mtodos disponveis:
5-Restries
13
Exemplo:
Fortran
PROGRAM HELLO
C / C++
#include <omp.h>
main () {
int nthreads, tid;
14
Atributos Comuns
Definem como os dados das variveis sero transferidos das sees seriais
para as sees paralelas.
Definem quais as variveis sero visveis por todas as threads e quais sero
locais.
15
Atributos:
PRIVATE
Declara que as variveis listadas sero de uso especfico de cada thread.
Essas variveis no so iniciadas.
SHARED (default)
Declara que as variveis listadas iro compartilhar o seu contedo com todas
as threads de um grupo. As variveis existem em apenas um endereo de
memria, que pode ser lido e escrito por todas as threads do grupo.
DEFAULT
Permite que o programador defina o atributo default para as variveis em
uma regio paralela (PRIVATE, SHARED ou NONE).
FIRSTPRIVATE
Define uma lista de variveis com o atributo PRIVATE, mas sendo
inicializadas automaticamente, de acordo com o valor que possuam no
programa (thread mestre) antes de uma regio paralela.
LASTPRIVATE
Define uma lista de variveis com o atributo PRIVATE e copia o valor da
ltima iterao de um loop da ltima thread que finalizou.
REDUCTION
Efetua uma operao de reduo em uma lista de variveis. Essas variveis
devem ser escalares e terem sido definidas com o atributo SHARED, no
contexto em que elas participaro.
16
Exerccio 1
O objetivo desse exerccio entender como se compila e executa um programa utilizando OpenMP.
O programa HELLO, o mais simples possvel; em paralelo vrias threads iro imprimir um hello.
cd ~/curso/openmp/ex1
more omp_hello.f
3 Compilao
4 Execuo
Antes da execuo do programa, ser necessrio especificar o nmero de threads que iro
participar da execuo. No caso desse exerccio, a maneira mais fcil ser definir a varivel de ambiente
OMP_NUM_THREADS.
Ambiente IBM/csh
Ambiente LINUX/bash
17
Exerccio 2
O objetivo desse exerccio entender como se compila e executa um programa utilizando OpenMP.
O programa omp_mm, simula a operao de multiplicao de matrizes, utilizando OpenMP para paralelizar
a operao.
cd ~/curso/openmp/ex3
2 Edite o programa omp_mm.f ou omp_mm.c e adicione a diretiva DO/for do OpenMP nas posies
indicadas no programa.
vi omp_mm.f ou vi omp_mm.c
ou
pico omp_mm.f ou pico omp_mm.c
3 Compilao
4 Execuo
Antes da execuo do programa, ser necessrio especificar o nmero de threads que iro
participar da execuo. No caso desse exerccio, a maneira mais fcil ser definir a varivel de ambiente
OMP_NUM_THREADS.
Ambiente IBM/csh
Ambiente LINUX/bash
18
4.4Construes de Trabalho Compartilhado
Esse tipo de construo divide a execuo de uma regio paralela por entre os membros do
grupo de threads;
Esse tipo de construo deve estar dentro de uma regio paralela definida pelo OpenMP,
afim de executar em paralelo;
SECTIONS Quebra o trabalho em sees separadas, aonde cada seo ser executada por
uma thread do grupo. Representa a implementao de paralelismo funcional, por cdigo.
SINGLE Determina que uma seo da regio paralela, seja executada por uma nica
thread.
19
Diretiva compartilhada DO/for
Formato:
do_loop
for_loop
20
Atributos:
SCHEDULE Descreve como as iteraes do loop sero divididas por entre os threads:
21
GUIDED O nmero de iteraes para cada thread ir variar, comeando com um
valor grande e sendo reduzido exponencialmente, a medida que enviado o tamanho
do loop para cada thread. Neste caso, o valor de chunk o tamanho mnimo
permitido para o nmero de iteraes, se no for especificado, ser de 1.
Observaes
22
Exemplo:
!$OMP DO SCHEDULE(DYNAMIC,CHUNK)
DO I = 1, N
C(I) = A(I) + B(I)
ENDDO
!$OMP END DO NOWAIT
C / C++
#include <omp.h>
#define CHUNK 100
#define N 1000
main ()
{
int i, n, chunk;
float a[N], b[N], c[N];
/* Some initializations */
for (i=0; i < N; i++)
a[i] = b[i] = i * 1.0;
n = N;
chunk = CHUNK;
#pragma omp parallel shared(a,b,c,n,chunk) private(i)
{
#pragma omp for schedule(dynamic,chunk) nowait
for (i=0; i < n; i++)
c[i] = a[i] + b[i];
23
Diretiva Compartilhada SECTIONS
Diretiva que divide o trabalho de forma no iterativa em sees separadas, aonde cada seo
ser executada por uma thread do grupo. Representa a implementao de paralelismo
funcional, ou seja, por cdigo.
Formato:
!$OMP SECTION
Fortran
block
!$OMP SECTION
block
estrutura de bloco
estrutura de bloco
24
Observaes
1-A diretiva SECTIONS define a seo do cdigo sequncial aonde ser definida as sees
independentes, atravs da diretiva SECTION;
4-Se existirem mais threads do que sees, o OpenMP decidir, quais threads executaro
os blocos de SECTION, e quais, no executaro.
25
Exemplo:
Fortran
PROGRAM VEC_ADD_SECTIONS
INTEGER N, I
PARAMETER (N=1000)
REAL A(N), B(N), C(N)
! Some initializations
DO I = 1, N
A(I) = I * 1.0
B(I) = A(I)
ENDDO
!$OMP SECTIONS
!$OMP SECTION
DO I = 1, N/2
C(I) = A(I) + B(I)
ENDDO
!$OMP SECTION
DO I = 1+N/2, N
C(I) = A(I) + B(I)
ENDDO
END
26
C / C++
#include <omp.h>
#define N 1000
main ()
{
int i, n;
float a[N], b[N], c[N];
/* Some initializations */
for (i=0; i < N; i++)
a[i] = b[i] = i * 1.0;
n = N;
} /* end of sections */
27
Diretiva SINGLE
Diretiva que determina que o cdigo identificado seja executado por somente uma thread
do grupo.
Formato:
estrutura de bloco
28
Exerccio 3
cd ~/curso/openmp/ex4
2 Edite o programa omp_do_for.f ou omp_do_for.c e codifique o que solicitado nas linhas com as setas.
vi omp_do_for.f ou vi omp_do_for.c
ou
pico omp_do_for.f ou pico omp_do_for.c
3 Compilao
4 Execuo
Antes da execuo do programa, ser necessrio especificar o nmero de threads que iro
participar da execuo. Defina um nmero que possa visualizar e entender o resultado, entre 2 e 4.
Ambiente IBM/csh
Ambiente LINUX/bash
29
Exerccio 4
Edite novamente o programa e faa as modificaes necessrias para que o programa execute em
paralelo, somente se, o nmero N for maior que 1000, e o loop paralelo do tipo esttico sem tamanho
definido. Varie o valor de N.
cd ~/curso/openmp/ex5
2 Edite o programa omp_do_for.f ou omp_do_for.c e codifique o que solicitado nas linhas com as setas.
vi omp_do_for.f ou vi omp_do_for.c
ou
pico omp_do_for.f ou pico omp_do_for.c
3 Compilao
4 Execuo
Antes da execuo do programa, ser necessrio especificar o nmero de threads que iro
participar da execuo. Defina um nmero que possa visualizar e entender o resultado, entre 2 e 4.
Ambiente IBM/csh
Ambiente LINUX/bash
30
Exerccio 5
cd ~/curso/openmp/ex6
2 Edite o programa omp_sections.f ou omp_sections.c . Este programa possui na regio paralela, duas
sees que podem ser executadas em threads separadas. Identifique as sees e acrescente as diretivas
threads necessrias.
vi omp_sections.f ou vi omp_sections.c
ou
pico omp_sections.f ou pico omp_sections.c
3 Compilao
4 Execuo
Antes da execuo do programa, ser necessrio especificar o nmero de threads que iro
participar da execuo. Defina um nmero que possa visualizar e entender o resultado, entre 2 e 4.
Ambiente IBM/csh
Ambiente LINUX/bash
31
4.5-Construes Combinadas e Compartilhadas PARALLEL
Formato:
do loop
for loop
32
Exemplo
INTEGER N, I, CHUNK
PARAMETER (N=1000)
PARAMETER (CHUNK=100)
REAL A(N), B(N), C(N)
! Some initializations
DO I = 1, N
A(I) = I * 1.0
B(I) = A(I)
ENDDO
!$OMP PARALLEL DO
!$OMP& SHARED(A,B,C) PRIVATE(I)
!$OMP& SCHEDULE(STATIC,CHUNK)
DO I = 1, N
C(I) = A(I) + B(I)
ENDDO
END
C / C++
#include <omp.h>
#define N 1000
#define CHUNK 100
main () {
int i, n, chunk;
float a[N], b[N], c[N];
/* Some initializations */
for (i=0; i < N; i++)
a[i] = b[i] = i * 1.0;
n = N;
chunk = CHUNK;
33
Exemplo: REDUCTION Produto de vetores
Fortran
PROGRAM DOT_PRODUCT
INTEGER N, CHUNK, I
PARAMETER (N=100)
PARAMETER (CHUNK=10)
REAL A(N), B(N), RESULT
! Some initializations
DO I = 1, N
A(I) = I * 1.0
B(I) = I * 2.0
ENDDO
RESULT= 0.0
!$OMP PARALLEL DO
!$OMP& DEFAULT(SHARED) PRIVATE(I)
!$OMP& SCHEDULE(STATIC,CHUNK)
!$OMP& REDUCTION(+:RESULT)
DO I = 1, N
RESULT = RESULT + (A(I) * B(I))
ENDDO
!$OMP END PARALLEL DO
PRINT *, Final Result= , RESULT
END
C / C++
#include <omp.h>
main () {
int I, n, chunk;
float a[100], b[100], result;
/* Some initializations */
n = 100;
chunk = 10;
result = 0.0;
for (I=0; I < n; I++)
{
a[I] = I * 1.0;
b[I] = I * 2.0;
}
#pragma omp parallel for \
default(shared) private(i) \
schedule(static,chunk) \
reduction(+:result)
for (I=0; I < n; I++)
result = result + (a[I] * b[I]);
printf(Final result= %f\n,result);
34
Observaes e restries do atributo REDUCTION:
Fortran C / C++
x = x operator expr x = x op expr
x = intrinsic(expr, x) x++
++x
--x
x uma varivel escalar da lista x uma varivel escalar da lista
expression uma expresso escalar que no faz expression uma expresso escalar que no
referncia a x faz referncia a x
intrinsic pode ser: MAX, MIN, IAND, IOR, op pode ser: +, *, -, /, &, ^, |, &&, ||
IEOR
binop pode ser: +, *, -, /, &, ^, |
operator pode ser: +, *, -, .AND., .OR., .EQV.,
.NEQV.
35
Diretiva PARALLEL SECTIONS
Diretiva combinada que determina a regio paralela e simultaneamente as sees que cada
thread ir executar. A diretiva SECTIONS tem que vir imediatamente aps a palavra
PARALLEL.
Formato:
cdigo
cdigo
36
Exerccio 6
O objetivo desse exerccio entender como se compila e executa um programa utilizando OpenMP.
O programa omp_prod_vet, simula o produto entre vetores, utilizando o atributo REDUCTION da diretiva
DO/for do OpenMP .
cd ~/curso/openmp/ex2
more omp_prod_vet.f
3 Compilao
4 Execuo
Antes da execuo do programa, ser necessrio especificar o nmero de threads que iro
participar da execuo. No caso desse exerccio, a maneira mais fcil ser definir a varivel de ambiente
OMP_NUM_THREADS.
Ambiente IBM/csh
Ambiente LINUX/bash
37
Exerccio 7
cd ~/curso/openmp/ex7
vi omp_combinado.f ou vi omp_combinado.c
ou
pico omp_combinado.f ou pico omp_combinado.c
3 Compilao
4 Execuo
Antes da execuo do programa, ser necessrio especificar o nmero de threads que iro
participar da execuo. Defina um nmero que possa visualizar e entender o resultado, entre 2 e 4.
Ambiente IBM/csh
Ambiente LINUX/bash
38
4.6-Construes de Sincronizao
Considere o exemplo abaixo no qual duas threads em dois processadores distintos, esto
ambos tentando alterar a varivel x ao mesmo tempo ( x inicialmente 0 ).
THREAD 1: THREAD 2:
increment(x) increment(x)
{ {
x = x + 1; x = x + 1;
} }
THREAD 1: THREAD 2:
10 LOAD A, (x address) 10 LOAD A, (x address)
20 ADD A, 1 20 ADD A, 1
30 STORE A, (x address) 30 STORE A, (x address)
Para contornar essa situao, a alterao do valor de x deve ser sincronizado por entre as
duas threads, para garantir o resultado correto. O OpenMP possui uma variedade de
construes de sincronizao que controla como sera a execuo de cada thread em relao
ao grupo de threads.
39
Diretiva MASTER
Determina a regio que ser executada apenas pela thread mestre do grupo. Todas as outras
threads do grupo pulam essa seo do cdigo.
Formato:
!$OMP MASTER
Fortran cdigo
Diretiva CRITICAL
Determina que a regio do cdigo deva ser executada somente por uma thread de cada vez.
Formato:
Fortran cdigo
Se um thread estiver executando uma regio CRITICAL as outras threads iro bloquear
a execuo quando alcanarem essa regio, e cada uma executar a regio por ordem de
chegada.
40
Exemplo
Fortran
PROGRAM CRITICAL
INTEGER X
X = 0
!$OMP PARALLEL SHARED(X)
!$OMP SECTIONS
!$OMP SECTION
!$OMP CRITICAL
X = X + 1
!$OMP END CRITICAL
!$OMP SECTION
!$OMP CRITICAL
X = X + 1
!$OMP END CRITICAL
C / C++
#include <omp.h>
main()
{
int x;
x = 0;
} /* end of sections */
} /* end of parallel section */
}
41
Exerccio 8
cd ~/curso/openmp/ex8
2 Edite o programa omp_critical.f ou omp_critical.c . Este programa possui na regio paralela, uma
operao que deve ser executada serialmente pelas threads, ou seja, uma de cada vez. Determine qual a
operao e adicione a diretiva apropriada para a execuo correta do programa.
vi omp_critical.f ou vi omp_critical.c
ou
pico omp_critical.f ou pico omp_critical.c
3 Compilao
4 Execuo
Antes da execuo do programa, ser necessrio especificar o nmero de threads que iro
participar da execuo. Defina um nmero que possa visualizar e entender o resultado, entre 2 e 4.
Ambiente IBM/csh
Ambiente LINUX/bash
42
Diretiva BARRIER
Formato:
Quando uma thread executa essa diretiva, ela para de processar e espera por todas as
threads chegarem nessa diretiva. Quando isso acontecer, as threads voltam a processar o
restante do cdigo.
Diretiva ATOMIC
Diretiva que especifica, que imediatamente o prximo endereo de memria, seja atualizado
pontualmente por cada thread, e no simultaneamente por todas as threads. Seria
similar a diretiva CRITICAL.
Formato:
!$OMP ATOMIC
Fortran
expresso
43
Esse comando dever possuir o seguinte formato:
Fortran C / C++
x = x operador expr x binop = expr
x = intrinsica(expr, x) x--
--x
x uma varivel escalar x uma varivel escalar
expresso uma expresso escalar que expresso uma expresso escalar que no faz
no faz referncia a x referncia a x
intrinsica uma funo como: MAX, binop um operador, podendo ser: +, *, -, /, &, ^,
MIN, IAND, IOR, ou IEOR |, >>, or <<
Diretiva FLUSH
Formato:
Essa diretiva necessria para instruir o compilador que as variveis da lista, devem ser lidas
ou escritas do sistema de memria, ou seja, as variveis no podem permanecer nos
registradores locais de cada cpu.
opcional fornecer as variveis que se deseja atualizar os dados, mas se no for feito, todas
as variveis utilizadas no programa sero atualizadas na memria.
44
A ao dessa diretiva implcita em outras diretivas, desde que no seja utilizado o atributo
NOWAIT.
Fortran C / C++
BARRIER barrier
CRITICAL e END CRITICAL critical
ordered
END DO parallel
END PARALLEL for
END SECTIONS sections
END SINGLE single
ORDERED e END ORDERED
Diretiva ORDERED
DO ou PARALLEL DO (Fortran)
for ou parallel for (C/C++)
Formato:
!$OMP ORDERED
(cdigo)
Fortran
!$OMP END ORDERED
(fim do loop)
!$OMP END DO
(fim do loop)
45
4.7-Regras de Operao das Diretivas
A diretiva BARRIER no permitida dentro das regies definidas pelas diretivas DO/for,
ORDERED, SECTIONS, SINGLE, MASTER e CRITICAL;
Qualquer diretiva pode ser executada fora de uma regio definida pela diretiva PARALLEL,
no entanto ser executado apenas pela thread MASTER.
46
Exerccio 9
cd ~/curso/openmp/ex9
2 Edite o programa omp_barrier.f ou omp_barrier.c . Este programa possui um erro durante a execuo.
Tente entender o erro, verifique as regras de utilizao das diretivas OpenMP. Corrija o problema.
vi omp_barrier.f ou vi omp_barrier.c
ou
pico omp_barrier.f ou pico omp_barrier.c
3 Compilao
4 Execuo
Antes da execuo do programa, ser necessrio especificar o nmero de threads que iro
participar da execuo. Defina um nmero que possa visualizar e entender o resultado, entre 2 e 4.
Ambiente IBM/csh
Ambiente LINUX/bash
47
5-Rotinas
O OpenMP padro possui uma biblioteca com rotinas de API (Aplication Program Interface), que
possibilitam uma grande variedade de funes:
5.1-OMP_SET_NUM_THREADS
Esta subrotina/funo determina o nmero de threads que sero utilizadas para a prxima
regio paralela;
Formato:
Esta rotina s pode ser executada na parte serial do cdigo, antes definio de uma regio
paralela.
5.2-OMP_GET_NUM_THREADS
Esta subrotina/funo retorna o nmero de threads que esto sendo utilizadas em uma
regio paralela.
Esta funo tem que ser executada dentro de uma regio paralela.
48
5.3-OMP_GET_MAX_THREADS
Esta subrotina/funo retorna o nmero mximo de threads que o programa pode utilizar.
Esta funo pode ser executada em qualquer parte do programa, na regio serial ou na regio
paralela.
5.4-OMP_GET_THREAD_NUM
Esta subrotina/funo retorna a identificao da thread que est executando, dentro de um
grupo. A identificao ser um numero entre 0 e OMP_GET_NUM_THREADS-1. A
thread mestre do grupo sempre ser identificada como 0.
Se a funo for executada de uma regio paralela recursiva ou da regio serial, o valor
retornado ser 0.
49
Exemplos:
TID = OMP_GET_THREAD_NUM()
PRINT *, 'Hello World from thread = ', TID
...
END
!$OMP PARALLEL
TID = OMP_GET_THREAD_NUM()
PRINT *, 'Hello World from thread = ', TID
...
END
TID = OMP_GET_THREAD_NUM()
PRINT *, 'Hello World from thread = ', TID
!$OMP PARALLEL
...
END
50
5.5-OMP_GET_NUM_PROCS
Esta subrotina/funo retorna o nmero de processadores disponveis para a execuo do
programa.
5.6-OMP_IN_PARALLEL
Esta subrotina/funo pode ser chamada para determinar se uma seo do cdigo est sendo
executada em paralelo, ou no.
Para o Fortran, a funo retorna .TRUE. se for chamada de uma regio que esteja executando
em paralelo, caso contrrio, retornar .FALSE. Para o C/C++, retornar um inteiro diferente
de 0, se for paralelo, caso contrrio, retornar 0.
5.7-OMP_SET_DYNAMIC
Esta subrotina/funo, ativa ou desativa a capacidade do programa de ajustar dinamicamente
(durante a execuo), o nmero de threads disponveis para a execuo de regies
paralelas.
51
5.8-OMP_GET_DYNAMIC
Para o Fortran, esta funo retorna .TRUE. se ajuste dinmico est disponvel.
Para o C/C++, esta funo retorna um valor diferente de 0 se ajuste dinmico est disponvel.
5.9-OMP_SET_NESTED
5.10-OMP_GET_NESTED
52
5.11-OMP_INIT_LOCK
INTEGER(OMP_LOCK_KIND) var
Fortran SUBROUTINE OMP_INIT_LOCK(var)
5.12-OMP_DESTROY_LOCK
5.13-OMP_SET_LOCK
Esta subrotina/funo solicita o bloqueio de uma varivel, ou aguarda que uma varivel
bloqueada esteja disponvel.
53
5.14-OMP_UNSET_LOCK
5.15-OMP_TEST_LOCK
Esta subrotina/funo testa e bloqueia, se uma varivel de bloqueio, est disponvel para ser
bloqueada, mas sem parar a execuo da thread.
54
6-Variveis de Ambiente
So parmetros definidos no ambiente operacional antes da execuo do programa. O
OpenMP possui quatro definies de variveis, que controlam a execuo do cdigo paralelo. O
nome dessas variveis deve vir sempre em letras maisculas.
6.1-OMP_SCHEDULE
O valor dessa varivel determina como as iteraes de um loop so agendadas por entre os
threads. Essa varivel de ambiente utilizada somente para as diretivas DO, PARALLEL
DO (Fortran) e for, parallel for (C/C++).
Exemplos:
6.2-OMP_NUM_THREADS
Exemplos:
6.3-OMP_DYNAMIC
Exemplos:
6.4-OMP_NESTED
Exemplos:
55
Exerccio 10
O objetivo desse exerccio entender a definio das variveis nas diretivas do OpenMP.
cd ~/curso/openmp/ex10
2 Edite o programa omp_erro.f ou omp_erro.c . Este programa produz resultados incorretos. Verifique
como foi definida e utilizada a varivel de reduo na regio paralela.
vi omp_erro.f ou vi omp_erro.c
ou
pico omp_erro.f ou pico omp_erro.c
3 Compilao
4 Execuo
Antes da execuo do programa, ser necessrio especificar o nmero de threads que iro
participar da execuo. Defina um nmero que possa visualizar e entender o resultado, entre 2 e 4.
Ambiente IBM/csh
Ambiente LINUX/bash
56
Exerccio 11
cd ~/curso/openmp/ex11
2 Edite o programa loop.f ou omp_loop.c . Analise as regies com loops e tente acrescentar as diretivas
OpenMP, de maneira que, esses loops sejam executados pro threads.
vi loop.f ou vi loop.c
ou
pico loop.f ou pico loop.c
3 Compilao
4 Execuo
Antes da execuo do programa, ser necessrio especificar o nmero de threads que iro
participar da execuo. Defina um nmero que possa visualizar e entender o resultado, entre 2 e 4.
Ambiente IBM/csh
Ambiente LINUX/bash
57
7-Referncias
SP Parallel Programming II Workshop - "OpenMP".
Maui High Performance Computing Center. 1998.
Introduo ao OpenMP
Fernando Silva
DCC-FCUP
58