Intel® C++ Compiler 16.0 User and Reference Guide

Using the OpenMP* Libraries

This section describes the steps needed to set up and use the OpenMP* Libraries from the command line. On Windows* systems, you can also build applications compiled with the OpenMP libraries in the Microsoft Visual Studio* development environment.

For a summary of the support provided by the libraries provided with Intel compilers, see OpenMP* Source Compatibility and Interoperability with Other Compilers.

For a list of the options and libraries used by the OpenMP* libraries, see OpenMP* Support Libraries.

Set up your environment for access to the Intel® C++ Compiler to ensure that the appropriate OpenMP* library is available during linking. On Windows* systems, you can either execute the appropriate batch (.bat) file or use the command-line window supplied in the compiler program folder that already has the environment set up. On Linux* and OS X* systems, you can source the appropriate script file (compilervars file).

During compilation, ensure that the version of omp.h used when compiling is the version provided by that compiler. For example, use the omp.h provided with gcc when you compile on Linux* systems.

Caution

Be aware that when using the gcc* or Microsoft* compiler, you may inadvertently use inappropriate header/module files. To avoid this, copy the header/module file(s) to a separate directory and put it in the appropriate include path using the -I option.

If a program uses data structures or classes that contain members with data types defined in omp.h file, then source files that use those data structures should all be compiled with the same omp.h file.

The following table lists the commands used by the various command-line compilers for both C and C++ source files.:

Operating System

C Source Module

C++ Source Module

Linux*

gcc
Intel: icc

g++
Intel: icpc

OS X* [prior to v10.9]

gcc
Intel: icc

g++
Intel: icpc

OS X* [v10.9 and later]

clang
Intel: icl (CLANG compiler) oricc (EDG compiler)

clang++
Intel: icl++ (CLANG compiler) oricpc (EDG compiler)

Windows*

Visual C++*: cl
Intel: icl

Visual C++*: cl
Intel: icl

For information on the OpenMP* libraries and options used by the Intel® C++ Compiler, see OpenMP* Support Libraries.

Command-Line Examples, Windows*

To compile and link (build) the entire application with one command using the Compatibility libraries, specify the following Intel® C++ Compiler command:

Type of File

Commands

C source, dynamic link

icl /MD /Qopenmp hello.c

C++ source, dynamic link

icl /MD /Qopenmp hello.cpp

When using the Microsoft* Visual C++* compiler, you should link with the Intel OpenMP compatibility library. You need to avoid linking the Microsoft* OpenMP run-time library (vcomp) and explicitly pass the name of the Intel OpenMP compatibility library as linker options (following /link):

Type of File

Commands

C source, dynamic link

cl /MD /openmp hello.c /link /nodefaultlib:vcomp libiomp5md.lib

C++ source, dynamic link

cl /MD /openmp hello.cpp /link /nodefaultlib:vcomp libiomp5md.lib

You can also use the Intel® C++ Compiler with the Visual C++* compiler to compile parts of the application and create object files (object-level interoperability). In this example, the Intel® C++ Compiler compiles and links the entire application:

Type of File

Commands

C source, dynamic link

cl /MD /openmp /c f1.c f2.c

icl /MD /Qopenmp /c f3.c f4.c

icl /MD /Qopenmp f1.obj f2.obj f3.obj f4.obj /Feapp /link /nodefaultlib:vcomp

The first command produces two object files compiled by Visual C++* compiler, and the second command produces two more object files compiled by the Intel® C++ Compiler. The final command links all four object files into an application.

Alternatively, the third line below uses the Visual C++* linker to link the application and specifies the Compatibility library libiomp5md.lib at the end of the third command:

Type of File

Commands

C source, dynamic link

cl /MD /openmp /c f1.c f2.c

icl /MD /Qopenmp /c f3.c f4.c

link f1.obj f2.obj f3.obj f4.obj /out:app.exe /nodefaultlib:vcomp libiomp5md.lib

The following example shows the use of interprocedural optimization by the Intel® C++ Compiler on several files, the Visual C++* compiler compiles several files, and the Visual C++* linker links the object files to create the executable:

