7

我刚刚升级到 OS X 10.8 “Mountain Lion”,我开始后悔这样做了。

我不再能够构建使用 OpenMP 的(简单)并行代码。

通过到处查看,我了解到 Apple 不再使用“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 而失败。

问候

4

2 回答 2

11

LLVM 是 Apple 在 OS X 中广泛使用的编译器框架(尤其是在 OpenGL 实现中),而不是编译器本身。Xcode 中有两个可用的 LLVM 前端——旧的基于 GCC 的前端llvm-gcc(支持 OpenMP 2.5)和新的clang(不支持 OpenMP)。clang具有广泛的静态代码分析功能和更好的错误报告,尤其是 C++ 代码。这主要是 Apple 投资它并远离 GCC 的原因(另一方面,FreeBSD 项目出于纯粹与许可证相关的原因,正在寻求用 clang 替换 GCC)。有一个正在进行的项目clomp(不要与英特尔的 Cluster OpenMP 混淆)试图创建一个支持 OpenMP 的版本clang,但它还远未成熟。

如果您不需要像显式任务这样的新 OpenMP 结构并且可以忍受一些错误,您仍然可以使用旧的 GCC 前端。只需将项目设置中的编译器套件切换到 LLVM GCC 4.2:

编译器套件选择器

这个基于真正古老的 GCC 4.2.1,似乎不再开发。如果您需要更新版本的 GCC,只需构建一个. 不幸的是,我无法为您提供有关如何将其集成到 Xcode 中的信息。它适用于我在 GCC 4.7.1 和 OS X 10.8.2 的命令行上(而且我不太使用 Xcode)。

于 2013-02-28T20:59:36.853 回答
4

只需在 Hristo 的优秀答案中添加几句话:您可以通过 MacPorts 安装 gcc。这比手动编译所有东西要简单得多(并且由于依赖关系等原因,从头开始编译 gcc 可能真的很重要)。

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

于 2013-03-02T05:59:32.800 回答