Clang/LLVM OpenMP 程序不产生线程

jan*_*742 2 openmp llvm clang

根据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;
}
Run Code Online (Sandbox Code Playgroud)

编译行是:

clang -lomp -I/.../openmp/runtime/exports/common/include -L/.../openmp/runtime/exports/lin_32e/lib ./test-openmp.c -o ./test-openmp
Run Code Online (Sandbox Code Playgroud)

使用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)
Run Code Online (Sandbox Code Playgroud)

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

$ OMP_NUM_THREADS=4 ./test-openmp
thread 0
Run Code Online (Sandbox Code Playgroud)

我链接的原因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
Run Code Online (Sandbox Code Playgroud)

使用 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
Run Code Online (Sandbox Code Playgroud)

我过去曾使用过http://clang-omp.github.io/ 中描述的实现,并且我知道一个可行(这里为 Clang 和 LLVM 提供了不同的存储库,但 OpenMP 存储库是相同的)。然而,该页面(显然)在 2014 年更新,而http://blog.llvm.org/2015/05/openmp-support_22.html 中的博客是 2015 年 5 月的,这让您认为您可以使用最新的 Clang /LLVM 用于 OpenMP。

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

谢谢

小智 5

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

这是暂时的情况;希望很快,clang 将更改为执行博客文章中描述的操作。

你的,安德烈