Using OpenMP* in your application requires several steps. To use OpenMP, you must do the following:
Add OpenMP directives to your application source code.
Compile the application with -openmp (Linux* and Mac OS* X) or /Qopenmp (Windows*) option.
For applications with large local or temporary arrays, you may need to increase the stack space available at run-time. In addition, you may need to increase the stack allocated to individual threads by using the KMP_STACKSIZE environment variable or by setting the corresponding library routines.
You can set other environment variables for the multi-threaded code execution.
Add the OpenMP API routine declarations to your application by adding a statement similar to the following in your code:
OpenMP directives use a specific format and syntax. Intel Extension Routines to OpenMP* describes the OpenMP extensions to the specification that have been added to the Intel® compiler.
The following syntax illustrates using the directives in your source.
where:
<prefix> - Required for all OpenMP directives. For free form source input, the prefix is !$OMP only; for fixed form source input, the prefix is !$OMP or C$OMP.
<directive> - A valid OpenMP directive. Must immediately follow the prefix; for example: !$OMP PARALLEL.
[<clause>] - Optional. Clauses can be in any order and repeated as necessary, unless otherwise restricted.
[<newline>] - A required component of directive syntax. It precedes the structured block which is enclosed by this directive.
[,]: Optional. Commas between more than one <clause> are optional.
The directives are interpreted as comments if you omit the -openmp (Linux and Mac OS X) or /Qopenmp (Windows*) option.
The OpenMP constructs defining a parallel region have one of the following syntax forms:
Example |
---|
!$OMP <directive> <structured block of code> !$OMP END <directive> or !$OMP <directive> <structured block of code> or !$OMP <directive> |
The following example demonstrates one way of using an OpenMP directive to parallelize a loop.
Example |
---|
subroutine simple_omp(a, N) use omp_lib integer :: N, a(N) !$OMP PARALLEL DO do i = 1, N a(i) = i*2 end do end subroutine simple_omp |
See OpenMP* Examples for more examples on using directives in specific circumstances.
The -openmp (Linux* and Mac OS* X) or /Qopenmp (Windows*) option enables the parallelizer to generate multi-threaded code based on the OpenMP directives in the source. The code can be executed in parallel on single processor, multi-processor, or multi-core processor systems.
The openmp option works with both -O0 (Linux and Mac OS X) and /Od (Windows) and with any optimization level of -O1, -O2 and -O3 (Linux and Mac OS X) or /O1, /O2 and /O3 (Windows).
Specifying -O0 (Linux and Mac OS X) or /Od (Windows) with the OpenMP option helps to debug OpenMP applications.
Compile your application using commands similar to those shown below:
Operating System |
Description |
---|---|
Linux and Mac OS X |
ifort -openmp source_file |
Windows |
ifort /Qopenmp source_file |
Assume that you compile the sample above, using the commands similar to the following, where -c (Linux and Mac OS X) or /c (Windows) instructs the compiler to compile the code without generating an executable:
Operating System |
Example |
---|---|
Linux and Mac OS X |
ifort -openmp -c parallel.f90 |
Windows |
ifort /Qopenmp /c parallel.f90 |
The compiler might return a message similar to the following:
parallel.f90(20) : (col. 6) remark: OpenMP DEFINED LOOP WAS PARALLELIZED.
Configure the OpenMP Environment
Before you run the multi-threaded code, you can set the number of desired threads using the OpenMP environment variable, OMP_NUM_THREADS. See the OpenMP Environment Variables.
Copyright © 1996-2010, Intel Corporation. All rights reserved.