私のもとへ Windows CUDA 開発環境でNVIDIA CUDA COMPILER / NVCCコンパイラを実行したところ「include ファイルを開けません。’cutil.h’: No such file or directory」が出てきて困っているので助けてドラえもん〜!状態になることが多いので対策を公開します。
[amazon_enhanced asin=”4777514773″ container=”” container_class=”” price=”All” background_color=”FFFFFF” link_color=”000000″ text_color=”0000FF” /] [amazon_enhanced asin=”4844329782″ container=”” container_class=”” price=”All” background_color=”FFFFFF” link_color=”000000″ text_color=”0000FF” /] [amazon_enhanced asin=”4862461336″ container=”” container_class=”” price=”All” background_color=”FFFFFF” link_color=”000000″ text_color=”0000FF” /] [amazon_enhanced asin=”479802578X” container=”” container_class=”” price=”All” background_color=”FFFFFF” link_color=”000000″ text_color=”0000FF” /]
■include ファイルを開けません。’cutil.h’: No such file or directory
まず、これは何を意味しているのでしょうか?
読んで字の如くです。C / C++ 経験者であれば 「ああ、あれか!」で済む話ですね。
クーダ・ユーティリティ (cutil) ライブラリを参照するように .cu ソースに記述しているのに、コンパイル時にファイル、ディレクトリで見つからないため、【include ファイルを開けません。】とコンピュータが回答しているだけです。
—
■クーダ・ユーティリティ・ライブラリの存在
NVIDIA の解説によれば、「cutilライブラリは主にGPUコンピューティングSDKのサンプルを合理化するためのツールとして意図され、ライブラリのAPIは、いつでも変更される可能性があるとして、SDKサンプルの外で、その使用は推奨されません。」とのこと。なので、本格的に CUDA で HPC バリバリ計算したい用途には向くものではないことを、認識しておく必要があります。
ここでは、CUDA 4.0 (x64) を例に取り上げますが、C:ProgramDataNVIDIA CorporationNVIDIA GPU Computing SDK 4.0Ccommonsrc ここに CUda UTility Library として、cutil.cpp が含まれます。
C / C++ 経験をお持ちでなくとも、*.lib, *.dll の違いはご存知でしょうか?
*.lib は 静的ライブラリファイル
*.dll は 動的ロードライブラリファイル
すなわち、 cutil.cpp を基にして cutil.lib あるいは cutil.dll が作成されたものがコンパイル時にファイル、ディレクトリで参照できるようにパス記述が必要です。32bit, 64bit それぞれに対応するように cutil32.lib (cutil64.lib) 、 cutil32.dll (cutil64.dll) のものと、デバッグ用に cutil32D.lib (cutil64D.lib)
※x64 (win64) 環境で導入した場合、32bit 環境が必要であれば、C:ProgramDataNVIDIA CorporationNVIDIA GPU Computing SDK 4.0Ccommon に cutil32を VisualStudio 2005, 2008, 2010 環境でビルドするためのプロジェクトファイルが含まれているので (VS 2005, 2008 のみツール内のパス指定必要)、自身のビルドによって入手可能です。
⇒ CUDA 64bit (x64) 環境の場合、C:ProgramDataNVIDIA CorporationNVIDIA GPU Computing SDK 4.0CUDALibrariesbinwin64Release ここに cutil64.dll が格納されています。
同様にデバッグ用は C:ProgramDataNVIDIA CorporationNVIDIA GPU Computing SDK 4.0CUDALibrariesbinwin64Debug ここに cutil64D.dll が格納されています。
環境に応じ、適宜 32bit, 64bit を置き換えてください。
—
■ NVCC コンパイラが使用する環境変数
NVCC コンパイラはどうやって環境変数を参照するのでしょうか?
開発用コマンドプロンプトで set コマンドで関連する環境変数を参照すると(ここでは例)
CUDA_BIN_PATH=C:Program FilesNVIDIA GPU Computing ToolkitCUDAv4.0\bin CUDA_INC_PATH=C:Program FilesNVIDIA GPU Computing ToolkitCUDAv4.0\include CUDA_LIB_PATH=C:Program FilesNVIDIA GPU Computing ToolkitCUDAv4.0\libx64 CUDA_PATH=C:Program FilesNVIDIA GPU Computing ToolkitCUDAv4.0 CUDA_PATH_V4_0=C:Program FilesNVIDIA GPU Computing ToolkitCUDAv4.0 NVSDKCOMPUTE_ROOT=C:ProgramDataNVIDIA CorporationNVIDIA GPU Computing SDK 4.0
となっていました。なお、ここで CUDA_PATH_V4_0 は以前、3.2 環境もあったので区別するために明示的に記述しています。
NVCC コンパイラは CUDA_PATH 環境変数を利用しているので、上記設定が必要です。通常は CUDA SDK インストール時に自動的に設定されているはずです。
また、VisualStudio と連動させたい場合には、$VisualStudioInstallDirVCVCProjectDefaults に VSが使用する .rule ファイルがCUDA SDK インストール時に自動的に格納されていますので、VS 上の VC (VisualC++) で CUDA アプリケーションをビルドしたい場合には、プロジェクトファイルから .rulu ファイルを参照してあげればいいです。
補足: NVCC コンパイラ・プロファイル (nvcc.profile) について
TOP = $(_HERE_)/.. PATH += $(TOP)/extools/bin;$(TOP)/open64/bin;$(_HERE_);$(TOP)/lib; INCLUDES += "-I$(TOP)/include" "-I$(TOP)/include/cudart" $(_SPACE_) LIBRARIES =+ $(_SPACE_) "/LIBPATH:$(TOP)/lib/$(_WIN_PLATFORM_)" cudart.lib CUDAFE_FLAGS += OPENCC_FLAGS += PTXAS_FLAGS +=
が定義されているので、 nvcc コンパイラが格納されているパスは絶対に変更しないようにすることも大事です。
詳細は CUDA SDK に同梱の各種 PDF ドキュメントもご覧ください。
以上