CUDAがgccバージョンと互換性がない


102

CUDA SDKに同梱されているいくつかの例のコンパイルに問題があります。開発者ドライバー(バージョン270.41.19)とCUDAツールキットをインストールし、最後にSDK(4.0.17バージョン)をインストールしました。

最初はコンパイルできませんでした:

error -- unsupported GNU version! gcc 4.5 and up are not supported!

81:/usr/local/cuda/include/host_config.hに責任がある行を見つけて、次のように変更しました。

//#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 4)
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 6)

その時点から、コンパイルするサンプルのほんの一部しか取得できませんでした。

In file included from /usr/include/c++/4.6/x86_64-linux-gnu/bits/gthr.h:162:0,
             from /usr/include/c++/4.6/ext/atomicity.h:34,
             from /usr/include/c++/4.6/bits/ios_base.h:41,
             from /usr/include/c++/4.6/ios:43,
             from /usr/include/c++/4.6/ostream:40,
             from /usr/include/c++/4.6/iterator:64,
             from /usr/local/cuda/include/thrust/iterator/iterator_categories.h:38,
             from /usr/local/cuda/include/thrust/device_ptr.h:26,
             from /usr/local/cuda/include/thrust/device_malloc_allocator.h:27,
             from /usr/local/cuda/include/thrust/device_vector.h:26,
             from lineOfSight.cu:37:
