web-dev-qa-db-ja.com

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

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はこの時点で依存関係としてシステム全体を持っているため、ダウングレードはオプションではありません...

82
fbielejec

すでに指摘したように、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

98
Gearoid Murphy

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

唯一の解決策は、gcc 4.4バージョンをsecondコンパイラーとしてインストールすることです(ほとんどのディストリビューションで許可されています)。 nvcc --compiler-bindirには、代替コンパイラを指すために使用できるオプションがあります。ローカルディレクトリを作成し、サポートされている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現在)、CUDAにはgcc 8のサポートはありません。

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

47
talonmies

CUDA 10.1:の場合

Sudo ln -s /usr/bin/gcc-8 /usr/local/cuda/bin/gcc 
Sudo ln -s /usr/bin/g++-8 /usr/local/cuda/bin/g++

最初にgccとg ++ 8をインストールする必要があります。

Sudo apt install gcc-8 g++-8

CUDA 10.0の場合:

Sudo ln -s /usr/bin/gcc-7 /usr/local/cuda/bin/gcc 
Sudo ln -s /usr/bin/g++-7 /usr/local/cuda/bin/g++

最初にgccとg ++ 7をインストールする必要があります。

Sudo apt install gcc-7 g++-7

CUDA 9の場合:

Sudo ln -s /usr/bin/gcc-6 /usr/local/cuda/bin/gcc 
Sudo ln -s /usr/bin/g++-6 /usr/local/cuda/bin/g++

最初にgccとg ++ 6をインストールする必要があります。

Sudo apt install gcc-6 g++-6

CUDA 8の場合:

Sudo ln -s /usr/bin/gcc-5 /usr/local/cuda/bin/gcc 
Sudo ln -s /usr/bin/g++-5 /usr/local/cuda/bin/g++

最初にgccとg ++ 5をインストールする必要があります。

Sudo apt install gcc-5 g++-5
31
bryant1410

私のディストリビューション(Ubuntu 11.10)では、gcc-4.4とgcc-4.6は同じディレクトリにあるため、Gearoid Murphyのソリューションの方がうまく機能します。したがって、-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++
24
Nicu Stiurca

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++
11
neouyghur

「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
8
Akanes

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

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

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

5
math

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

魅力のように働いた。

4
markroxor

これはFedora 23で機能します。互換gccリポジトリは、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++

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

3
Chris Chaffin

古いバージョンの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++
2
travelingbones

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

2
cheshirekow

特定のバージョンの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マニュアルによるユーザー設定を目的としていないため、これはちょっとしたハックですが、私にとって最適なソリューションでした。

2
Ewerton

CUDAは、gcc4.7以降のバージョンと互換性のあるヘッダーの変更後です。 https://www.udacity.com/wiki/cs344/troubleshoot_gcc47

2
42n4

Gearoid Murphyのソリューションは魅力的です。私にとっては、cudaのディレクトリが2つありました-

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

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

/usr/local/cuda 

また、SchighSchaghが述べたように、g ++とgccの両方のソフトリンクが必要でした。

2
arpwal

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

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
Sherzod

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
Eponymous

$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の場合。

0
Kh40tiK