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はこの時点で依存関係としてシステム全体を持っているため、ダウングレードはオプションではありません...
すでに指摘したように、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
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 10現在)、CUDAにはgcc 8のサポートはありません。
NVIDIAは最近、非常に便利なテーブルを追加したことに注意してください here 現在のCUDAリリースでサポートされているコンパイラとOSマトリックスが含まれています。
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
私のディストリビューション(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++
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++
「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
ほとんどのディストリビューションでは、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内にカスタムシンボリックリンクを設定することはお勧めしません。
cmake
を使用している場合、ファイルの編集とリンクのハックは機能しなかったため、gcc/g ++バージョンを指定するフラグを使用してコンパイルしました。cmake -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6 ..
魅力のように働いた。
これは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
でコンパイルできるはずです。
古いバージョンの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++
cmake
の使用中に混乱する私のような人々にとって、FindCUDA.cmake
スクリプトはnvcc.profile
からのもののいくつかをオーバーライドします。 http://public.kitware.com/Bug/view.php?id=13674 に従ってCUDA_Host_COMPILER
を設定することにより、nvcc
ホストコンパイラを指定できます。
特定のバージョンの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マニュアルによるユーザー設定を目的としていないため、これはちょっとしたハックですが、私にとって最適なソリューションでした。
CUDAは、gcc4.7以降のバージョンと互換性のあるヘッダーの変更後です。 https://www.udacity.com/wiki/cs344/troubleshoot_gcc47
Gearoid Murphyのソリューションは魅力的です。私にとっては、cudaのディレクトリが2つありました-
/usr/local/cuda
/usr/local/cuda-5.0
ソフトリンクは、下記のディレクトリにのみ追加する必要がありました-
/usr/local/cuda
また、SchighSchaghが述べたように、g ++とgccの両方のソフトリンクが必要でした。
これは私の問題を解決しました:
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++
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
これには、システム全体を変更したり、バイナリのみにシンボリックリンクを作成したりしないという利点があります(ライブラリリンクの問題が発生する可能性があります)。
$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の場合。