2012 8 7 1 / 52
MPI Hello World I ( ) Hello World II ( ) I ( ) II ( ) ( sendrecv) π ( ) MPI fortran C wget http://www.na.scitec.kobe-u.ac.jp/ yaguchi/riken2012/enshu2.zip unzip enshu2.zip 2 / 52
FORTRAN 3 / 52
MPI program main use mpi mpif.h i m p l i c i t none integer : : nprocs, myrank, i e r r c a l l m p i i n i t ( i e r r ) MPI c a l l mpi comm size (MPI COMM WORLD, nprocs, i e r r ) c a l l mpi comm rank (MPI COMM WORLD, myrank, i e r r ) c a l l m p i f i n a l i z e ( i e r r ) MPI end program main myrank fortran/template.f90 4 / 52
mpi init(ierr) MPI mpi comm size(mpi COMM WORLD,nprocs,ierr) nprocs MPI COMM WORLD MPI COMM WORLD mpi comm rank(mpi COMM WORLD,myrank,ierr) myrank MPI COMM WORLD mpi finalize(ierr) MPI 5 / 52
Hello World! hello world from hello world myrank hello world from 0 hello world from 2 hello world from 3 hello world from 1 mpifrtpx hello. f90 pjsub job. sh./a.out 6 / 52
Technical Computing Suite 1 2 3 4. / a. out 7 / 52
#!/bin/sh #PJM -L rscgrp=school #PJM -L node=8 #PJM -L elapse=3:00 #PJM -j school = mpiexec n 4. / a. out fortran/job.sh 8 / 52
pjsub p j s t a t pjdel Hello World pjsub job. sh [INFO] PJM 0000 pjsub Job 1057 submitted. 1057 job.sh.oxxxx XXXX hello world 9 / 52
mpi send(buff,count,datatype,dest,tag,comm,ierr) buff: count: datatype: MPI CHARACTER, MPI INTEGER, MPI DOUBLE PRECISION dest: tag: 0 comm: MPI COMM WORLD ierr: 10 / 52
mpi recv(buff,count,datatype,source,tag,comm,status,ierr) buff: count: datatype: MPI CHARACTER, MPI INTEGER, MPI DOUBLE PRECISION source: tag: comm: MPI COMM WORLD status: MPI STATUS SIZE. ierr: 11 / 52
Hello World (Part II) 0 0 hello world from 16 myrank hello world from 2 hello world from 3 hello world from 1 12 / 52
mpi wtime() double precision mpi barrier c a l l mpi barrier (MPI COMM WORLD, i e r r ) time0 = mpi wtime ( ) c a l l mpi barrier (MPI COMM WORLD, i e r r ) time1 = mpi wtime ( ) time1-time0 0 mpi barrier(comm,ierr) comm 13 / 52
mpi send 0 0 mpi wtime 1, 2, 4 n n p i [(i n)/p + 1, ((i + 1) n)/p] 14 / 52
program main use mpi i m p l i c i t none integer : : i, nprocs, myrank, i e r r integer, parameter : : n=10000 double precision : : v ( n ), w( n ) double precision : : res c a l l m p i i n i t ( i e r r ) c a l l mpi comm size (MPI COMM WORLD, nprocs, i e r r ) c a l l mpi comm rank (MPI COMM WORLD, myrank, i e r r ) do i=1,n v(i) = dsin(i*0.1d0) w(i) = dcos(i*0.1d0) end do res = 0.0d0 do i=1,n res = res + v(i)*w(i) end do p r i n t, res c a l l m p i f i n a l i z e ( i e r r ) end program main fortran/innerproduct.f90 15 / 52
reduction mpi reduce(sendbuff, recvbuff, count, datatype, op, root, comm, ierr) sendbuff: recvbuff: count: datatype: MPI DOUBLE PRECISION op: MPI SUM, MPI PROD, MPI MAX, MPI MIN root: comm: ierr: 16 / 52
allreduce mpi allreduce(sendbuff, recvbuff, count, datatype, op, comm, ierr) mpi reduce sendbuff: recvbuff: count: datatype: MPI DOUBLE PRECISION op: MPI SUM, MPI PROD, MPI MAX, MPI MIN root: ( ) comm: ierr: 17 / 52
broadcast mpi bcast(buff, count, datatype, root, comm, ierr) root buff buff buff: root count: datatype: MPI DOUBLE PRECISION root: comm: ierr: 18 / 52
mpi reduce 0 mpi bcast 0 mpi allreduce 19 / 52
send/recv mpi isend(buff,count,datatype,dest,tag,comm,request,ierr) mpi send mpi wait/mpi waitall buff: count: datatype: MPI CHARACTER, MPI INTEGER, MPI DOUBLE PRECISION dest: tag: comm: MPI COMM WORLD request: ierr: 20 / 52
mpi irecv(buff,count,datatype,source,tag,comm,request,ierr) mpi isend mpi wait/mpi waitall buff: count: datatype: MPI CHARACTER, MPI INTEGER, MPI DOUBLE PRECISION source: tag: comm: MPI COMM WORLD request: ierr: 21 / 52
mpi wait(request, status, ierr) isend/irecv request: status: isend ierr: mpi waitall(count, request, status, ierr) isend/irecv count: request: status: isend (MPI STATUS SIZE, ). ierr: 22 / 52
mpi sendrecv(sendbuff, sendcount, sendtype, dest, sendtag, recvbuff, recvcount, recvtype, source, recvtag, comm, status, ierr) sendbuff: sendcount: sendtype: MPI DOUBLE PRECISION dest: source sendtag: recvbuff: recvcount: recvtype: MPI DOUBLE PRECISION source: dest recvtag: comm: status: ierr: 23 / 52
a isend irecv, wait, waitall a sendrecv a hint: 0 1 1-myrank 24 / 52
program main use mpi i m p l i c i t none integer : : i, nprocs, myrank, i e r r integer, parameter : : n=10 integer : : a ( n ) c a l l m p i i n i t ( i e r r ) c a l l mpi comm size (MPI COMM WORLD, nprocs, i e r r ) c a l l mpi comm rank (MPI COMM WORLD, myrank, i e r r ) do i =1,n a ( i ) = i + myrank 10 end do do i =1,n p r i n t, myrank, i, a ( i ) end do c a l l m p i f i n a l i z e ( i e r r ) end program main fortran/swap.f90 25 / 52
π MPI Init 26 / 52
program pi i m p l i c i t none integer, parameter : : n = 1000000 integer : : i double precision : : x, dx, p dx = 1.0d0 / dble ( n ) p = 0.0d0 do i = 1,n x = dble ( i ) dx p = p + 4.0d0 / ( 1. 0 d0 + x 2) dx end do p r i n t, p end program fortran/pi.f90 27 / 52
C 28 / 52
MPI #include mpi. h i n t main ( i n t argc, char argv ) { i n t nprocs, myrank ; M P I I n i t (&argc,&argv ) ; MPI Comm size (MPI COMM WORLD,&nprocs ) ; MPI Comm rank (MPI COMM WORLD,&myrank ) ; mpi.h MPI MPI Finalize ( ) ; return 0; } MPI myrank c/template.c 29 / 52
MPI Init(&argc, &argv) MPI MPI Comm size(mpi COMM WORLD, &nprocs) nprocs MPI COMM WORLD MPI COMM WORLD MPI Comm rank(mpi COMM WORLD, &myrank) myrank MPI COMM WORLD MPI Finalize() MPI 30 / 52
Hello World! hello world from hello world myrank hello world from 0 hello world from 2 hello world from 3 hello world from 1 mpifccpx hello. c pjsub job. sh./a.out 31 / 52
Technical Computing Suite 1 2 3 4. / a. out 32 / 52
#!/bin/sh #PJM -L rscgrp=school #PJM -L node=8 #PJM -L elapse=3:00 #PJM -j school = mpiexec n 4. / a. out fortran/job.sh 33 / 52
pjsub p j s t a t pjdel Hello World pjsub job. sh [INFO] PJM 0000 pjsub Job 1057 submitted. 1057 job.sh.oxxxx XXXX hello world 34 / 52
int MPI Send(void * buff, int count, MPI Datatype datatype, int dest, int tag, MPI Comm comm) buff: count: datatype: MPI CHAR, MPI INT, MPI DOUBLE dest: tag: 0 comm: MPI COMM WORLD 35 / 52
int MPI Recv(void *buff, int count, MPI Datatype datatype, int source, int tag, MPI Comm comm, MPI Status *status) buff: count: datatype: MPI CHAR, MPI INT, MPI DOUBLE source: tag: comm: MPI COMM WORLD status: 36 / 52
Hello World (Part II) 0 0 hello world from 16 myrank hello world from 2 hello world from 3 hello world from 1 #include string. h char s t r [ 1 7 ] ; strcpy ( str, hello world from ) ; strcpy ( str, ) ; 37 / 52
double MPI Wtime() double MPI Barrier MPI Barrier (MPI COMM WORLD) time0 = MPI Wtime ( ) MPI Barrier (MPI COMM WORLD) time1 = MPI Wtime ( ) time1-time0 0 int MPI Barrier(comm) comm 38 / 52
MPI Send 0 0 MPI Wtime 1, 2, 4 n n p i [(i n)/p, ((i + 1) n)/p 1] 39 / 52
#include mpi. h #include stdio. h #include math. h i n t main ( i n t argc, char argv ) { i n t i, nprocs, myrank ; const i n t n=10000; double v [ n ], w[ n ] ; double res ; M P I I n i t (&argc,&argv ) ; MPI Comm size (MPI COMM WORLD,&nprocs ) ; MPI Comm rank (MPI COMM WORLD,&myrank ) ; for(i=0;i n;i++){ v[i] = sin(i*0.1); w[i] = cos(i*0.1); } res = 0.0; for(i=0;i n;i++){ res = res + v[i]*w[i]; } p r i n t f ( %f \n, res ) ; MPI Finalize ( ) ; return 0; } c/innerproduct.c 40 / 52
reduction int MPI Reduce(void *sendbuff, void *recvbuff, int count, MPI Datatype datatype, MPI Op op, int root, MPI Comm comm) sendbuff: recvbuff: count: datatype: MPI DOUBLE op: MPI SUM, MPI PROD, MPI MAX, MPI MIN root: comm: 41 / 52
allreduce int MPI Allreduce (void *sendbuff, void *recvbuff, int count, MPI Datatype datatype, MPI Op op, MPI Comm comm) mpi reduce sendbuff: recvbuff: count: datatype: MPI DOUBLE op: MPI SUM, MPI PROD, MPI MAX, MPI MIN root: ( ) comm: 42 / 52
broadcast int MPI Bcast( void *buff, int count, MPI Datatype datatype, int root, MPI Comm comm ) root buff buff buff: root count: datatype: MPI DOUBLE root: comm: 43 / 52
MPI Reduce 0 MPI Bcast 0 MPI Allreduce 44 / 52
Send/Recv int MPI Isend(void *buff, int count, MPI Datatype datatype, int dest, int tag, MPI Comm comm, MPI Request *request) MPI Send MPI Wait/MPI Waitall buff: count: datatype: MPI DOUBLE dest: tag: comm: MPI COMM WORLD request: 45 / 52
int MPI Irecv(void *buff, int count, MPI Datatype datatype, int source, int tag, MPI Comm comm, MPI Request *request) MPI Isend MPI Wait/MPI Waitall buff: count: datatype: MPI DOUBLE source: tag: comm: MPI COMM WORLD request: 46 / 52
int MPI Wait(MPI Request *request, MPI Status *status) isend/irecv request: status: isend int MPI Waitall(int count, MPI Request request[], MPI Status status[]) isend/irecv count: request: status: isend. 47 / 52
int MPI Sendrecv(void *sendbuff, int sendcount, MPI Datatype sendtype, int dest, int sendtag, void *recvbuff, int recvcount, MPI Datatype recvtype, int source, int recvtag, MPI Comm comm, MPI Status *status) sendbuff: sendcount: sendtype: MPI DOUBLE dest: source sendtag: recvbuff: recvcount: recvtype: MPI DOUBLE source: dest recvtag: comm: status: 48 / 52
a Isend Irecv, Wait, Waitall a Sendrecv a hint: 0 1 1-myrank 49 / 52
#include mpi. h #include stdio. h # include math. h i n t main ( i n t argc, char argv ) { i n t i, nprocs, myrank ; const i n t n=10; i n t a [ n ] ; M P I I n i t (&argc,& argv ) ; MPI Comm size (MPI COMM WORLD,&nprocs ) ; MPI Comm rank (MPI COMM WORLD,&myrank ) ; for ( i =0; i <n ; i ++){ a [ i ] = i + myrank 10; } for ( i =0; i <n ; i ++){ p r i n t f ( %d, %d, %d \n, myrank, i, a [ i ] ) ; } MPI Finalize ( ) ; return 0; } c/swap.c 50 / 52
π MPI Init 51 / 52
#include stdio.h i n t main ( i n t argc, char argv ) { const i n t n=1000000; i n t i ; double x, dx, p ; dx = 1. 0 / ( double ) n ; p = 0. 0 ; for ( i =0; i <n ; i ++){ x = ( double ) i dx ; p = p + 4.0 / (1 + x x ) dx ; } p r i n t f ( %16.14 f \n, p ) ; return 0; } c/pi.c 52 / 52