View on GitHub

OpenMP®/Clang

An implementation of the OpenMP C/C++ language extensions in Clang/LLVM compiler

Development activity of OpenMP support in clang/llvm compiler has moved to www.llvm.org. Please get OpenMP-enabled clang (OpenMP 3.1 is fully supported in clang/llvm 3.7) and contribute to its further development there. This web-site is maintained for archival purposes only.

The OpenMP (Open Multi-Processing) specification is a standard for a set of compiler directives, library routines, and environment variables that can be used to specify shared memory parallelism in Fortran and C/C++ programs.

This project implements OpenMP support in the Clang C language family front-end for the LLVM compiler. The current scope of the project is to support the OpenMP 4.0 specification.

News

November 27, 2015 - Further development of OpenMP support in clang/llvm compiler moved to www.llvm.org. This site is maintained for archival purposes only. Thank you to everyone who contributed all these years!
September 9, 2014 - Upgrade to clang/LLVM 3.5, updated link to LLVM OpenMP library.
June 10, 2014 - Initial support of omp teams distribute [simd],omp target teams distribute [simd],omp teams distribute parallel for [simd]and omp target teams distribute parallel for [simd] directives (just parsing and semantic analysis).
June 9, 2014 - Initial support of omp target data,omp target updateand omp target teams directives (just parsing and semantic analysis).
May 6, 2014 - Initial support of omp target, teams, distribute, distribute simd, distribute for, distribute parallel for, distribute parallel for simd and omp declare targetdirectives (no actual offloading, just parsing and semantic analysis).
April 11, 2014 - Added support of omp cancel and omp cancellation pointdirectives.
March 14, 2014 - Added support of depend clause in omp taskdirective, support for omp parallel for simd directive.
February 6, 2014 - Upgrade to clang/llvm 3.4.
December 6, 2013 - Added support of variable length arrays in OpenMP constructs.
November 25, 2013 - Added support of omp simd, omp declare reduction directives.
September 27, 2013 - Added support of proc_bind clause.
August 23, 2013 - Initial release.

Try OpenMP/Clang

Getting the source code

$ git clone https://github.com/clang-omp/llvm
$ git clone https://github.com/clang-omp/compiler-rt llvm/projects/compiler-rt
$ git clone -b clang-omp https://github.com/clang-omp/clang llvm/tools/clang

The source code structure follows Clang/LLVM: http://llvm.org/docs/GettingStarted.html.
To run (rather than just compile) code you need to get and build an Intel® OpenMP* Runtime Library.

Also you can try to use trunk-based version of the compiler (supported by Hal Finkel)

$ git clone https://github.com/clang-omp/llvm_trunk llvm
$ git clone https://github.com/clang-omp/compiler-rt_trunk llvm/projects/compiler-rt
$ git clone https://github.com/clang-omp/clang_trunk llvm/tools/clang

Building

To build clang with OpenMP support just follow the clang/LLVM compiler's standard build procedure (see Getting Started: Building and Running Clang).

Using

To use the newly installed compiler, add the following to your environment. On Mac OS X, replace LD_LIBRARY_PATH with DYLD_LIBRARY_PATH.

export PATH=/install/prefix/bin:$PATH
export C_INCLUDE_PATH=/install/prefix/include:<OpenMP include path>:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/install/prefix/include:<OpenMP include path>:$CPLUS_INCLUDE_PATH
export LIBRARY_PATH=/install/prefix/lib:<OpenMP library path>:$LIBRARY_PATH
export LD_LIBRARY_PATH=/install/prefix/lib:<OpenMP library path>:$LD_LIBRARY_PATH

When you build a program that uses OpenMP directives, add the following options to enable OpenMP support and link to the runtime library.

-fopenmp

Using clang-omp with Xcode

Instructions are provided by Sebastian Stenzel.

  1. Install clang-omp using homebrew: brew install llvm.
  2. Add llvm binaries to your path using : echo 'export PATH="/usr/local/opt/llvm/bin:$PATH"' >> ~/.bash_profile.
  3. Create a new Xcode project.
  4. Under Build Settings
    • Add a new user-defined setting CC with the value /usr/local/bin/clang-omp
    • Add -fopenmp to Other C Flags
    • Add /usr/local/include to Header Search Paths
    • Set Enable Modules (C and Objective-C) to No.
  5. Under Build Phases
    • Add /usr/local/lib/libiomp5.dylib to Link Binary With Libraries
Done. You can now #include <libiomp/omp.h> and start using #pragma omp ... in your source code.

A simple example

Confirm that the compiler is working correctly by saving the above code to a file.

$ clang -fopenmp hello.c -o hello
$ ./hello

Compilation should proceed with no errors or warnings.

Execute the output ./hello. You should see more than one “Hello” line with different thread numbers. Note that the lines may be mixed together. If you see only one, try setting the environment variable OMP_NUM_THREADS to some number (say 4) and try again.

If you would like to see performance impact, you can try to compile and execute a more complex example Matrices Multiplication.

Contribute

We welcome contributions of all kinds: patches, code reviews, testing and bug reports.

However, as any other open source project, we have to maintain some level of control to prevent complete chaos and keep a single architectural direction. You can send your patches here for review and commit; also, we are very open with granting commit access rights to recognized members of Clang/LLVM community.

We plan eventually to contribute this OpenMP implementation to the Clang trunk, where it will be governed by existing Clang/LLVM community development policies.

Status

Full support for OpenMP 3.1 and most of OpenMP 4.0 features (except for offloading) are implemented. This implementation relies on the Intel OpenMP API, and should be used along with Intel® OpenMP* Runtime Library that supports that API (available from www.openmprtl.org).

The following openly available OpenMP test suites pass:

Supported platforms

OS: Linux or Mac OS X
Architecture: x86, x86-64, PowerPC, Arm

Important Note

Please note that this is a preliminary version. While everything is carefully tested and works fine, there are known internal design quality issues. We plan to refactor some parts of the code before submitting them to Clang trunk. And yes, any help with this would be appreciated!

Among known design issues are:

Also, please note that this development is based on latest released clang (3.5), not what is currently under development in clang trunk.

External Projects

External projects based on OpenMP implementation hosted here. If you want your project to be listed, please let us know.

License

LLVM, Clang, and Compiler-rt are distributed under LLVM's the University of Illinois/NCSA Open Source License. In addition to the "UIUC" BSD-Style license license, the runtime library component of LLVM (Compiler_rt) is also licensed under the MIT License. For details, including information about third-party components, see LICENSE.txt in the code repositories.

Contact

If you would like to report a bug, or make a feature request, you can submit an issue in Github here.