Debian
CUDA
Stretch
NVCCコンパイラ

Debian StretchでCUDA8のコンパイルが失敗する場合

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等の旧バージョンに依存していないので、上記の対処法が有効なのである。

参照