17.11.2014 Views

practicals

practicals

practicals

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Introduction to<br />

OpenMP exercises<br />

Slide 1<br />

ECMWF


Class Exercise 1<br />

Experiment with SCHEDULE clause<br />

subroutine work(k,a,b,c)<br />

real*8 a(k),b(k),c(k)<br />

!$OMP PARALLEL DO SCHEDULE(STATIC) PRIVATE(I)<br />

do i=1,k<br />

c(i)=a(i)*exp(b(i))<br />

enddo<br />

!$OMP END PARALLEL DO<br />

return<br />

end<br />

Use files omptest7.F and<br />

ompjob7<br />

Try …<br />

(STATIC)<br />

(DYNAMIC)<br />

(DYNAMIC,100)<br />

(DYNAMIC,1000)<br />

(GUIDED)<br />

Which is the best<br />

for this loop?<br />

Slide 2<br />

ECMWF


Class Exercise 2<br />

subroutine work(k,A,UNIQUE)<br />

integer*8 k,A(k),unique<br />

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!<br />

! Calculate how many integers in array A are !<br />

! unique and return via integer arg UNIQUE. !<br />

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!<br />

return<br />

end<br />

Use files unique.F and uniquejob<br />

Slide 3<br />

ECMWF


Class Exercise 2 (one solution)<br />

subroutine work(k,a,unique)<br />

integer*8 k,a(k),b(k),unique<br />

b(:)=0<br />

!$OMP PARALLEL DO PRIVATE(I)<br />

do i=1,k<br />

b(a(i))=1<br />

enddo<br />

!$OMP END PARALLEL DO<br />

unique=sum(b)<br />

return<br />

end<br />

Slide 4<br />

ECMWF


Class Exercise 2 (recommended solution)<br />

subroutine work(k,a,unique)<br />

integer*8 k,a(k),unique<br />

integer*4,allocatable :: b(:)<br />

allocate(b(k))<br />

b(:)=0<br />

!$OMP PARALLEL DO PRIVATE(I)<br />

do i=1,k<br />

b(a(i))=1<br />

enddo<br />

!$OMP END PARALLEL DO<br />

unique=sum(b)<br />

deallocate(b)<br />

return<br />

end<br />

Slide 5<br />

ECMWF


Class Exercise 3<br />

The program md.F implements a simple molecular dynamics<br />

simulation in continuous real space. The velocity Verlet algorithm<br />

is used to implement the time stepping. The force and energy<br />

computations can be performed in parallel, as can the time<br />

integration. No knowledge of the application or science involved<br />

are required – the above was just to scare you)<br />

3.1 Use OpenMP directives to parallelise the time integration loop<br />

3.2 Use OpenMP directives to parallelise the computation of forces<br />

and energies loop nest<br />

Use files md.F and mdjob<br />

Slide 6<br />

ECMWF


Class Exercise 3.1 (md.F)<br />

! The time integration is fully parallel<br />

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!<br />

! SAFE TO ADD OPENMP DIRECTIVES FOR THIS LOOP !<br />

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!<br />

do i = 1,np<br />

do j = 1,nd<br />

pos(j,i) = pos(j,i) + vel(j,i)*dt + 0.5*dt*dt*a(j,i)<br />

vel(j,i) = vel(j,i) + 0.5*dt*(f(j,i)*rmass + a(j,i))<br />

a(j,i) = f(j,i)*rmass<br />

enddo<br />

enddo<br />

Slide 7<br />

ECMWF


Class Exercise 3.2 (md.F)<br />

! The computation of forces and energies is fully parallel.<br />

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!<br />

! SAFE TO ADD OPENMP DIRECTIVES FOR THIS LOOP !<br />

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!<br />

do i=1,np<br />

! compute potential energy and forces<br />

f(1:nd,i) = 0.0<br />

do j=1,np<br />

if (i .ne. j) then<br />

call dist(nd,box,pos(1,i),pos(1,j),rij,d)<br />

pot = pot + 0.5*v(d)<br />

do k=1,nd<br />

f(k,i) = f(k,i) - rij(k)*dv(d)/d<br />

enddo<br />

endif<br />

enddo<br />

! compute kinetic energy<br />

kin = kin + dotr8(nd,vel(1,i),vel(1,i))<br />

enddo<br />

Slide 8<br />

ECMWF


3.1 solution<br />

!$omp parallel do private(i,j)<br />

do i = 1,np<br />

do j = 1,nd<br />

pos(j,i) = pos(j,i) + vel(j,i)*dt + 0.5*dt*dt*a(j,i)<br />

vel(j,i) = vel(j,i) + 0.5*dt*(f(j,i)*rmass + a(j,i))<br />

a(j,i) = f(j,i)*rmass<br />

enddo<br />

enddo<br />

!$omp end parallel do<br />

Slide 9<br />

ECMWF


3.2 solution<br />

!$omp parallel do private(i,j,k,rij,d)&<br />

!$omp& reduction(+ : pot, kin)<br />

do i=1,np<br />

! compute potential energy and forces<br />

f(1:nd,i) = 0.0<br />

do j=1,np<br />

if (i .ne. j) then<br />

call dist(nd,box,pos(1,i),pos(1,j),rij,d)<br />

pot = pot + 0.5*v(d)<br />

do k=1,nd<br />

f(k,i) = f(k,i) - rij(k)*dv(d)/d<br />

enddo<br />

endif<br />

enddo<br />

! compute kinetic energy<br />

kin = kin + dotr8(nd,vel(1,i),vel(1,i))<br />

enddo<br />

!$omp end parallel do<br />

Slide 10<br />

ECMWF

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!