• Nenhum resultado encontrado

OpenMP. Um método de paralelização para as linguagens Fortran, C, C++ para shared memory systems.

N/A
N/A
Protected

Academic year: 2021

Share "OpenMP. Um método de paralelização para as linguagens Fortran, C, C++ para shared memory systems."

Copied!
17
0
0

Texto

(1)

OpenMP

Um método de paralelização para as linguagens

Fortran, C, C++ para shared memory systems.

Directivas para o compilador

Threads

Biblioteca de rotinas

Variáveis de ambiente

entidade que pode executar de

f o r m a i n d e p e n d e n t e u m

conjunto de instruções

B. Chapman, G. Jost, R. van der Pas

Using OpenMP, MIT Press 2008

(2)

Multiplicação Matriz-Vector

M

ik

V

k

= A

i

i

k

Paralelização segundo i

(3)

PROGRAM matriz_vector IMPLICIT NONE

INTEGER n, m, memstat REAL start, finish

DOUBLE PRECISION, DIMENSION (:), ALLOCATABLE :: vec, a DOUBLE PRECISION, DIMENSION (:,:), ALLOCATABLE :: mat PRINT *, " M(n,m) V(m) = A(m) "

PRINT *, " Valores para m, n >>>" READ(*,*) n, m

ALLOCATE( mat(n,m), STAT=memstat )

IF ( memstat /= 0) STOP " Erro na alocação de M " ALLOCATE( vec(m), STAT=memstat )

IF ( memstat /= 0) STOP " Erro na alocação de V " ALLOCATE( a(m), STAT=memstat )

IF ( memstat /= 0) STOP " Erro na alocação de A " PRINT *, " Inicialização da matriz M e vector V" mat = 1

vec = 1

PRINT *, " M * V" CALL CPU_TIME(start)

CALL mat_vect( n, m, mat, vec, a ) CALL CPU_TIME(finish)

PRINT *, " Tempo Mat*Vec = ", finish-start, “ seg” PRINT *, " Finaliza"

IF ( ALLOCATED(mat) ) DEALLOCATE( mat, STAT=memstat ) IF ( ALLOCATED(vec) ) DEALLOCATE( vec, STAT=memstat ) IF ( ALLOCATED(a) ) DEALLOCATE( a, STAT=memstat ) END PROGRAM matriz_vector

SUBROUTINE mat_vect( n, m, mat, vec, x )

IMPLICIT NONE

INTEGER, INTENT(IN) :: n, m

DOUBLE PRECISION, DIMENSION (n,m), INTENT(IN) :: mat

DOUBLE PRECISION, DIMENSION (m), INTENT(IN) :: vec

DOUBLE PRECISION, DIMENSION (m), INTENT(INOUT) :: x

! ... Variáveis Locais

INTEGER i, j

DO i = 1, n

x(i) = 0

DO j = 1, m

x(i) = x(i) + mat(i,j)*vec(j)

END DO

END DO

(4)

SUBROUTINE mat_vect( n, m, mat, vec, x )

IMPLICIT NONE

INTEGER, INTENT(IN) :: n, m

DOUBLE PRECISION, DIMENSION (n,m), INTENT(IN) :: mat

DOUBLE PRECISION, DIMENSION (m), INTENT(IN) :: vec

DOUBLE PRECISION, DIMENSION (m), INTENT(INOUT) :: x

! ... Variáveis Locais

INTEGER i, j

!$OMP PARALLEL DO

DEFAULT(none)

&

!$OMP SHARED(n,m,mat,vec,x) PRIVATE(i,j)

DO i = 1, n

x(i) = 0

DO j = 1, m

x(i) = x(i) + mat(i,j)*vec(j)

END DO

END DO

!$OMP END PARALLEL DO

END SUBROUTINE mat_vect

#pragma omp parallel for default(none) \

shared(n,m,mat,vec,x) private(i,j)

for( i = 1; i <= n; i++)

{ x(i) = 0;

for( j = 1; j <= m; j++)

x(i) = x(i) + mat(i,j)*vec(j)

}

