2014-11-06 122 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;現在它工作。