CUDA 5.5 RC与g ++ 4.7和4.8:__ int128构建错误

时间:2013-07-31 12:23:35

标签: cuda g++-4.7 g++4.8

我正在尝试使用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!

但如果我包含&lt; limits&gt; ...

// 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上窒息。我想在包含--pre-include文件之前包含了cstdlib。

1 个答案:

答案 0 :(得分:4)

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

  

要在系统上使用CUDA,您需要安装以下软件:

     

支持CUDA的GPU

     

‣MacOSX v.10.7.5或更高版本

     

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

     

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

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