LoginSignup
1
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-07-05

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

参照

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0