CUDA 5.5 RC带g++;4.7和4.8:_int128生成错误

CUDA 5.5 RC带g++;4.7和4.8:_int128生成错误,cuda,g++-4.7,g++4.8,Cuda,G++ 4.7,G++4.8,我试图在MacOSX10.8上用CUDASDK5.5RC和g++4.7编译一些代码。 如果我理解正确,CUDA 5.5应该与g++4.7一起使用。看看/usr/local/cuda/include/host_config.h,它甚至可以与g++4.8一起工作 关于g++4.8:我尝试编译以下程序: 使用g++4.7编译和运行相同的程序: $ nvcc example.cu -ccbin=g++-4.7 $ ./a.out Hello World! 但是如果我包括。。。 带有gcc 4.8

我试图在MacOSX10.8上用CUDASDK5.5RC和g++4.7编译一些代码。 如果我理解正确,CUDA 5.5应该与g++4.7一起使用。看看/usr/local/cuda/include/host_config.h,它甚至可以与g++4.8一起工作

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

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

$ nvcc example.cu -ccbin=g++-4.7
$ ./a.out 
Hello World!
但是如果我包括。。。


带有gcc 4.8的nvcc仍然在cstdlib中的int128上阻塞。我想cstdlib之前已经包括在内了,包括了预包含文件。

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

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

支持CUDA的GPU

‣Mac OSX v。10.7.5或更高版本

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

‣NVIDIA CUDA工具包(可从以下网址获得)


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

尽管这在技术上是正确的,但它并不能解决我的问题。很长一段时间以来,我在使用nvcc和Xcode的llvm gcc编译第三方LIB(如OpenCV)时遇到了问题,这使我转向了一个“真正的”gcc,它还不到6年,并且理解更新的gcc命令行选项。但现在看来,再向前推进似乎是不可能的。@LysannSchlegel:我感觉到了你的痛苦。出于这个原因,我基本上放弃了在OSX上进行认真的开发。缺少合适的现代C++编译器和FORTRAN编译器对我来说是一个交易障碍。NVIDIA不会提供支持,也不会接受使用受支持的系统编译器以外的任何工具生成的代码的错误报告。Rock,遇见hard place…你试过添加
\unde\u GLIBCXX\u ATOMIC\u内置
\unde\u GLIBCXX\u USE\u INT128
?这是GCC4.8中已知的CUDA错误,打包程序/开发人员需要修补CUDA文件或他们的项目(例如,请参阅)。@BenC我应该将这些UNDEF放在哪里?从您提到的补丁开始,我在cuda/include/host_config.h的末尾进行了尝试,但没有任何帮助。当你说这是一个已知的bug时,你的意思是它也发生在其他平台上吗?它发生在Linux上。GCC 4.7和4.8存在问题。正如@Talonmes所指出的,没有任何保证,但到目前为止,修补程序似乎仍然很容易解决这个问题(至少在Linux上)。一个侵入性较小的解决方案(使用GCC4.7测试)是将这些行添加到一个单独的标题中,您可以在编译过程中使用
——预先包含您的_header.h
(如)。我还没有尝试过GCC4.8,但到目前为止,我从未对GCC4.7和CUDA 5.0/5.5的这种修复有过任何问题。此外,我认为CUDA 5.5现在支持GCC4.7(至少对Linux是这样)。对于GCC4.7,--pre include标志起到了作用。但它并不能解决GCC4.8的cstdlib中的问题。
$ 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".
$ nvcc example.cu -ccbin=g++-4.7
$ ./a.out 
Hello World!
// example_limits.cu
#include <stdio.h>
#include <limits>
int main(int argc, char** argv) {
  printf("Hello World!\n");
  return 0;
}
$ cat compatibility.h 
#undef _GLIBCXX_ATOMIC_BUILTINS
#undef _GLIBCXX_USE_INT128

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