Type of File

Commands

C source, dynamic link

icl /MD /Qopenmp /O3 /Qipo /Qipo-c f1.c f2.c f3.c

cl /MD /openmp /O2 /c f4.c f5.c

cl /MD /openmp /O2 ipo_out.obj f4.obj f5.obj /Feapp /link /nodefaultlib:vcomp libiomp5md.lib

The first command uses the Intel® C++ Compiler to produce an optimized multi-file object file named ipo_out.obj by default (the /Fe option is not required). The second command uses the Visual C++* compiler to produce two more object files. The third command uses the Visual C++* cl command to link all three object files using the Intel® C++ Compiler OpenMP library.

Using Intel OpenMP* Libraries from Visual Studio*

When using systems running Windows*, you can make certain changes in the Visual C++* Visual Studio* development environment to allow you to use the Intel® C++ Compiler and Visual C++* to create applications that use the Intel OpenMP libraries.

Note

Microsoft* Visual C++* must have the symbol _OPENMP_NOFORCE_MANIFEST defined or it will include the manifest for the vcomp90 dlls. While this may not appear to cause a problem on the build system, it will cause a problem when the application is moved to another system that does not have this DLL installed.

Set the project Property Pages to indicate the Intel OpenMP run-time library location:

  1. Open the project's property pages in from the main menu: Project > Properties (or right click the Project name and select Properties) .

  2. Select Configuration Properties > Linker > General > Additional Library Directories.

  3. Enter the path to the Intel® Compiler libraries. For example, for an IA-32 architecture system, enter:

    <Intel_compiler_installation_path>\IA32\LIB

Make the Intel OpenMP dynamic run-time library accessible at run-time; you must specify the corresponding path:

  1. Open the project's property pages in from the main menu: Project > Properties (or right click the Project name and select Properties).

  2. Select Configuration Properties > Debugging > Environment.

  3. Enter the path to the Intel® Compiler libraries. For example, for an IA-32 architecture system, enter:

    PATH=%PATH%;<Intel_compiler_installation_path>\IA32\Bin

Add the Intel OpenMP run-time library name to the linker options and exclude the default Microsoft* OpenMP run-time library:

  1. Open the project's property pages in from the main menu: Project > Properties (or right click the Project name and select Properties).

  2. Select Configuration Properties > Linker > Command Line > Additional Options.

  3. Enter the OpenMP* library name and the Visual C++* linker option, /nodefaultlib.

Command-Line Examples, Linux*

To compile and link (build) the entire application with one command using the Intel OpenMP libraries, specify the following Intel® C++ Compiler command on Linux* platforms:

Type of File

Commands

C source

icc -openmp hello.c

C++ source

icpc -openmp hello.cpp

By default, the Intel® C++ Compiler performs a dynamic link of the OpenMP* libraries. To perform a static link (not recommended), add the option -openmp-link static. The Intel® C++ Compiler option -openmp-link controls whether the linker uses static or dynamic OpenMP* libraries on Linux* and OS X* systems (default is -openmp-link dynamic).

You can also use the Intel® C++ Compiler icc/icpc with gcc/g++ compilers to compile parts of the application and create object files (object-level interoperability).

In this example, gcc compiles the C file foo.c (the gcc option -fopenmp enables OpenMP* support), and the Intel® C++ Compiler links the application using the Intel OpenMP library:

Type of File

Commands

C source

gcc -fopenmp -c foo.c

C++ source

g++ -fopenmp -c foo.cpp

When using gcc or g++ compiler to link the application with the Intel® C++ Compiler OpenMP compatibility library, you need to explicitly pass the Intel OpenMP library name using the -l option, the Linux* pthread library using the -l option, and path to the Intel® libraries where the Intel® C++ compiler is installed using the -L option:

Type of File

Commands

C source

gcc -fopenmp -c foo.c bar.c

gcc foo.o bar.o -liomp5 -lpthread -L<icc_dir>/lib

You can mix object files, but it is easier to use the Intel® C++ Compiler to link the application so you do not need to specify the gcc -l option, -L option, and the -lpthread option:

