OS X 10.8,llvm,CMake 中的 OpenMP

7

我刚刚升级到OS X 10.8“Mountain Lion”,现在我非常后悔这样做。

我无法再构建使用OpenMP的(简单的)并行代码。

通过寻找资料,我了解到苹果不再使用'gcc'而是使用'llvm' - 很可能是由于许可证相关问题。不幸的是,'llvm'目前不支持OpenMP。

我无法相信基于OpenMP的很多程序将无法在OS X上运行,因此我的问题是:如何在Mountain Lion中启用OpenMP?


阅读了Hristo Iliev的出色答案后,我认为我错过了更多内容。

我没有使用XCode。构建是基于CMake和make / gcc。昨天我通过macports安装了gcc 4.2,但是-截至今天-我的代码仍然处于源代码形式,因为由于某种奇怪的原因,我无法将编译器切换到gcc(与OpenMP相关的相同错误)。

问题现在是CMake仍在使用llvm编译器。 在根CMakeLists.txt中,我添加了以下两行:

set(CMAKE_C_COMPILER "/opt/local/bin/gcc-apple-4.2")  
set(CMAKE_CXX_COMPILER "/opt/local/bin/gcc-apple-4.2")

我还添加了两个环境变量:

export CXX=/opt/local/bin/gcc-apple-4.2
export CC=/opt/local/bin/gcc-apple-4.2

当CMake尝试查找OpenMP(FIND_PACKAGE(OpenMP))时,我会得到以下输出:

-- The compiler is /opt/local/bin/gcc-apple-4.2
-- Try OpenMP C flag = [-fopenmp]
-- Performing Test OpenMP_FLAG_DETECTED
-- Performing Test OpenMP_FLAG_DETECTED - Failed
[...]
CMake Error at /opt/local/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:97 (message):
Could NOT find OpenMP (missing: OpenMP_C_FLAGS OpenMP_CXX_FLAGS)
Call Stack (most recent call first):
/opt/local/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:291    (_FPHSA_FAILURE_MESSAGE)
/opt/local/share/cmake-2.8/Modules/FindOpenMP.cmake:159 (find_package_handle_standard_args)
demo/CMakeLists.txt:8 (FIND_PACKAGE)

我尝试手动运行/opt/local/bin/gcc-apple-4.2,但由于缺少libgomp而失败。
问候。

1
你可以在10.8上简单地安装gcc:https://dev59.com/questions/zWox5IYBdhLWcg3wNRtj - Fls'Zen
1
我找到了那个问题,但它与命令行工具的安装有关。现在我已经看到了安装真正的gcc的答案。谢谢。 - Antonio Sesto
你不需要从macports中添加GCC 4.2,因为它已经随着XCode命令行工具一起提供了。你只需要从GUI中额外安装它们。然而,由于你不使用XCode,我强烈推荐你构建自己的GCC 4.7.2 - 它是最新的版本,支持OpenMP 3.1功能 :) - Hristo Iliev
在开始编译代码之前,我已经安装了XCode及其命令行工具。因此,我认为有一种方法可以切换默认编译器(我将进行检查)。 - Antonio Sesto
如果我忽略那个警告信息并编译mpfr,编译会成功,但是所有的测试(通过make check进行)都会失败,并显示一个荒谬的消息“/User/myuser/lib/gpm/...”:找不到图像。请注意缺少的“s”。正确的文件夹(带有S)和gmp库在各种库加载路径中。 - Antonio Sesto
显示剩余3条评论
2个回答

11
LLVM是一个编译器框架,苹果在OS X中广泛使用它(尤其是在OpenGL实现中),但它本身不是编译器。Xcode中有两个LLVM前端可用-旧的基于GCC的llvm-gcc(支持OpenMP 2.5)和新的clang(不支持OpenMP)。clang具有广泛的静态代码分析能力,尤其是在C++代码中具有更好的错误报告。这主要是苹果正在投资并逐渐远离GCC的原因(另一方面,FreeBSD项目出于纯粹的许可证原因正在寻求用clang替换GCC)。目前有一个名为clomp的项目(不要与Intel的Cluster OpenMP混淆),旨在创建一个OpenMP感知版本的clang,但它还远未成熟。
如果您不需要像显式任务这样的新的OpenMP结构,并且可以容忍一些bugs,则仍然可以使用旧的GCC前端。只需在项目设置中切换编译器套件为LLVM GCC 4.2即可。

Compiler suite chooser

这个版本基于古老的GCC 4.2.1,看起来已经不再开发。如果您需要更新的GCC版本,只需构建一个即可。不幸的是,我无法为您提供如何将其集成到Xcode中的信息。在使用GCC 4.7.1和OS X 10.8.2的命令行上,它对我有效(我很少使用Xcode)。

4

在Hristo的卓越答案上补充一点:你可以通过MacPorts安装gcc。这比手动编译所有内容要简单得多(从头开始编译gcc可能是一个真正非常困难的任务,因为涉及到依赖等问题)。

所以,安装MacPorts,执行“sudo port install gcc47”,等待几个小时,你就会得到能够编译你的OpenMP代码的gcc-mp-4.7。


3
它也可以通过Homebrew获取。 - FreeNickname
6
要使用OpenMP支持,请使用$ brew install gcc --without-multilib - Patrick Gunderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接