Cuda Clang和OS X Mavericks

8
我目前正在尝试在MacOS 10.9上使用Cmake构建一个CUDA项目。我的C和C++编译器是gcc,但似乎自从Mavericks以来,gcc和g++链接到clang,而CUDA不支持clang。有人找到了一个好的解决方案来使用真正的gcc,或者使clang在没有“dumpspecs”的情况下工作吗?
6个回答

7

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


1
这样做可以完成,但在10.9和Xcode 5上似乎出现了新问题:默认的stdlib现在是libc ++,这似乎会导致nvcc出现新错误。因此,您还需要添加-stdlib=libstdc ++标志(如果直接指定给nvcc,则通过-Xcompiler)。 - kamjagin

4
这是对Eugene提供答案的扩展:
CUDA工具包下载已发布到Mac OSX 10.9的CUDA下载页面
它支持10.9上的XCode 5,并且会自动使用clang而不是gcc,供您参考。
如果您正在10.8上使用XCode 5,请查看发布说明

· 在Mac OS X 10.8上安装XCode 5(包括命令行工具)后,gcc编译器将被clang替代。您可以通过使用--ccbin /usr/bin/clang选项从命令行继续成功地使用nvcc进行编译,该选项指示nvcc使用clang编译器而不是gcc编译器来编译传递给它的任何主机代码。但是,在使用NSight Eclipse Edition构建时,此解决方案将无法正常工作。一种可行的替代方案是在安装XCode 5后从Apple开发者网站下载旧版本的命令行工具包。这将重新安装gcc到/usr/bin。为了做到这一点,请转到

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

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


2

这个问题实际上在OS X Mavericks之前就存在了,我在Moutain Lion时也遇到了同样的问题,Eugene的答案是100%正确的。

然而,自从升级到Mavericks以来,似乎我的Geforce显卡没有被识别为CUDA兼容设备,而且使用CUDA的软件用户也遇到了同样的问题。

因此最好现在不要进行更新。


1

随着OsX Maverick版本的发布,Clang成为了默认编译器,gcc和g++命令被重定向到Clang编译器。您可以通过Homebrew下载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


1
我刚下载了CUDA 5.5,安装在Mac OSX 10.8.5下,使用Xcode 5.0.2,并更新了Xcode的命令行工具。但是我无法编译CUDA示例程序“nbody”。我遇到了各种奇怪的错误信息,比如“clang error: unsupported option '-dumpspecs'”等。我以为我已经通过一些其他网页的帮助解决了这个问题,但接着又出现了其他问题(例如找不到GLEW,CUDA示例路径未定义等)。因此,我自己编写了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 # # GZ Dec 2013
# -------- 变量和设置 --------- #
CUDA := /Developer/NVIDIA/CUDA-5.5
NVCC := nvcc -ccbin /usr/bin/clang -arch=sm_30 --compiler-options -Wall,-ansi,-Wno-extra-tokens # -ccbin /usr/bin/clang 在OSX 10.8下需要XCode 5 # -arch=sm_30 对于我的笔记本电脑是必需的(它不提供sm_35)
INCFLAGS := -I $(CUDA)/samples/common/inc
TARGET := nbody
OBJDIR := obj
MAKEFLAGS := kR
.SUFFIXES: .cu .cpp .h
ALLSOURCES := $(wildcard *.cu *.cpp) ALLFILES := $(basename $(ALLSOURCES)) ALLOBJS := $(addsuffix .o,$(addprefix $(OBJDIR)/,$(ALLFILES)))
DEPDIR := depend
# --------- 自动目标 --------------
.PHONY: all all: $(OBJDIR) $(DEPDIR) $(TARGET) @true $(OBJDIR): mkdir $@
# --------- 通用规则 --------------
UNAME = $(shell uname) ifeq ($(UNAME), Darwin) # Mac OS X # OpenGL和GLUT是框架 LDFLAGS = -Xlinker -framework,OpenGL,-framework,GLUT,-L,$(CUDA)/samples/common/lib/darwin,-lGLEW endif $(TARGET): $(ALLOBJS) $(NVCC) $^ $(LDFLAGS) -o $@ $(OBJDIR)/%.o: %.cu $(NVCC) -c $(INCFLAGS) $ $@ $(DEPDIR)/%.d : %.cpp $(DEPDIR) @echo creating dependencies for $ $@ $(DEPDIR): mkdir $@
# ------ 管理员工作 -------
.PHONY: clean
clean: rm -f *.o $(TARGET) rm -rf $(DEPDIR) $(OBJDIR)
echo: @echo $(ALLSOURCES) @echo $(ALLFILES) @echo $(ALLOBJS)

0

这是一个适用于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

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