Type of File

Commands

C source

gcc -fopenmp -c foo.c

icc -openmp -c bar.c (Linux* and OS X*)

icc -openmp foo.o bar.o (Linux* and OS X*)

You can mix OpenMP* object files compiled with gcc, the Intel® C++ Compiler, and the Intel® Fortran Compiler.

Note

You cannot mix object files compiled by the Intel® Fortran compiler and the gfortran compiler.

The table illustrates examples of using the Intel® Fortran compiler or the GNU Fortran compiler to link all the objects:

Type of File

Commands

Mixed C and Fortran sources

icc -openmp -c ibar.c

gcc -fopenmp -c gbar.c

ifort -openmp -c foo.f

ifort -openmp foo.o ibar.o gbar.o

Type of File

Commands

Mixed C and GNU Fortran sources

icc -openmp -c ibar.c

gcc -fopenmp -c gbar.c

gfortran -fopenmp -c foo.f

gfortran foo.o ibar.o gbar.o -lirc -liomp5 -lpthread -lc -L<icc_dir>/lib

Alternatively, you could use the Intel® C++ Compiler to link the application, but need to pass multiple gfortran libraries using the -l options on the link line:

Type of File

Commands

Mixed C and Fortran sources

gfortran -fopenmp -c foo.f

icc -openmp -c ibar.c

icc -openmp foo.o bar.o -lgfortranbegin -lgfortran

Command-Line Examples, OS X*

To compile and link (build) the entire application with one command using the Intel OpenMP libraries, specify the following Intel® C++ Compiler command on OS X* platforms:

Type of File

Commands

C source

icc -openmp hello.c //with EDG compiler

icl -openmp hello.c //with CLANG compiler

C++ source

icpc -openmp hello.cpp //with EDG compiler

icl++ -openmp hello.cpp //with CLANG compiler

By default, the Intel® C++ Compiler performs a dynamic link of the OpenMP* libraries. To perform a static link (not recommended), add the option -openmp-link static. The Intel® C++ Compiler option -openmp-link controls whether the linker uses static or dynamic OpenMP* libraries on Linux* and OS X* systems (default is -openmp-link dynamic).

You can also use the Intel® C++ Compiler icc/icpc/icl with gcc/g++ compilers to compile parts of the application and create object files (object-level interoperability).

Note

Mixed compiling using Intel® C++ Compiler with GCC compilers is possible only on older OS X* platforms. The latest OS X* v10.x platforms do not include the GCC compiler, and the Clang compiler included in the latest OS X* 10.x does not support OpenMP* implementation. Future versions of Clang compiler may support OpenMP* implementation.

In this example, icl oricc compiles the C file foo.c (the option -openmp enables OpenMP* support), and the Intel® C++ Compiler links the application using the Intel OpenMP library:

Type of File

Commands

C source

icc -openmp foo.o //with EDG compiler

icl -openmp foo.o //with CLANG compiler

C++ source

icpc -openmp foo.o //with EDG compiler

icl++ -openmp foo.o //with CLANG compiler

Note

GCC is absent on OS X* v10.9 and later (that is, Xcode 5.x and later). However, you may install GCC along with the Intel® C++ Compiler.

You can mix object files, but it is easier to use the Intel® C++ Compiler to link the application so you do not need to specify the gcc -l option, -L option, and the -lpthread option:

Type of File

Commands

C source

icc -openmp -c bar.c //with EDG compiler

icc -openmp foo.o bar.o //with EDG compiler


icl -openmp -c bar.c //with CLANG compiler

icl -openmp foo.o bar.o //with CLANG compiler

Alternatively, you could use the Intel® C++ Compiler to link the application, but need to pass multiple gfortran libraries using the -l options on the link line:

Type of File

Commands

Mixed C and Fortran sources

icc -openmp -c ibar.c //with EDG compiler

icc -openmp foo.o bar.o -lgfortranbegin -lgfortran //with EDG compiler

icl -openmp -c ibar.c //with CLANG compiler

icl -openmp foo.o bar.o -lgfortranbegin -lgfortran //with CLANG compiler

See Also