我正在尝试在 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 文件之前包含的。