(5)

!$OMP PARALLEL DO DEFAULT(none) &

!$OMP SHARED(n,m,mat,vec,x) PRIVATE(i,j)

DO i = 1, n

x(i) = 0

!$OMP PARALLEL DO DEFAULT(none) &

!$OMP SHARED(x,mat,vec,i) PRIVATE(j)

DO j = 1, m

x(i) = x(i) + mat(i,j)*vec(j)

END DO

!$OMP END PARALLEL DO

END DO

!$OMP END PARALLEL DO

!$OMP PARALLEL DO DEFAULT(none) &

!$OMP SHARED(n,m,mat,vec,x) PRIVATE(i)

DO i = 1, n

x(i) = SUM(mat(i,:)*vec(:))

END DO

(6)

Tempos Execução (3000 x 3000):

Série: (somátorios) 0.175

(SUM) 0.126

Paralelo (2 Threads): (somatórios) 0.196

(2 ciclos) 0.219

(SUM) 0.136

(7)

PROGRAM pi_s USE omp_lib IMPLICIT NONE

INTEGER n, i, n_threads REAL start, finish

DOUBLE PRECISION w, s, x, pi

DOUBLE PRECISION, PARAMETER :: ZERO = 0, ONE = 1, HALF = 0.5 DOUBLE PRECISION, EXTERNAL :: f

READ(*,*) n n_threads = 1 pi = ZERO

w = ONE/DBLE(n) CALL CPU_TIME(start)

!$OMP PARALLEL PRIVATE(x,s)

!$ n_threads = omp_get_num_threads() s = ZERO !$OMP DO DO i = 1, n x = w*( DBLE(i) - HALF) s = s + f(x) END DO !$OMP END DO !$OMP CRITICAL pi = pi + w*s !$OMP END CRITICAL

!$OMP END PARALLEL

CALL CPU_TIME(finish)

PRINT *, n, pi

PRINT *, " T Exec. = ", finish-start PRINT *, " # Threads = ", n_threads END PROGRAM pi_s

FUNCTION f(x) IMPLICIT NONE

DOUBLE PRECISION, INTENT(IN) :: x DOUBLE PRECISION f

!...

DOUBLE PRECISION, PARAMETER :: FOUR = 4, ONE = 1 f = FOUR / (ONE + x*x)

END FUNCTION f

(8)

!$OMP PARALLEL DEFAULT(none) &

!$OMP SHARED(pi,w,n,n_threads) PRIVATE(i,x,s)

!$ n_threads = omp_get_num_threads()

s = ZERO

!$OMP DO

DO i = 1, n

x = w*( DBLE(i) - HALF)

s = s + f(x)

END DO

!$OMP END DO

!$OMP CRITICAL

pi = pi + w*s

!$OMP END CRITICAL

!$OMP END PARALLEL

!$OMP PARALLEL PRIVATE(x,s)

!$ n_threads = omp_get_num_threads()

s = ZERO

!$OMP DO

DO i = 1, n

x = w*( DBLE(i) - HALF)

s = s + f(x)

END DO

!$OMP END DO

!$OMP CRITICAL

pi = pi + w*s

!$OMP END CRITICAL

!$OMP END PARALLEL

!$OMP PARALLEL DEFAULT(none) &

!$OMP SHARED(w,n,n_threads) PRIVATE(i,x,s), reduction(+:pi)

!$ n_threads = omp_get_num_threads()

s = ZERO

pi = ZERO

!$OMP DO

DO i = 1, n

x = w*( DBLE(i) - HALF)

s = s + f(x)

END DO

!$OMP END DO

pi = pi + w*s

!$OMP END PARALLEL

(9)
(10)
(11)
(12)

Problema

du

dt

= f(t, u)

u(t = 0) = u

0

Procurar solução para 0 ≤ t ≤ T

du

dt

(t) ≈

u(t + ∆t)

− u(t)

∆t

u(t + ∆t)

