Clang / LLVM OpenMP程序不会产生线程

时间:2015-07-27 21:55:25

标签: clang llvm openmp

根据http://blog.llvm.org/2015/05/openmp-support_22.html,Clang中的OpenMP支持已完成。但是,我在尝试一个简单的程序时遇到了困难。

我按照http://clang.llvm.org/get_started.html中的说明安装了Clang / LLVM,并按http://openmp.llvm.org/中的说明安装了OpenMP运行时。

测试程序是:

#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;
}

编译行是:

clang -lomp -I/.../openmp/runtime/exports/common/include -L/.../openmp/runtime/exports/lin_32e/lib ./test-openmp.c -o ./test-openmp

使用which,我使用正确的clang二进制文件检查我。

使用ldd,我会检查我是否链接到正确的OpenMP库:

$ 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)

但是在运行时,它只执行一个线程:

$ OMP_NUM_THREADS=4 ./test-openmp
thread 0

我与lomp关联的原因是因为如果我与fopenmp链接,则代码与gcc omp库错误地链接。但在这种情况下,结果是一样的:

$ 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

使用gcc时,它按预期工作:

$ 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

我在过去使用http://clang-omp.github.io/中描述的实现,我知道有一个工作(Clang和LLVM有不同的repo,但OpenMP repo是相同的)。然而,该页面(显然)在2014年更新,http://blog.llvm.org/2015/05/openmp-support_22.html中的博客是从2015年5月开始的,这使您认为可以使用最新的Clang / LLVM for OpenMP。

所以我的问题是,我是否遗漏了某些内容,或者2015年5月的博客实际上是指http://clang-omp.github.io中的Clang / LLVM实现,而不是最新的?

由于

1 个答案:

答案 0 :(得分:4)

添加-fopenmp = libomp应该可以解决问题。

这是暂时的情况;希望很快,clang将被改为做博客文章中描述的内容。

此致, 安德烈