6

我正在尝试在 MacOS X 10.8 上使用 CUDA SDK 5.5 RC 和 g++ 4.7 编译一些代码。如果我理解正确,CUDA 5.5 应该适用于 g++ 4.7。查看 /usr/local/cuda/include/host_config.h 它甚至应该适用于 g++ 4.8。

关于 g++ 4.8:我尝试编译以下程序:

// example.cu
#include <stdio.h>
int main(int argc, char** argv) {
  printf("Hello World!\n");
  return 0;
}

但它失败了:

$ nvcc example.cu -ccbin=g++-4.8
/usr/local/Cellar/gcc48/4.8.1/gcc/include/c++/4.8.1/cstdlib(178): error: identifier "__int128" is undefined
/usr/local/Cellar/gcc48/4.8.1/gcc/include/c++/4.8.1/cstdlib(179): error: identifier "__int128" is undefined
2 errors detected in the compilation of "/tmp/tmpxft_00007af2_00000000-6_example.cpp1.ii".

相同的程序使用 g++ 4.7 编译和运行:

$ nvcc example.cu -ccbin=g++-4.7
$ ./a.out 
Hello World!

但如果我包含 <limits>...

// example_limits.cu
#include <stdio.h>
#include <limits>
int main(int argc, char** argv) {
  printf("Hello World!\n");
  return 0;
}

...即使 g++ 4.7 也失败了。构建日志位于此处:https
: //gist.github.com/lysannschlegel/6121347 您还可以找到一些其他错误,我不完全确定它们是否都与 __int128 缺失有关。
很可能其他标准库也包括破坏 g++ 4.7 的构建,限制是我绊倒的那个。

我还尝试了 g++ 4.5,因为我的机器上也有它(你永远不会有太多的编译器版本,对吗?),它可以工作。

我可以期望这将在 CUDA 5.5 版本中得到解决吗?(我希望 NVIDIA 不只是回到支持 gcc 直到 4.6 版。)
在此期间有没有办法解决这个问题?

更新:

正如@talonmies 在下面指出的那样,这严格来说不是 MacOS 上的 CUDA 5.5 中的错误,因为 MacOS 上不正式支持 gcc。由于许多第三方库不能正确处理支持的工具链、clang 或 llvm-gcc(llvm-gcc 来自 2007 年......),因此仍然需要让 gcc 工作。高达 4.6 的 gcc 应该可以正常工作(我只测试了 4.5)。
您可以使用@BenC 在评论中指出的技巧使 gcc 4.7 工作:

$ cat compatibility.h 
#undef _GLIBCXX_ATOMIC_BUILTINS
#undef _GLIBCXX_USE_INT128

$ nvcc example_limits.cu -ccbin=g++-4.7 --pre-include compatibility.h

带有 gcc 4.8 的 nvcc 仍然在 cstdlib 中的 __int128 上阻塞。我猜 cstdlib 是在包含 --pre-include 文件之前包含的。

4

1 回答 1

4

您需要更仔细地阅读 MacOS 入门指南:

要在您的系统上使用 CUDA,您需要安装以下内容:

支持 CUDA 的 GPU

‣ Mac OSX v. 10.7.5 或更高版本

‣ 使用 Xcode 安装的 gcc 或 Clang 编译器和工具链

‣ NVIDIA CUDA 工具包(可在http://developer.nvidia.com/cuda-downloads 获得

这正是它所说的——使用 Xcode 附带的编译器。不要使用自建的 gcc 版本,因为它不能保证工作,即使该编译器版本被列为在其他平台上受支持,并且如果琐碎的代码似乎可以正确编译。

于 2013-07-31T12:42:18.977 回答