≈ u(t) + ∆t f(t, u(t))

(13)

Método de 2ª ordem:

du

dt

= f(t, u(t))

u(t + ∆t) = u(t) + ∆t u

!

(t) +

2

2

u

!!

(t)

u

!

(t + ∆t) = u

!

(t) + ∆t u

!!

(t) +

2

2

u

!!!

(t)

∆t u

!!

(t) = u

!

(t + ∆t) − u

!

(t) + +O(∆t

2

)

∆t u

!!

(t) = u

!

(t) − u

!

(t − ∆t) + +O(∆t

2

)

u(t + ∆t) = u(t) + ∆t f (t, u(t)) +

∆t

2

[f(t, u(t)) − f(t − ∆t, u(t − ∆t)]

u(t + ∆t) = u(t) +

∆t

2

[3f(t, u(t)) − f(t − ∆t, u(t − ∆t)] + O(∆t

3

)

u(t + ∆t) = u(t) +

∆t

(14)

Método de 2ª ordem

Considere

f (t, u) = u

u

0

,

u

1

= u

0

+ ∆t,

u

n+1

= A u

n

+ B u

n

−1

,

A = 1 +

3∆t

2

,

B =

∆t

2

Cálculos Independentes

u

n+1

= u((n + 1)∆t) = u

n

+

t

n+1

− t

n

2

!

f (t

n

, u

n

) + f(t

n+1

, 2u

n

− u

n+1

)

"

(15)

1

0

0 0 0 · · ·

−1

1

0 0 0 · · ·

−B −A

1 0 0 · · ·

0 −B −A 1 0 · · ·

...

...

... ... ... ···

u

0

u

1

u

2

u

3

...

=

0

∆t

0

0

...

Resolução de Sistema Linear

(I + A)u = B

u =

I

I +

A

B = B

− AB + A

2

B

(16)

Ler B

u = B

||B|| ≤ Erro

B =

−AB

u = u + B

Stop

Sim

Não

Multiplicação Matriz Vector

Soma Vectores

Norma Vector

(17)

Escreva o programa para resolver o problema de condições

formulado usando OpenMP e efectue medidas do

speedup=( Tempo Execução Paralela)/(Tempo Execução Série)

e da eficiência paralela = speedup/Thread. Ao executar o

programa considere T = 1 e utilize valores do intervalo de tempo

de 0.01 e 0.001. Compare a solução numérica com a solução

exacta obtida por integração directa da equação diferencial.

Referências

Documentos relacionados

Os estudos originais encontrados entre janeiro de 2007 e dezembro de 2017 foram selecionados de acordo com os seguintes critérios de inclusão: obtenção de valores de

celebrar e testemunhar a Fé da Igreja. Este é também o Programa da Comunidade de Santa Maria dos Olivais. Enquanto Pároco de Santa Maria dos Olivais, no contexto da definição do

Mestrado em: Nutrição Humana ou Nutrição Clínica ou Saúde Coletiva ou Ciências da Saúde ou Ciências ou Saúde ou Alimentos e Nutrição e Desenvolvimento na

A tabela a seguir resume as frequências em que os pacientes apresentaram pelo menos uma reação adversa não solicitada, foi registrada dentro de 28 dias após a vacinação de

Penalidades: suspensão imediata da conduta vedada, quando for o caso; multa no valor de R$ 5.320,50 a R$ 106.410,00 aos agentes responsáveis, aos partidos políticos, às

Experiência docente no ensino superior na Faculdade de Odontologia da Universidade de São Paulo lecionando Dentistica desde 1971; no Instituto Metodista de Ensino Superior

e-MEC: 201809423 Parecer: CNE/CES 124/2020 Relatora: Marilia Ancona Lopez Interessada: INACI Associação de Ensino - São Paulo/SP Assunto: Recurso contra a decisão da Secretaria

O objetivo desse trabalho foi propor a elaboração de iogurte sabor acerola com laranja e avaliar a aceitação desse produto lácteo entre consumidores adolescentes e adultos