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
他にもいくつかのエラーがあります。
他の標準ライブラリ インクルードが g++ 4.7 のビルドを壊す可能性もあります。制限は私がつまずいたものです。
g++ 4.5 も試してみました。たまたま自分のマシンにもあるからです (コンパイラのバージョンが多すぎることはありませんよね?)。
これは CUDA 5.5 のリリースで修正されると期待できますか? (NVIDIA が単純にバージョン 4.6 までの gcc のみをサポートするように戻らないことを願っています。)
当面の間、これを回避する方法はありますか?
アップデート:
@talonmies が以下で指摘しているように、MacOS では gcc が正式にサポートされていないため、これは厳密には MacOS 上の CUDA 5.5 のバグではありません。多くのサードパーティ ライブラリは、サポートされているツールチェーン、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 が含まれていると思います。