2012 5 24 scalar
Open MP Hello World Do (omp do) (omp workshare) (shared, private) π (reduction)
PU PU PU 2 16 OpenMP FORTRAN/C/C++ MPI
OpenMP 1997 FORTRAN Ver. 1.0 API 1998 C/C++ Ver. 1.0 API 2000 FORTRAN Ver 2.0 API 2002 C/C++ Ver 2.0 API 2005 FORTRAN C/C++ Ver 2.5 API 2008 FORTRAN C/C++ Ver 3.0 API
OpenMP Fork Join Fork Join
OpenMP FORTRAN/C/C++ FORTRAN!$omp! $omp parallel omp get num threads() OMP NUM THREADS
Hello World 48 enshu-openmp1 mkdir enshu openmp1 cd enshu openmp1 emacs hello.f90 program hello world i m p l i c i t none p r i n t, Hello World! end program
TORQUE Resource Manager 1 2 3 4. / a. out PU./a.out
PU default 48 1 64 OpenMP #!/bin/bash #PBS -N jobname #PBS -l nodes=1 l #PBS -l ncpus=1 #PBS -q default #PBS -j oe cd /home/ username / enshu openmp1 / export OMP NUM THREADS=1 ncpus. / a. out hello.sh
qsub qstat RequestID R: Q: Job id Name User Time Use S Queue 5.localhost hello world yaguchi 0 R default qdel qstat RequestID Hello World qsub hello. sh 168.magny-cours.localdomain 168 RequestID.o?? RequestID Hello World! cat
OpenMP Hello World Hollow World program hello world i m p l i c i t none integer :: omp get thread num!$omp parallel p r i n t, My id is, omp get thread num(), Hello World!!$omp end parallel end program pgf95 -mp hello. f90 hello.sh ncpus, OMP NUM THREADS qsub hello. sh
!$omp parallel!$omp end parallel OMP NUM THREADS omp get thread num() program hello i m p l i c i t none!$omp parallel!$omp end parallel end program OK
program main i m p l i c i t none!$omp parallel!$omp end parallel end program
PARALLEL ID 0 OMP NUM THREADS 1 END PARALLEL
Work-Sharing Work Share Work-Sharing DO!$OMP DO,!$OMP END DO!$OMP SECTIONS,!$OMP END SECTIONS FORTRAN!$OMP WORKSHARE,!$OMP END WORKSHARE a ( 1 : n ) = a ( 1 : n ) + 1!$OMP SINGLE,!$OMP END SINGLE Work-Sharing Work-Sharing!$OMP MASTER,!$OMP END MASTER
DO!$omp do program main implicit none integer, parameter :: SP = kind(1.0) integer, parameter :: DP = selected real kind(2*precision(1.0 SP)) real(dp), dimension(100000) :: a, b integer :: i!$omp parallel!$omp do do i=1,100000 DO b(i) = a(i)!$omp!$omp!$omp end parallel end program do i=1,50000 b(i) = a(i) do i=50001,100000 b(i) = a(i)
omp do 1, 2 omp get wtime omp get wtime, time0, time1 time0=omp get wtime() time1=omp get wtime()!$omp parallel!$omp end parallel time1 - time0 time0=omp get wtime ( )! $omp parallel!! $omp end parallel time1=omp get wtime ( ) p r i n t, time1 time0
program axpy i m p l i c i t none integer, parameter : : SP = kind ( 1. 0 ) integer, parameter : : DP = selected real kind (2 precision ( 1. 0 SP ) ) real (DP), dimension (100000) : : x, y, z real (DP ) : : a integer : : i!! a x y!! $omp parallel! $omp do do i = 1, 100000 z ( i ) = a x ( i ) + y ( i ) z = a x + y! $omp! $omp end parallel!!! end program
#!/bin/bash #PBS -N jobname #PBS -l nodes=1 #PBS -l ncpus=2 #PBS -q default #PBS -j oe cd /home/username/enshu-openmp1/ for opn in 1 2 opn do do export OMP NUM THREADS=$opn opn. / a. out done /tmp/openmp1/jscript.sh cp /tmp/openmp1/jscript.sh./
!$omp parallel do do parallel do!$omp parallel!$omp do do i=1,100000 b(i) = a(i)!$omp!$omp end parallel!$omp end parallel do!$omp parallel do do i=1,100000 b(i) = a(i)!$omp end parallel do
omp do program i n v l i m p l i c i t none integer, parameter : : n = 100 integer, dimension ( n ) : : a integer : : i a ( 1 ) = 0! $omp parallel do do i =2,n a ( i ) = a ( i 1) + 1! $omp end parallel do p r i n t, a ( n ) end program do i=1,50 a(i) = a(i-1) + 1 do i=51,100 a(i) = a(i-1) + 1 a(50)
do do!$omp parallel do OMP NUM THREADS do i =1,100 x ( i ) = a x ( i 1) + b
omp workshare!$omp parallel!$omp do do i=1,100000 z(i) = a x(i) + y(i)!$omp!$omp end parallel!$omp parallel!$omp workshare z(:) = a x(:) + y(:)!$omp end workshare!$omp end parallel (!$omp end workshare ) FORTRAN matmul!$omp workshare C = matmul(a, B)!$omp end workshare workshare
do i=1,100! do something i i do i=1,50! do something do i=51,100! do something
! $omp parallel do do i=1,100 do j=1,100!! do something!! $omp end parallel do i j C FORTRAN shared private!$omp parallel do default(none) shared(a, b) private(i,j,k)
a b a 0 b private / shared 9 1 8 2 7 3 6 4 5 5 4 6 3 7 2 8 1 9 0 10 1 9 2 0 3 7 4 0 5 5 6 0 7 3 8 0 9 1 10 0 sum of b : 25
program swap i m p l i c i t none integer, parameter : : SP = kind ( 1. 0 ) integer, parameter : : DP = selected real kind (2 precision ( 1. 0 SP ) ) integer, parameter : : n = 10 integer : : i, tmp integer, dimension ( n ) : : a, b! do i =1,n a ( i ) = n i b ( i ) = i!! $omp parallel do shared, private do i =1,n tmp = a ( i ) i f (mod( i,2)==0) then tmp = 0 end i f a ( i ) = b ( i ) b ( i ) = tmp! $omp end parallel do! write ( 6, (2 i4 ) ) ( a ( i ), b ( i ), i =1,n ) write ( 6, ( a11, i4 ) ) sum of b :, sum( b ) end program /tmp/openmp1/swap.f90
c = 0.0 DP do i =1,n c = c + a ( i ) b ( i ) c c
+,,.and.,.or., max, min c = 0.0 DP! $omp parallel do reduction(+:c) do i =1,n c = c + a ( i ) b ( i )! $omp end parallel do c +
π omp parallel, omp do, omp parallel do shared, private, reduction result.txt yaguchi mail yaguchi < result. t x t
program pi i m p l i c i t none integer, parameter : : SP = kind ( 1. 0 ) integer, parameter : : DP = selected real kind (2 precision ( 1. 0 SP ) ) integer, parameter : : n = 1000000 integer : : i real (DP) : : x, dx, p dx = 1.0 DP / r eal ( n, DP) p = 0.0 DP do i = 1,n x = real ( i, DP) dx p = p + 4.0 DP / ( 1. 0 DP + x 2) dx p r i n t, p end program
jobname.o????,???? mail yaguchi < jobname.o???? #!/bin/bash #PBS -N jobname #PBS -l nodes=1 #PBS -l ncpus=4 #PBS -q default #PBS -j oe cd /home/ username / enshu openmp1 / for opn in 1 2 4 do export OMP NUM THREADS=$opn. / a. out done cat pi.f90 /tmp/openmp1/shukudai.sh
OpenMP (1), (2), (3) http://www.cc.kyushu-u.ac.jp/scp/system/library/openmp/openmp.html. C OpenMP http://www.cc.u-tokyo.ac.jp/publication/kosyu/03/kosyu-openmp c.pdf. OpenMP - CPU 2009. Barbara Chapman, Gabriele Jost and Ruud van der Pas (Foreword by David J. Kuck). Using OpenMP Portable Shared Memory Parallel Programming, The MIT Press, 2007.