Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

参照

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした