Reputation: 191
According to http://blog.llvm.org/2015/05/openmp-support_22.html, OpenMP support in Clang is completed. However, I'm having difficulties trying a simple program.
I've installed Clang/LLVM as explained in http://clang.llvm.org/get_started.html and the OpenMP runtime as explained in http://openmp.llvm.org/.
The test program is:
#include "omp.h"
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
#pragma omp parallel
{
printf("thread %d\n", omp_get_thread_num());
}
return 0;
}
The compilation line is:
clang -lomp -I/.../openmp/runtime/exports/common/include -L/.../openmp/runtime/exports/lin_32e/lib ./test-openmp.c -o ./test-openmp
Using which
, I check I'm using the correct clang binary.
With ldd
, I check I'm linking to the correct OpenMP library:
$ ldd ./test-openmp
linux-vdso.so.1 => (0x00007ffdaf6d7000)
libomp.so => /.../openmp/runtime/exports/lin_32e/lib/libomp.so (0x00007f7d47552000)
libc.so.6 => /lib64/libc.so.6 (0x00007f7d47191000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f7d46f8d000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f7d46d71000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7d477fb000)
But when running, it executes only one thread:
$ OMP_NUM_THREADS=4 ./test-openmp
thread 0
The reason I'm linking with lomp
is because if I link with fopenmp
, the code is wrongly linked to the gcc omp library. However in that case, the result is the same:
$ clang -fopenmp -I/.../openmp/runtime/exports/common/include -L/.../openmp/runtime/exports/lin_32e/lib ./test-openmp.c -o ./test-openmp
$ ldd ./test-openmp
linux-vdso.so.1 => (0x00007ffdf351f000)
libgomp.so.1 => /lib64/libgomp.so.1 (0x00007fbc1c3e1000)
librt.so.1 => /lib64/librt.so.1 (0x00007fbc1c1d9000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbc1bfbd000)
libc.so.6 => /lib64/libc.so.6 (0x00007fbc1bbfc000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbc1c5f8000)
$ OMP_NUM_THREADS=4 ./test-openmp
thread 0
When using gcc, it works as expected:
$ gcc -fopenmp ./test-openmp.c -o ./test-openmp
$ ldd ./test-openmp
linux-vdso.so.1 => (0x00007ffc444e0000)
libgomp.so.1 => /lib64/libgomp.so.1 (0x00007f7d425ce000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f7d423b2000)
libc.so.6 => /lib64/libc.so.6 (0x00007f7d41ff1000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7d427e5000)
$ OMP_NUM_THREADS=4 ./test-openmp
thread 0
thread 2
thread 3
thread 1
I've used in the past the implementation described in http://clang-omp.github.io/ and I know that one works (a different repo is presented there for Clang and LLVM, but the OpenMP repo is the same). However that page was (apparently) updated in 2014, and the blog in http://blog.llvm.org/2015/05/openmp-support_22.html is from May 2015, which makes you think that you can use the latest Clang/LLVM for OpenMP.
So my question is, am I missing something or the blog from May 2015 is actually referring to Clang/LLVM implementation from in http://clang-omp.github.io and not to the latest one?
Thanks
Upvotes: 2
Views: 684
Reputation: 424
Adding -fopenmp=libomp should do the trick.
This is a temporary situation; hopefully, soon clang will be changed to do what is described in the blog post.
Yours, Andrey
Upvotes: 5