/usr/include/c++/4.6/x86_64-linux-gnu/bits/gthr-default.h:251:1: error: pasting         "__gthrw_" and "/* Android's C library does not provide pthread_cancel, check for
`pthread_create' instead.  */" does not give a valid preprocessing token
make[1]: *** [obj/x86_64/release/lineOfSight.cu.o] Error 1

いくつかの例をコンパイルすると、これはドライバーの問題ではなく、サポートされていないgccバージョンと関係があるはずだと思います。この時点でgcc4.6には依存関係としてシステム全体があるため、ダウングレードはオプションではありません...


4
将来の読者のために:CUDAの最新バージョンを使用していることを確認してください(初期バージョンを絶対に使用する必要がない限り)。NVIDIAは、ほぼすべてのリリースで、サポートされるコンパイラの最大バージョンを引き上げています。
einpoklum 2015

これは、CUDA 10とのそれらのために有用であってもよく、高すぎるGNUコンパイラ鎖バージョンのエラーを取得:stackoverflow.com/questions/53344283/...
ダグラスDaseeco

回答:


114

すでに指摘したように、nvccはgcc 4.4に依存しています。nvccインストールで作成されたbinディレクトリにソフトリンクを追加することにより、コンパイラパラメータを渡さずに正しいバージョンのgccを使用するようにnvccを構成することが可能です。

デフォルトのcudaバイナリディレクトリ(インストールのデフォルト)は/ usr / local / cuda / binです。このディレクトリからgccの正しいバージョンにソフトリンクを追加するだけで十分です。

sudo ln -s /usr/bin/gcc-4.4 /usr/local/cuda/bin/gcc


1
"CUDA 5.0をインストールする場合は特に" update-alternatives "コマンドも役立つかもしれません
phoad

4
また、正しいバージョンのg ++​​へのシンボリックリンクを追加する必要がありました。
Auron、2013

17
また、g ++にリンクする必要がありました。それ以外の場合、単純なnvcc呼び出しは機能しますがmake、CUDAサンプルに適用すると、すぐに次のような呼び出しが行われますnvcc -ccbin g++。私はとを使用sudo ln -s /usr/bin/gcc-4.9 /usr/local/cuda/bin/gccしましたsudo ln -s /usr/bin/g++-4.9 /usr/local/cuda/bin/g++
user2023370

8
でコンパイルすれば、試すcmake .. && makeことができます。プレーンを使用する場合は、試すことができます。 cmake -D CUDA_NVCC_FLAGS="-ccbin gcc-4.4" .. && makeMakefile make CXX=g++-4.4 CC=gcc-4.4
patryk.beza 2016

1
このコマンドを実行すると、「ファイルが存在します」と表示され、リンクが実行されません。何か助け?
Sentient07 2016年

58

gcc 4.5と4.6はCUDAではサポートされていません。コードはコンパイルされず、cuda-gdbを含むツールチェーンの残りの部分は正しく機能しません。それらを使用することはできず、制限は交渉不可能です。

あなたの唯一の解決策は、gcc 4.4バージョンを2番目のコンパイラとしてインストールすることです(ほとんどのディストリビューションではそれが可能です)。--compiler-bindir代替コンパイラを指すために使用できるnvccのオプションがあります。ローカルディレクトリを作成し、サポートされているgccバージョンの実行可能ファイルへのシンボリックリンクを作成します。そのローカルディレクトリを--compiler-bindirオプションを介してnvccに渡すと、システムの他の部分に影響を与えることなくCUDAコードをコンパイルできるはずです。


編集

この質問と回答はCUDA 4に関係することに注意してください。

それが書かれて以来、NVIDIAは新しいCUDAツールチェーンリリースで後のgccバージョンのサポートを拡大し続けています

  • CUDA 4.1リリース以降、gcc 4.5がサポートされるようになりました。gcc 4.6および4.7はサポートされていません。
  • CUDA 5.0リリース以降、gcc 4.6がサポートされるようになりました。gcc 4.7はサポートされていません。
  • CUDA 6.0リリース以降、gcc 4.7がサポートされるようになりました。
  • CUDA 7.0リリースの時点で、gcc 4.8は完全にサポートされており、Ubuntu 14.04およびFedora 21では4.9がサポートされています。
  • CUDA 7.5リリースでは、gcc 4.8が完全にサポートされており、Ubuntu 14.04およびFedora 21では4.9がサポートされています。
  • CUDA 8リリースの時点で、gcc 5.3はUbuntu 16.06およびFedora 23で完全にサポートされています。
  • CUDA 9リリースの時点で、gcc 6はUbuntu 16.04、Ubuntu 17.04、Fedora 25で完全にサポートされています。
  • CUDA 9.2リリースはgcc 7のサポートを追加します
  • CUDA 10.1リリースはgcc 8のサポートを追加します

現在(CUDA 10.1以降)CUDAでのgcc 9サポートはありません。

NVIDIAは最近、現在のCUDAリリースでサポートされているコンパイラとOSマトリックスを含む非常に便利な表をここに追加したことに注意してください。


CUDA 7.5で何が使われているのでしょうか?
GuySoft

2
gcc 4.9.3SLES 11 SP3でCUDA 7.5を問題なく使用しています。
Peter VARGA、2016

3
何?どのようにしてコードが上位バージョンでコンパイルされないようになっているのですか(もちろんハードコードされた制限を除く)?唯一考えられるのは、一部のバージョンではC11 / C ++ 11がデフォルトで有効になっているためですが、古いコードで問題が発生している場合は、コマンドラインスイッチで簡単に回避できます。
Hi-Angel

2
@ Hi-Angelの出向。#talonmies「制限は交渉できない」とはどういう意味ですか?gccとgdbの新しいバージョンは、オブジェクトファイルの古いバイナリヘッダーをサポートします。これは、「常に」(ある種)あるため、新しいgccバージョンが機能しない理由はありません。シンボリックリンクの解決策はさておき、他の問題はほとんどの場合、cプリプロセッサのバージョンフラグ設定です。gccバージョンテストが、定義またはマクロの一部としてcudaヘッダーに「ハードコード」されている場合は、簡単に修正できます。例外はcuda gpuコンパイラ自体です。
Beracah 2016年

1
これはバイナリ互換性の問題ではありません。CUDAツールチェーンでは、ホストコードとデバイスコードの両方をコンパイルして統合するために、nvccとGPUフロントエンドパーサーがさまざまなコンパイラとlibc / libc ++内部ヘッダーをインターセプトおよびオーバーロードできる必要があります。CUDAパーサーは、とりわけ、gcc内部ヘッダーを正しく解析できる必要があります。テストされていないgccバージョンは、NVIDIAヘッダーに組み込まれているプリプロセッサガードに関係なく、失敗する可能性があります。あなたは私を信じるか(ほぼ10年間CUDAツールチェーンをハッキングしてきた誰かとして)信じられないかもしれません。この時点では、私は実際にはそうしません
タロニー

56
  1. CUDAのバージョンでサポートされている最大GCCバージョンを確認します。

     | CUDA version | max supported GCC version |
     |--------------|---------------------------|
     |      11      |             9             |
     |  10.1, 10.2  |             8             |
     |   9.2, 10.0  |             7             |
     |   9.0, 9.1   |             6             |
     |       8      |            5.3            |
     |       7      |            4.9            |
     |    5.5, 6    |            4.8            |
     |    4.2, 5    |            4.6            |
     |      4.1     |            4.5            |
     |      4.0     |            4.4            |
  2. そのGCCバージョンの環境変数を設定します。たとえば、CUDA 10.2の場合:

     MAX_GCC_VERSION=8
  3. そのバージョンがインストールされていることを確認してください:

     sudo apt install gcc-$MAX_GCC_VERSION g++-$MAX_GCC_VERSION
  4. CUDAフォルダー内にシンボリックリンクを追加します。

     sudo ln -s /usr/bin/gcc-$MAX_GCC_VERSION /usr/local/cuda/bin/gcc 
     sudo ln -s /usr/bin/g++-$MAX_GCC_VERSION /usr/local/cuda/bin/g++

    (または/usr/local/cuda、CUDAのインストールパスがない場合は、代わりに使用してください)

CUDA-GCC互換性テーブルの詳細については、このGitHub要旨を参照してください


3
私の人生の笑い設定の悪夢を救った!!!! ありがとうございました。私はこれをgccおよびg ++ 7システムリンクを備えたcuda 10に適用しました。これに遭遇した人のために。
thekevshow

フォルダーやフォルダーを自分で作成する必要が/usr/bin/gccありますか?/usr/bin/g++/usr/local/cuda/bin/gcc
Josh Desmond

あなたが言及したファイルのシンボリックリンクが、ステップ4で作成され@JoshDesmond
bryant1410

@ bryant1410手順4でコマンドを実行したときに、「エラー:ディレクトリ/ usr / local / cuda / bin / gccが存在しない、中止する」などのエラーが発生したことを覚えています。(質問の詳細を読んだ後)私は今、あなたの答えがOPによって言及されたステップ0を想定していることを理解しています:「CUDAツールキットをインストールし、最後にSDKをインストールしました」。私はNVIDIAのcuda_10.2.89_440.33.01_linux.runウィザードを使ってインストールを実行しようとしていましたが、実行時にgccの互換性についての不満で失敗しました。結局、gcc 9:Pをアンインストールすることを決心しました
Josh Desmond

1
あなたがNVCCをインストールした場合は、[ANA |ミニ] conda(conda鍛造パッケージcudatoolkit-dev)、その後、あなたはあなたのようなENV内のリンクに必要ln -s /usr/bin/gcc-8 /home/user/miniconda3/envs/your_env/bin/gccln -s /usr/bin/g++-8 /home/user/miniconda3/envs/your_env/bin/g++
ディエゴ・フェッリ

25

私のディストリビューション(Ubuntu 11.10)ではgcc-4.4とgcc-4.6が同じディレクトリにあるので、-compiler-bindirは役に立ちません。唯一の注意点は、g ++-4.4もインストールして、それをシンボリックリンクする必要があったことです。

sudo ln -s /usr/bin/gcc-4.4 /usr/local/cuda/bin/gcc
sudo ln -s /usr/bin/g++-4.4 /usr/local/cuda/bin/g++

11

CUDA7.5の場合、次の行が機能します。

sudo ln -s /usr/bin/gcc-4.9 /usr/local/cuda/bin/gcc 
sudo ln -s /usr/bin/g++-4.9 /usr/local/cuda/bin/g++

9

この問題を回避するために「update-alternatives」を使用する方法を確認してください。

... gcc 4.6をインストールする場合は、update-alternativesコマンドを使用して、バージョンを簡単に切り替えることもできます。これは次のように構成できます。

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6 
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7 
sudo update-alternatives --config gcc

6

使用していない場合はcmake私のために私はgccを/グラム++バージョンを指定するフラグを使用してコンパイルして働いていたファイルを編集し、リンクのハックのどれを。
cmake -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6 ..

魅力のように働いた。


このスレッドに載せる必要があると思ったので、他の質問の回答をここにリンクしようとしました。再び良い仕事を!ありがとう
MikeDoho

SOに重複した回答を投稿することは控えるべきですが、私には選択肢がありませんでした。:)
markroxor 2018

5

ほとんどのディストリビューションでは、gcc-4.7のような最新のコンパイラーの横に別のgccおよびg ++バージョンをインストールする可能性があります。さらに、ほとんどのビルドシステムはCCCXX環境変数を認識しているため、それぞれ他のCコンパイラとC ++コンパイラを指定できます。だから私は次のようなものを提案します:

CC=gcc-4.4 CXX=g++-4.4 cmake path/to/your/CMakeLists.txt

Makefileの場合も同様の方法があります。何をしているのかわからない限り、/ usr / local内にカスタムシンボリックリンクを設定することはお勧めしません。


3

これはfedora 23で機能します。compatgccリポジトリは、fedoraのバージョンに基づいて少し異なります。

次のリポジトリをインストールした場合:

sudo yum install compat-gcc-34-c++-3.4.6-37.fc23.x86_64 compat-gcc-34-3.4.6-37.fc23.x86_64 

次に、cuda binフォルダーが次の場所にあると仮定して、上記のソフトリンクを作成します。 /usr/local/cuda/

sudo ln -s /usr/bin/gcc-34 /usr/local/cuda/bin/gcc
sudo ln -s /usr/bin/g++-34 /usr/local/cuda/bin/g++

これでnvcc、gccバージョンエラーなしでコンパイルできるはずです。


2

Gearoidマーフィーのソリューションは魅力のように機能します。私にとって、cudaには2つのディレクトリがありました-

/usr/local/cuda 
/usr/local/cuda-5.0

ソフトリンクは、下記のディレクトリにのみ追加する必要がありました-

/usr/local/cuda 

また、SchighSchaghによって言及されているように、g ++とgccの両方のソフトリンクが必要でした。


2

特定のバージョンのgcc(gcc-4.4など)を使用するようにnvccを構成する別の方法は、nvcc.profileを編集し、PATHを変更して、最初に使用するgccへのパスを含めることです。

例(/ optにインストールされたgcc-4.4.6):

PATH += /opt/gcc-4.4.6/lib/gcc/x86_64-unknown-linux-gnu/4.4.6:/opt/gcc-4.4.6/bin:$(TOP)/open64/bin:$(TOP)/share/cuda/nvvm:$(_HERE_):

nvcc.profileの場所はさまざまですが、nvcc実行可能ファイル自体と同じディレクトリにある必要があります。

これは少しハックです。nvcc.profileはnvccのマニュアルのようにユーザー設定を目的としたものではありませんが、私にとって最も効果的な解決策でした。


これを行うことをお勧めしますが、正しいgccバージョンにシンボリックリンクされたg ++を含むディレクトリへのパスを指定します(ディストリビューションがサポートされているgccバージョンを提供している場合は特に便利です)。例:mkdir /usr/local/bin/cuda-hack && ln -s /usr/bin/g++-5 /usr/local/bin/cuda-hack
Sami Liedes 2017年

2

CUDAは、gcc4.7と互換性のあるいくつかのヘッダーの変更後です。おそらくそれよりも高いバージョンです。https://www.udacity.com/wiki/cs344/troubleshoot_gcc47


2

の使用中に混乱する私のような人々のためcmakeに、FindCUDA.cmakeスクリプトはからのもののいくつかを上書きしますnvcc.profile。あなたは指定することができますnvcc設定することで、ホストコンパイラをCUDA_HOST_COMPILER通りhttp://public.kitware.com/Bug/view.php?id=13674


cmake .. -DCMAKE_INSTALL_PREFIX=/InstallPos_GPU/ -DCMAKE_C_COMPILER="/gcc-8.3.0/bin/gcc" -DCMAKE_CXX_COMPILER="/gcc-8.3.0/bin/g++" -DGMX_GPU=ON -DCUDA_TOOLKIT_ROOT_DIR=/cuda-7.5/ -D NVCCFLAGS=" -ccbin /cuda-7.5/bin/" -DCUDA_HOST_COMPILER=/cuda-7.5/bin/gccGPU対応のGromacsを正常にインストールしました。
ペンジー

2

古いバージョンのgcc、g ++をインストールする必要がありました。

    sudo apt-get install gcc-4.4
    sudo apt-get install g++-4.4

gcc-4.4が/ usr / bin /にあり、g ++でも同じであることを確認してから、上記の解決策を使用できます。

    sudo ln -s /usr/bin/gcc-4.4 /opt/cuda/bin/gcc
    sudo ln -s /usr/bin/g++-4.4 /opt/cuda/bin/g++

このコマンドを実行すると、「ファイルが存在します」と表示され、リンクが実行されません。何か助け?
Sentient07 2016年

私はこれについて考えることから遠く離れすぎて、何を言うべきかを知ることができません。うまくいけば、他の人が助けてくれるでしょう。
トラベリング

2

$CUDA_HOME/include/host_config.h、次のような行を見つけます(CUDAのバージョンによって若干異なる場合があります)。

//...
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 9)

#error -- unsupported GNU version! gcc versions later than 4.9 are not supported!

#endif [> __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 9) <]
//...

条件に合わせて削除または変更してください。

このメソッドは潜在的に安全ではなく、ビルドが壊れる可能性があることに注意してください。たとえば、gcc 5はデフォルトでC ++ 11を使用しますが、CUDA 7.5のnvccはこれに該当しません。回避策は追加することです

--Xcompiler="--std=c++98" CUDA <= 6.5

または

--std=c++11 CUDAの場合> = 7.0。


--std=c++オプションをどこに追加しますか?
17

1

このエラーが発生した場合は、ログファイルをお読みください。

$ cat /var/log/cuda-installer.log 
[INFO]: Driver installation detected by command: apt list --installed | grep -e nvidia-driver-[0-9][0-9][0-9] -e nvidia-[0-9][0-9][0-9]
[INFO]: Cleaning up window
[INFO]: Complete
[INFO]: Checking compiler version...
[INFO]: gcc location: /usr/bin/gcc

[INFO]: gcc version: gcc version 9.2.1 20191008 (Ubuntu 9.2.1-9ubuntu2) 

[ERROR]: unsupported compiler version: 9.2.1. Use --override to override this check.

ログファイルの提案に従ってください。

sudo sh cuda_<version>_linux.run --override

仕事が完了しました:)

--overrideオプションを使用して、Kubuntu 19.10にCUDA 10.2とgcc 9.2をインストールしました。


0

Ubuntu 16.10でCUDA 8.0の例をコンパイルするために、次のことを行いました。

sudo apt-get install gcc-5 g++-5
cd /path/to/NVIDIA_CUDA-8.0_Samples
# Find the path to the library (this should be in NVIDIA's Makefiles)
LIBLOC=`find /usr/lib -name "libnvcuvid.so.*" | head -n1 | perl -pe 's[/usr/lib/(nvidia-\d+)/.*][$1]'`
# Substitute that path into the makefiles for the hard-coded, incorrect one
find . -name "*.mk" | xargs perl -pi -e "s/nvidia-\d+/$LIBLOC/g"
# Make using the supported compiler
HOST_COMPILER=g++-5 make

これには、システム全体を変更しない、またはバイナリのみへのシンボリックリンクを作成しないという利点があります(ライブラリリンクの問題が発生する可能性があります)。


0

これは私の問題を解決しました:

sudo rm /usr/local/cuda/bin/gcc
sudo rm /usr/local/cuda/bin/g++
sudo apt install gcc-4.4 g++-4.4
sudo ln -s /usr/bin/gcc-4.4 /usr/local/cuda/bin/gcc
sudo ln -s /usr/bin/g++-4.4 /usr/local/cuda/bin/g++

0

CUDA 6.5(そして明らかに7.0と7.5)の場合、システムの現在のGCCと一緒にそのバージョンのgccをインストールできるgcc 4.8.5 RPMパッケージ(Fedora Core 30の下)のバージョンを作成しました。

そのすべての情報はここにあります


0

私の場合、UbuntuバージョンからCUDAがすでにインストールされていて、cmakeはNVidia SDK Managerを使用して新しくインストールされたバージョンの代わりにCUDAを検出しました。

私は走った dpkg -l | grep cuda、そして、両方のバージョンを見ることができました。

私がしなければならなかったことは、古いCUDA(私の場合はバージョン9.1)をアンインストールし、新しいバージョン(バージョン10.2)をそのままにすることです。私はパージコマンドを次のように使用しました:

sudo apt-get purge libcudart9.1 nvidia-cuda-dev nvidia-cuda-doc \
                                nvidia-cuda-gdb nvidia-cuda-toolkit

パッケージ名がインストールから削除するバージョンと一致していることを確認してください。

cmake空のBUILDディレクトリから再実行して、すべての#includeおよびライブラリをSDKバージョンにリダイレクトする必要がありました(古いパスが既存のビルド環境でベイクされていたため)。


-1

これは、現在のCUDAバージョンが現在のGCCバージョンをサポートしていないために発生しています。次のことを行う必要があります。

  1. サポートされているGCCバージョンを見つけます(私の場合はCUDA 9の場合5)

    • CUDA 4.1: GCC 4.5
    • CUDA 5.0: GCC 4.6
    • CUDA 6.0: GCC 4.7
    • CUDA 7.0: GCC 4.8
    • CUDA 7.5: GCC 4.8
    • CUDA 8: GCC 5.3
    • CUDA 9: GCC 5.5
    • CUDA 9.2: GCC 7
    • CUDA 10.1: GCC 8
  2. サポートされているGCCバージョンをインストールする

    sudo apt-get install gcc-5
    sudo apt-get install g++-5
  3. /usr/binディレクトリ内のGCCのソフトリンクを変更する

    cd /usr/bin
    sudo rm gcc
    sudo rm g++
    sudo ln -s /usr/bin/gcc-5 gcc
    sudo ln -s /usr/bin/g++-5 g++
  4. /usr/local/cuda-9.0/binディレクトリ内のGCCのソフトリンクを変更する

    cd /usr/local/cuda-9.0/bin
    sudo rm gcc
    sudo rm g++
    sudo ln -s /usr/bin/gcc-5 gcc
    sudo ln -s /usr/bin/g++-5 g++
  5. コンパイルに使用-DCUDA_HOST_COMPILER=/usr/bin/gcc-5するsetup.pyファイルに追加します

    if torch.cuda.is_available() and CUDA_HOME is not None:
        extension = CUDAExtension
        sources += source_cuda
        define_macros += [("WITH_CUDA", None)]
        extra_compile_args["nvcc"] = [
            "-DCUDA_HAS_FP16=1",
            "-D__CUDA_NO_HALF_OPERATORS__",
            "-D__CUDA_NO_HALF_CONVERSIONS__",
            "-D__CUDA_NO_HALF2_OPERATORS__",
            "-DCUDA_HOST_COMPILER=/usr/bin/gcc-5"
        ]
  6. 古いビルドディレクトリを削除する

    rm -rd build/
  7. 設定して再コンパイル CUDAHOSTCXX=/usr/bin/gcc-5

    CUDAHOSTCXX=/usr/bin/gcc-5 python setup.py build develop

注:gcc: error trying to exec 'cc1plus': execvp: no such file or directoryこれらの手順を実行してもエラーが発生する場合は、このようにGCCを再インストールしてから、もう一度コンパイルしてみてください。

sudo apt-get install --reinstall gcc-5
sudo apt-get install --reinstall g++-5

クレジット:https : //github.com/facebookresearch/maskrcnn-benchmark/issues/25#issuecomment-433382510

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.