2014-11-06 117 views
7

所以我尝试使用OpenMP的最新版本叮当,clang version 3.4.2 (tags/RELEASE_34/dot2-final)之一。其次编译并添加omp.h的路径,然后用我的编译hello.c的程序:使用OpenMP与llvm-clang

clang -fopenmp hello.c 

,然后运行它,它仍然不能使用超过1个线程:

Bash-4.1$ ./a.out 
Hello from thread 0, nthreads 1 

PS:我试图手动导出export OMP_NUM_THREADS=8,但这并没有解决任何问题。有任何想法吗?

UPDATE:这是的hello.c:

#include <omp.h> 
#include <stdio.h> 
int main() { 
#pragma omp parallel 
printf("Hello from thread %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads());} 
+0

请向我们展示'hello.c'的代码。 – Mysticial 2014-11-06 23:29:33

+0

这是@Mysticial – Amir 2014-11-06 23:31:41

+0

为什么不试试#pragma omp parallel num_threads(#noofthreads) – 2014-11-07 19:19:30

回答

4

尽管它有点晚了关于我原来的问题的时间戳,但我想在这里提到答案,至少可以节省人们面对类似问题的时间。

LLVM本身目前不支持Openmp开箱即用。您可以使用Intel Runtime Support编译并运行omp带标记的代码。但是,如果您希望有一个支持OpenMP的干净clang,则可以在OpenMP-Clang的项目树干中进行克隆和构建。目前支持的OpenMP 3.1规范,他们将达到支持的OpenMP 4.0规范推出:

$ 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 

不要忘了建立在此之后,Intel® OpenMP* Runtime Library,因为你需要omp.h/path/to/llvm/projects/openmp/runtime/lin_32e/lib/libomp.so

0

尝试使用omp_set_num_thread()函数设定线程的数目。如果不起作用,请尝试再次设置铛声。

#include <omp.h> 
#include <stdio.h> 
int main() { 
     omp_set_num_threads(4); 
     #pragma omp parallel 
     { 
     printf("Hello from thread %d, nthreads %d\n", omp_get_thread_num(),  omp_get_num_threads()); 
     }  
} 

也可以尝试调用mp_get_max_threads()在并行和串行区域,看看你会得到什么

+0

有趣的是当我执行这个:'clang -g -emit-llvm -S -c -fopenmp hello.c -o hello.ll'我得到这个警告: '铛:警告:编译期间未使用的参数:'-fopenmp',你知道为什么吗? – Amir 2014-11-07 21:53:26

+0

如果你不使用-fopenmp,编译器是否会抛出关于openMP函数的未定义引用的错误。如果没有,库可能默认包含在内 – 2014-11-07 21:59:08

+0

不,我已经在这里执行了这个程序:'http:// openmp。llvm.org /'并安装该库并导出路径。在此之前,我有错误,但现在不再了。 – Amir 2014-11-07 22:02:05

0

我只看到一个线程也是,铿锵声3.8.0版(中继线252425)。我则在https://clang-omp.github.io看一些最近的新闻:

2015年11月27日 - 在 铛的支持OpenMP进一步发展/编译器LLVM搬到www.llvm.org。本网站仅保留 档案用途。感谢所有这些年贡献了所有 的人!

...所以我编译LLVM/Clang从trunk;使用优秀的指令编译OpenMP运行时库here;现在它工作。