#Fortran
Copy this into the file hello_threads.F
(make sure you use a capital .F
).
program main
#ifdef _OPENMP
use omp_lib
#endif
implicit none
integer thread_id
integer num_threads
print *,"I am the main thread."
C$OMP PARALLEL PRIVATE(thread_id, num_threads)
#ifdef _OPENMP
thread_id = omp_get_thread_num()
num_threads = omp_get_num_threads()
#else
thread_id = 0
num_threads = 1
#endif
print *,"Hello. I am thread ",thread_id," out of a team of ",
. num_threads
C$OMP END PARALLEL
print *,"Here I am, back to the main thread."
end
This example uses two OpenMP functions;
omp_get_num_threads()
: Returns the number of threads in the OpenMP thread team.omp_get_thread_num()
: Returns the identifying number of the thread in the team.
Note that using these functions requires you to use the omp_lib
Fortran library. To ensure portability (if OpenMP is not supported) we hide this header file behind an #ifdef _OPENMP
guard, and manually set the values of num_threads
and thread_id
if _OPENMP
is not set.
This example uses a slightly modified omp parallel
line. In this case, private(nthreads, thread_id)
is added to specify that each thread should have its own copy of the nthreads
and thread_id
variables.
You can compile this program using one of these commands (choose one for the compiler you wish to use);
- gfortran :
gfortran -fopenmp hello_threads.F -o hello_threads
- ifort :
ifort -openmp hello_threads.F -o hello_threads -cxxlib-icc
- pgf77 :
pgf77 -mp hello_threads.F -o hello_threads
This will produce the executable, hello_threads
.