【问题标题】:Installing OpenMP on Mac OS X 10.11在 Mac OS X 10.11 上安装 OpenMP
【发布时间】:2016-05-10 03:34:41
【问题描述】:

如何让 OpenMP 在 Mac OSX 10.11 上运行,以便我可以通过终端执行脚本?

我已经安装了 OpenMP:brew install clang-omp

当我运行时,例如:gcc -fopenmp -o Parallel.b Parallel.c 以下表达式返回:fatal error: 'omp.h' file not found

我也尝试过:brew install gcc --without-multilib 但不幸的是,这最终返回了以下内容(在首先安装了一些依赖项之后):

The requested URL returned error: 404 Not Found
Error: Failed to download resource "mpfr--patch"

有什么推荐的解决方法吗?

【问题讨论】:

标签: c gcc openmp


【解决方案1】:

在 Mac 上,命令 gcc 是 Clang 的符号链接。所以通过调用

gcc -fopenmp -o your_program your_program.c

实际上,您使用的是 Clang,到目前为止,它还没有内置对 OpenMP 的支持。

根据this 帖子(您还可以找到有关如何设置它的说明),较新版本的 Clang 确实支持 OpenMP。

另一方面,如果您仍想使用 gcc,我可以指导您完成对我有用的步骤。

  1. 使用 brew 安装 gcc。 您使用的命令应该可以工作:

    brew install gcc --without-multilib
    

    或者,如果 brew 说你已经安装了 gcc,你可以试试

    brew reinstall gcc --without-multilib
    

    您可能已经注意到,如果您不指定 --without-multilib,brew 会警告您 OpenMP 可能无法工作。

  2. 找到新安装的 gcc 的位置。

    Brew 将版本号附加到 gcc,这样它就不会与命令行工具安装的版本号冲突。您将在usr/local/bin 中找到符号链接。

    在我的情况下是

    usr/local/bin/gcc-5
    

    如果您右键单击并选择“显示原始文件”,它应该会在/usr/local/Cellar/gcc/5.3.0/bin/gcc-5 中显示gcc-5 可执行文件(版本号可能不同)。

  3. 现在你需要告诉你的系统:

    在调用编译器时,您的 bash 默认会查看 /usr/bin,而不是 /usr/local/bin。您需要将此目录添加到您的 $PATH

    这可以通过以下命令轻松完成:

    PATH=/usr/local/bin:$PATH
    
  4. 现在您应该能够在启用 OpenMP 的情况下进行编译:

    gcc-5 -fopenmp -o your_program your_program.c
    

备注:gcc-5是我安装的版本,你的可能不一样。

【讨论】:

  • 为我工作,当前版本为gcc-6。虽然如果你是第一次安装自制软件,不应该将 $PATH 修改写入你的 .bashrc 中吗?
  • 文件在哪里?我收到一条错误消息,提示没有输入文件
  • 您指的是@SumNeuron 哪些文件?如果您的意思是最后一行代码中的那些,我给出的第一个“Parallel”是输出可执行文件的名称,“Parallel.c”是要编译的源代码。您的终端必须与“Parallel.c”文件位于同一目录中,否则将找不到它。
  • @AlejandroDanielNoel 我的问题是你从哪里得到这些文件,因为它们似乎没有安装 gcc 或 llvm
  • 刚刚尝试了这些步骤并收到了来自 Homebrew 的以下通知:Warning: gcc: this formula has no --without-multilib option so it will be ignored!
【解决方案2】:

默认情况下,GCC 使用 clang 分发。 使用 Homebrew 安装 GCC。安装后,您可以编译由 Homebrew 安装的指定 GCC 版本添加 OpenMP 标志的代码。 hello_world 示例如下所示:

  1. brew 安装 gcc

  2. brew 安装 libomp

  3. 酿造信息 gcc

    gcc:稳定10.2.0(瓶装),HEAD

    GNU 编译器合集

  4. 导出 OMP_NUM_THREADS=8

  5. 创建 hello.c

#include <stdio.h>
#include <omp.h>
int main(void){
    #pragma omp parallel 
    {
        printf("Hello World! \n");
    }

    return 0;
}
  1. gcc-10 -fopenmp hello.c -o hello
  2. 执行:./hello
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!

【讨论】:

  • 这不会为现有和赞成的答案增加任何价值。
【解决方案3】:

macOS High Sierra 版本 10.13.6 (17G65)

1。安装 gcc

brew reinstall gcc --without-multilib

2。编译

gcc-8 -Wall -fopenmp your-parallel-program.c

注意 gcc-8 观看 version brew 安装,您的可能是 gcc-7gcc-9 em>

==> Pouring gcc-8.2.0.high_sierra.bottle.1.tar.gz ? /usr/local/Cellar/gcc/8.2.0: 1,495 files, 344.8MB

就是这样!

【讨论】:

  • 2019年不用加--without-multilib了。
  • 无效选项:--without-multilib
【解决方案4】:
  • 安装clang-omp

    brew install clang-omp
    
  • 确保您使用 xcode 命令行工具

    xcode-select --install
    
  • 我在运行示例 openmp 代码时实际上遇到了一个错误

    /usr/local/opt/libiomp/include/libiomp/omp.h:139:21: error: expected ';' after top level declarator extern void   __ KAI_KMPC_CONVENTION kmp_set_stacksize_s        (size_t);
    
  • 只需从文件中删除 __ 和 KAI 之间存在的一个空格

  • 现在使用命令

    clang-omp -fopenmp helloopenmp.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());
    }
    
  • 你应该得到类似这样的输出

    Hello from thread 3, nthreads 4
    Hello from thread 2, nthreads 4
    Hello from thread 0, nthreads 4
    Hello from thread 1, nthreads 4
    
  • 在 OS X 10.11.3 上工作,并在 2016 年 2 月 18 日进行了 brew 更新

【讨论】:

  • clang-omp 在提交 c57e307 中从 homebrew/core 中删除:clang-omp: migrate to boneyard 功能现在作为 Homebrew 中 LLVM 的一部分提供。
【解决方案5】:
  1. 使用 brew 安装 gcc。

    brew install gcc
    
  2. 检查 gcc 是否已安装。

    $which g++-7
    /usr/local/bin/g++-7
    
  3. 更改 cmake cxx 编译器。

    cmake -DCMAKE_CXX_COMPILER=g++-7
    make
    

也许这会对你有所帮助。

【讨论】:

    【解决方案6】:
    brew install cmake
    brew install gcc --without-multilib
    cmake -DCMAKE_CXX_COMPILER=g++-6 .. 
    make -j 
    

    【讨论】:

      【解决方案7】:

      安装 gcc 后:

      brew install gcc --without-multilib
      

      并导出路径:

      export PATH=/usr/local/bin:$PATH
      

      您可能需要导出 CC,这对我有用:

      export CC=/usr/local/bin/gcc
      

      这可能是 gcc-7 或其他。

      【讨论】:

        猜你喜欢
        • 2016-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-13
        • 1970-01-01
        • 2016-03-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多