首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenMP与clang结合使用

OpenMP与clang结合使用
EN

Stack Overflow用户
提问于 2015-10-26 22:54:25
回答 4查看 45.2K关注 0票数 24

我在使用clang编译OpenMP代码( 3.6和3.8ToT)时遇到了问题。

我跟踪了这篇博文22.html,但问题是编译后的程序只在一个线程上执行。我使用的是ubuntu15.04 x64,我安装了libgomp和libiopmp,并使用以下命令编译代码:

代码语言:javascript
运行
复制
clang test.c -o test -fopenmp -L/usr/lib/gcc/x86_64-linux-gnu/5.1.1

当我使用gcc的时候,一切都很好:gcc test.c -o test -fopenmp

我也试着运行export LD_LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5.1.1:$LD_LIBRARY_PATH,但是没有帮助。`

有什么建议吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-10-27 01:45:31

更新

构建LLVM/Clang (clang-3.8)的最新主干,安装libiomp5,并指定gomp头文件的位置。请注意,用于libiomp5的Ubuntu包并不完全正确,因此您需要在/usr/lib /liBiop5.so/usr/lib/libip5.so.5中添加/usr/lib中的符号链接。

代码语言:javascript
运行
复制
./clang++ -I/usr/lib/gcc/x86_64-linux-gnu/4.9/include -fopenmp=libiomp5 -o test test.cpp

我在LinuxMint17.2上使用g++-5.1和clang++-3.6 (本质上是Ubuntu信任的),下面的代码显示了相同的结果。

代码语言:javascript
运行
复制
#include <iostream>
#include <omp.h>
int main() {
    #pragma omp parallel num_threads(4)
    {
        #pragma omp critical
        std::cout << "tid = " << omp_get_thread_num() << std::endl;
    }
}

在ltrace下运行此操作会发现以下问题:

g++

代码语言:javascript
运行
复制
$ g++ -fopenmp -o test test.cpp
$ ./test
tid = 0
tid = 3
tid = 2
tid = 1
$ ltrace ./test
__libc_start_main(0x400af6, 1, 0x7ffc937b8198, 0x400bc0 <unfinished ...>
_ZNSt8ios_base4InitC1Ev(0x6021b1, 0xffff, 0x7ffc937b81a8, 5)   = 0
__cxa_atexit(0x4009f0, 0x6021b1, 0x602090, 0x7ffc937b7f70)     = 0
GOMP_parallel(0x400b6d, 0, 4, 0 <unfinished ...>
GOMP_critical_start(0, 128, 0, 0)                              = 0
tid = 3
tid = 2
omp_get_thread_num(0x7f9fe13894a8, 1, 0, 0x493e0)              = 0
_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(0x6020a0, 0x400c44, 0, 0x493e0) = 0x6020a0
_ZNSolsEi(0x6020a0, 0, 0x7f9fe1a03988, 0x203d2064)             = 0x6020a0
_ZNSolsEPFRSoS_E(0x6020a0, 0x400920, 0x7f9fe1a03988, 0 <unfinished ...>
_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_(0x6020a0, 0x400920, 0x7f9fe1a03988, 0) = 0x6020a0
<... _ZNSolsEPFRSoS_E resumed> )                               = 0x6020a0
GOMP_critical_end(0x7f9fe0d2d400, 0x7f9fe0d2e9e0, 0, -1)       = 0
tid = 1
tid = 0
<... GOMP_parallel resumed> )                                  = 0
_ZNSt8ios_base4InitD1Ev(0x6021b1, 0, 224, 0x7f9fe0d2df50)      = 0x7f9fe1a08940
+++ exited (status 0) +++

嘎吱声

代码语言:javascript
运行
复制
$ clang++ -fopenmp -o test test.cpp
$ ./test
tid = 0
$ ltrace ./test
__libc_start_main(0x4009a0, 1, 0x7ffde4782538, 0x400a00 <unfinished ...>
_ZNSt8ios_base4InitC1Ev(0x6013f4, 0x7ffde4782538, 0x7ffde4782548, 5) = 0
__cxa_atexit(0x400830, 0x6013f4, 0x6012c8, 0x7ffde4782310)     = 0
_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(0x6012e0, 0x400a84, 0x7ffde4782548, 6) = 0x6012e0
omp_get_thread_num(0x7f3e4698c006, 0x7f3e4698c000, 0x7f3e46764988, 1024) = 0
_ZNSolsEi(0x6012e0, 0, 0x7f3e46764988, 1024)                   = 0x6012e0
_ZNSolsEPFRSoS_E(0x6012e0, 0x4007a0, 0x7f3e46764988, 0 <unfinished ...>
_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_(0x6012e0, 0x4007a0, 0x7f3e46764988, 0) = 0x6012e0
tid = 0
<... _ZNSolsEPFRSoS_E resumed> )                               = 0x6012e0
_ZNSt8ios_base4InitD1Ev(0x6013f4, 0, 224, 0x7f3e45886f50)      = 0x7f3e46769940
+++ exited (status 0) +++

您可以立即看到问题: clang++从不调用GOMP_parallel,因此您总是得到一个线程。这是嘎嘎的疯狂行为。你试过建造和使用clang的“特殊”OpenMP版本吗?

票数 12
EN

Stack Overflow用户

发布于 2015-10-28 20:09:29

一些补充意见:

1)您需要使用-fopenmp=libomp在clang中启用OpenMP。-fopenmp只是链接libgomp,却忽略了所有的语用。奇怪,我知道.很快就会在后备箱里换衣服的。

2) 3.7是支持OpenMP的第一个版本。3.6不能。

( 3) clang只能与libomp一起工作。不要把libgomp (标题或库)放在libomp的方式!clang使用Intel,不受libgomp的支持。-fopenmp=libomp应该链接正确的库。

票数 23
EN

Stack Overflow用户

发布于 2017-03-19 13:35:54

我让它在LinuxMint17.2上工作。(实质上是Ubuntu 14.04),包括:

软件包:libiomp dev clang-3.8

编译标志:-fopenmp

链接器标志:-fopenmp=libiomp5

现在它编译并使用多个线程。

下面是修改后的FindOpenMP.cmake

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33357029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档