Difference between revisions of "How to Use OpenMP"
Line 61: | Line 61: | ||
|} | |} | ||
− | In order to define specific places, OMP_PLACES can be set to <code><lowerbound>:<length>:<stride></code>. | + | In order to define specific places by an interval, OMP_PLACES can be set to <code><lowerbound>:<length>:<stride></code>. |
+ | All of these three value are non-negative integers and must not exceed your system's bounds. The value of <code><lowerbound></code> can be a single place, or a place that holds several hardware threads. | ||
+ | |||
+ | You can also determine these places with a comma-separated list. Say there are 8 cores available with one hardware thread each, and you would like to execute your application on the first four cores, you could define <code>$ export OMP_PLACES={0, 1, 2, 3}</code>. |
Revision as of 07:35, 5 April 2018
Basics
This will give you a general overview of how to compile and execute a program that has been parallelized with OpenMP. As opposed to MPI, you do not have to load any modules to use OpenMP.
How to Compile OpenMP Code
Additional compiler flags tell the compiler to enable OpenMP. Otherwise, the OpenMP pragmas in the code will be ignored by the compiler.
Depending on which compiler you have loaded, use one of the flags below to compile your code.
Compiler | Flag |
GNU | -fopenmp |
Intel | -openmp |
Oracle | -xopenmp |
For example: if you plan to use an Intel compiler for your OpenMP code written in C, you have to type this to create an application called "omp_code.exe":
$ icc -fopenmp omp_code.c -o omp_code.exe
How to Run an OpenMP Application
Setting OMP_NUM_THREADS
If you forget to set OMP_NUM_THREADS to any value, the default value of your cluster environment will be used. In most cases, the default is 1, so that your program is executed serially.
One way to specify the number of threads is by passing an extra argument when running the executable file. In order to start the parallel regions of the example program above with 12 threads, you'd have to type:
$ OMP_NUM_THREADS=12 ./omp_code.exe
This automatically sets the environment variable OMP_NUM_THREADS to 12, but it is reset to its default value after the execution of "omp_code.exe" finished.
Another way to set the number of threads is by changing your environment variable. This example will increment it up to 24 threads and override the default value:
$ export OMP_NUM_THREADS=24
If you simply run your application with $ ./omp_code.exe
next, this value will be used automatically.
Thread Pinning
Threads are "pinned" by setting certain OpenMP-related environment variables. It is an advanced way to control how your system distributes the threads across the available cores, with the purpose of improving the performance of your application or avoiding costly memory accesses by keeping the threads close to each other.
OMP_PLACES is employed to specify places on the machine where the threads are put. However, this variable on its own does not determine thread pinning completely, because your system still won't know in what pattern to assign the threads to the given places. Therefore, you also need to set OMP_PROC_BIND.
OMP_PROC_BIND specifies a binding policy which basically sets criteria by which the threads are distributed.
OMP_PLACES
This variable can hold two kinds of values: a name specifying (hardware) places, or a list that marks places.
Abstract name | Meaning |
threads |
a place is a single hardware thread, i. e. the hyperthreading will be ignored |
cores |
a place is a single core with its corresponding amount of hardware threads |
sockets |
a place is a single socket |
In order to define specific places by an interval, OMP_PLACES can be set to <lowerbound>:<length>:<stride>
.
All of these three value are non-negative integers and must not exceed your system's bounds. The value of <lowerbound>
can be a single place, or a place that holds several hardware threads.
You can also determine these places with a comma-separated list. Say there are 8 cores available with one hardware thread each, and you would like to execute your application on the first four cores, you could define $ export OMP_PLACES={0, 1, 2, 3}
.