Debian Jessie(Debian 8)からStretch(Debian 9)にアップグレードした場合に起こる障害として、少し前に「Debian StretchでDovecotへのpop3sアクセスが出来なくなる問題」という記事を投稿した。大きな障害はそれだけだったと思っていたのだが、CUDA8のコンパイルが失敗するという障害が出現したので、ここに対処法を紹介する。ただし、CUDA9がリリースされた場合には、(おそらく)このような処置は必要なくなるだろう。
前提条件として、CUDA8は、Debianのパッケージではなく独自にインストールしている。CUDAは正式にはDebianをサポートしていないのだが、Ubuntu用のrunfile(cuda_8.0.61_375.26_linux-run)をCUDAサイトからダウンロードしてインストールした。この環境でも、Jessieにおいては何の障害も起きなかった。
コンパイルエラーの一例を以下に示す。
$ /usr/local/cuda/bin/nvcc \
-I"/home/oni/git/cuda/cuda3/src" \
-I"/home/oni/git/plsa/plsa-cpp/src" \
-I/usr/local/cuda-8.0/samples/common/inc \
-I/usr/include \
-I/usr/include/x86_64-linux-gnu \
-O3 \
-Xcompiler \
-D__CORRECT_ISO_CPP11_MATH_H_PROTO \
-std=c++11 \
--compile \
--relocatable-device-code=false \
-gencode arch=compute_30,code=compute_30 \
-gencode arch=compute_30,code=sm_30 \
-m64 \
-x cu \
-o "src/PlsaCuda.o" \
"../src/PlsaCuda.cu"
/usr/local/cuda/bin/..//include/math_functions.h(8897): error: cannot overload functions distinguished by return type alone
/usr/local/cuda/bin/..//include/math_functions.h(8901): error: cannot overload functions distinguished by return type alone
2 errors detected in the compilation of "/tmp/tmpxft_00000b55_00000000-7_PlsaCuda.cpp1.ii".
この原因は、CUDA8において、gccの5.3を超えるバージョンをサポートしていないことにある。CUDA9では、このような束縛がなくなっていることを望みたい。
ひとつの解決策としては、環境変数を
export EXTRA_NVCCFLAGS="-Xcompiler -std=c++98"
のように設定すれば良いとされているが、上記の例のようにc++11を使っている場合には、このやり方は適用できない。
そこで、以下のように、/usr/local/cuda-8.0/binにシンポリックリンクを作成することで、解決することができた。
$ cd /usr/local/cuda-8.0/bin
$ ln -s gcc /usr/bin/gcc-4.9
$ ln -s g++ /usr/bin/g++-4.9
おそらく、NVCCコンパイラがgccとg++を呼び出すときのサーチパスで、/usr/local/cuda-8.0/binが上位に置かれているからであろう。
Stretchを新規にインストールした場合
なお、上記の解決策が成立するためには、gcc-4.9とg++-4.9のパッケージがインストールされていることが前提条件である。ところが、Debian9では、gcc-4.9やgcc-5.3を一切サポートしないという意固地な姿勢を貫いているので、アップグレードではなく新規にStretchをインストールした場合には、これらのパッケージが存在しない。
この場合は、以下のように対処すれば良い。
- 一時的に、/etc/apt/sources.listをJessieに振り向ける
- sudo apt-get update
- sudo apt-get install gcc-4.9 g++-4.9
- /etc/apt/sources.listをStretchに戻す
gcc-4.9やg++-4.9は、libc6等の旧バージョンに依存していないので、上記の対処法が有効なのである。