【问题标题】:Cuda Clang and OS X MavericksCuda Clang 和 OS X Mavericks
【发布时间】:2013-10-21 11:40:25
【问题描述】:

我目前正在尝试在 MacOS 10.9 上使用 Cmake 构建 Cuda 项目。我的 C 和 C++ 编译器是 gcc,但似乎自从 Mavericks gcc 和 g++ 链接到 clang,CUDA 不支持。

有没有人找到一个好的解决方案来使用真正的 gcc,或者在没有“dumpspecs”的情况下让 clang 工作?

【问题讨论】:

    标签: gcc cuda clang osx-mavericks


    【解决方案1】:

    Clang 成为 OsX Maverick 版本的默认编译器,gcc 和 g++ 命令被重定向到 clang 编译器。您可以通过自制软件下载 gcc 编译器,并按照以下步骤将 gcc 和 g++ 命令链接回 gcc 编译器。

    $ brew install gcc48
    [...]
    
    $ sudo mkdir /usr/bin/backup && sudo mv /usr/bin/gcc /usr/bin/g++ /usr/bin/backup
    $ sudo ln -s /usr/local/bin/gcc-4.8 /usr/bin/gcc
    $ sudo ln -s /usr/local/bin/g++-4.8 /usr/bin/g++
    

    我在这篇文章中找到了解决方案: http://gvsmirnov.ru/blog/tech/2014/02/07/building-openjdk-8-on-osx-maverick.html#all-you-had-to-do-was-follow-the-damn-train-cj

    【讨论】:

      【解决方案2】:

      这是一个对我在 Lion 上有效的 Homebrew 食谱。

      $ brew cat memtestG80
      require "formula"
      
      # Documentation: https://github.com/Homebrew/homebrew/wiki/Formula-Cookbook
      #                /usr/local/Library/Contributions/example-formula.rb
      # PLEASE REMOVE ALL GENERATED COMMENTS BEFORE SUBMITTING YOUR PULL REQUEST!
      
      # Requires at compile time nvcc from https://developer.nvidia.com/cuda-downloads
      
      # Requires popt at compile time
      
      class Memtestg80 < Formula
        homepage ""
        url "https://github.com/ihaque/memtestG80/archive/master.zip"
        sha1 ""
        version "c4336a69fff07945c322d6c7fc40b0b12341cc4c"
      
        # depends_on "cmake" => :build
        depends_on :x11 # if your formula requires any X11/XQuartz components
      
        def install
          # ENV.deparallelize  # if your formula fails when building in parallel
      
          system "make", "-f", "Makefiles/Makefile.osx", "NVCC=/usr/local/cuda/bin/nvcc -ccbin /usr/bin/clang", "POPT_DIR=/usr/local/Cellar/popt/1.16/lib"
          system "cp", "-a", "memtestG80", "/usr/local/bin"
        end
      
        test do
          # `test do` will create, run in and delete a temporary directory.
          #
          # This test will fail and we won't accept that! It's enough to just replace
          # "false" with the main program this formula installs, but it'd be nice if you
          # were more thorough. Run the test with `brew test memtestG80`.
          #
          # The installed folder is not in the path, so use the entire path to any
          # executables being tested: `system "#{bin}/program", "do", "something"`.
          system "false"
        end
      end
      

      【讨论】:

        【解决方案3】:

        我刚刚下载了 CUDA 5.5,安装在 Mac OSX 10.8.5 下,带有 Xcode 5.0.2,并在 Xcode 中更新了命令行工具。 但我无法编译 CUDA 示例“nbody”。 我收到了各种有趣的错误信息,比如

         clang 错误:不支持的选项 '-dumpspecs'
        我以为我已经通过其他一些网页的帮助解决了这个问题,但随后其他问题不断出现(例如,GLEW 未找到,CUDA 示例路径未定义,...)。 (而且提供的 makefile 和 cmake 文件似乎太做作了,所以我找不到错误。)

        所以我推出了自己的 makefile。我把它贴在这里,希望它可以帮助其他人节省一些时间。

        #!/usr/bin/make -R # 用于 CUDA 示例程序的简单 Makefile # (因为提供的那些不起作用!:-( ) # # 我们假设这个目录中的所有文件都产生一个可执行文件。 # 在下面的变量 NVCC 中设置你的 GPU 版本 # # 在Mac OS X 10.8.5下开发测试; # 在Linux 下,你可能需要调整一些路径、编译器选项和#ifdef。 # # 先决条件: # - CUDA 5.5 # - 通过 XCode 5 安装的“命令行工具” # - DYLD_FALLBACK_LIBRARY_PATH 或 DYLD_LIBRARY_PATH 必须包括 # /Developer/NVIDIA/CUDA-5.5/lib:/Developer/NVIDIA/CUDA-5.5/samples/common/lib/darwin # # 广州 2013 年 12 月 # -------- 变量和设置 --------- # CUDA := /Developer/NVIDIA/CUDA-5.5 NVCC := nvcc -ccbin /usr/bin/clang -arch=sm_30 --compiler-options -Wall,-ansi,-Wno-extra-tokens # OSX 10.8 下的 XCode 5 需要 -ccbin /usr/bin/clang # 我的笔记本电脑需要 -arch=sm_30(它不提供 sm_35) INCFLAGS := -I $(CUDA)/samples/common/inc 目标:= nbody OBJDIR := 对象 制造标志:= kR .后缀:.cu .cpp .h ALLSOURCES := $(通配符 *.cu *.cpp) ALLFILES := $(basename $(ALLSOURCES)) ALLOBJS := $(addsuffix .o,$(addprefix $(OBJDIR)/,$(ALLFILES))) DEPDIR := 依赖 # --------- 自动目标 -------------- .PHONY:全部 全部:$(OBJDIR)$(DEPDIR)$(目标) @真的 $(OBJDIR): mkdir $@ # --------- 通用规则 -------------- UNAME = $(shell unname) ifeq ($(UNAME), 达尔文) # Mac OS X # OpenGL 和 GLUT 是框架 LDFLAGS = -Xlinker -framework,OpenGL,-framework,GLUT,-L,$(CUDA)/samples/common/lib/darwin,-lGLEW 万一 $(目标): $(ALLOBJS) $(NVCC) $^ $(LDFLAGS) -o $@ $(OBJDIR)/%.o: %.cu $(NVCC) -c $(INCFLAGS) $$@ $(DEPDIR)/%.d : %.cpp $(DEPDIR) @echo 为 $ $@ 创建依赖项 $(DEPDIR): mkdir $@ # ------ 管理的东西 -------- .PHONY:干净 干净的: rm -f *.o $(目标) rm -rf $(DEPDIR) $(OBJDIR) 回声: @echo $(ALLSOURCES) @echo $(所有文件) @echo $(ALLOBJS)

        【讨论】:

          【解决方案4】:

          这是 Eugene 提供的答案的扩展:

          Mac OSX 10.9 的 CUDA 工具包下载已发布到CUDA download page

          它在 10.9 上支持 XCode 5,并且会自动使用 clang 而不是 gcc,仅供参考。

          如果您在 10.8 上使用 XCode 5,请参阅release notes

          · 在 Mac OS X 10.8 上,如果您安装 XCode 5,包括命令行工具,gcc 编译器将被 clang 取代。您可以使用 --ccbin /usr/bin/clang 选项从命令行继续使用 nvcc 成功编译,该选项指示 nvcc 使用 clang 编译器而不是 gcc 来编译传递给它的任何主机代码。但是,当使用 NSight Eclipse Edition 构建时,此解决方案将不起作用。可以从命令行和 NSight Eclipse 版一起工作的替代解决方案是在安装 XCode 5 后从 Apple Developer 网站下载旧版本的命令行工具包,这会将 gcc 重新安装到 /usr/bin .为此,请转到

          http://developer.apple.com/downloads/index.action

          使用您的 Apple ID 登录,然后使用屏幕左侧的搜索窗格搜索命令行工具。

          【讨论】:

            【解决方案5】:

            这个问题实际上在 OS X Mavericks 之前就已经存在,我对 Moutain Lion 也有同样的问题,而 Eugene 的回答是 100% 正确的。

            但是,自从升级到 Mavericks 后,我的 Geforce 卡似乎没有被识别为支持 CUDA 的设备,而且使用使用 CUDA 的软件的人似乎也遇到了同样的问题。

            所以现在最好不要更新

            【讨论】:

              【解决方案6】:

              10.9 的问题在于 gcc 实际上是铿锵声。请尝试最新的 CUDA 工具包并明确指出 NVCC 使用 /usr/bin/clang (nvcc -ccbin /usr/bin/clang)。这样 NVCC 就会知道它正在处理 clang。

              【讨论】:

              • 这样做了,但似乎在 10.9 和 Xcode 5 上出现了一个新问题:默认的 stdlib 现在是 libc++,这似乎会产生新的 nvcc 错误。所以你还需要添加-stdlib=libstdc++ 标志(如果直接指定给nvcc,则通过-Xcompiler)
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-12-25
              • 2014-04-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-05-25
              相关资源
              最近更新 更多