C Fortran 77 PROGRAM HELLO C Serial Region (master thread of an MPI rank) C MPI Parameters INCLUDE 'mpif.h' INTEGER RANK, SIZE, IERROR, LEN CHARACTER*30 NAME C OpenMP Parameters integer ID, NTHREADS INTEGER OMP_GET_THREAD_NUM, OMP_GET_NUM_THREADS C All ranks initiate the message-passing environment. C Each rank obtains information about itself and its environment. C Start MPI. CALL MPI_INIT(IERROR) C Get number of ranks. CALL MPI_COMM_SIZE(MPI_COMM_WORLD, SIZE, IERROR) C Get rank. CALL MPI_COMM_RANK(MPI_COMM_WORLD, RANK, IERROR) C Get run-host name. CALL MPI_GET_PROCESSOR_NAME(NAME,LEN,IERROR) C Master thread obtains information about itself and its environment. C Get number of threads. NTHREADS = OMP_GET_NUM_THREADS() C Get thread. ID = OMP_GET_THREAD_NUM() PRINT *, 'SERIAL REGION: Runhost:', NAME, ' Rank:', RANK, & ' of ', SIZE, 'ranks, Thread:', ID, ' of ', NTHREADS, & ' thread hello, world' C Open parallel region. C Each thread obtains information about itself and its environment. C$OMP PARALLEL PRIVATE(NAME,ID,NTHREADS) CALL MPI_COMM_SIZE(MPI_COMM_WORLD, SIZE, IERROR) CALL MPI_COMM_RANK(MPI_COMM_WORLD, RANK, IERROR) CALL MPI_GET_PROCESSOR_NAME(NAME,LEN,IERROR) NTHREADS = OMP_GET_NUM_THREADS() ID = OMP_GET_THREAD_NUM() C$OMP CRITICAL PRINT *, 'PARALLEL REGION: Runhost:', NAME, ' Rank:', RANK, & ' of ', SIZE, 'ranks, Thread:', ID, ' of ', NTHREADS, & ' threads hello, world' C$OMP END CRITICAL C$OMP END PARALLEL C Close parallel region. C Serial Region (master thread) PRINT *, 'SERIAL REGION: Runhost:', NAME, ' Rank:', RANK, & ' of ', SIZE, 'ranks, Thread:', ID, ' of ', NTHREADS, & ' thread hello, world' C Exit master thread. C Terminate MPI. CALL MPI_FINALIZE(IERROR) END