私の問題はこのリンクに非常に似ていますが、修正できません。
cudaレイヤードテクスチャを使用したCUDAプログラムがあります。この機能は、Fermi アーキテクチャ (計算能力が 2.0 以上) でのみ使用できます。GPU が Fermi でない場合は、レイヤード テクスチャの代わりに 3D テクスチャを使用します。テクスチャ参照を宣言するときに、コードで __CUDA_ARCH__ を使用します (テクスチャ参照はグローバルである必要があります)。
#if __CUDA_ARCH__ >= 200
texture<float, cudaTextureType2DLayered> depthmapsTex;
#else
texture<float, cudaTextureType3D> depthmapsTex;
#endif
私が抱えている問題は、 __CUDA_ARCH__ が定義されていないように見えることです。
私が試したこと:
1) __CUDA_ARCH__ は cuda カーネル内で正しく動作します。NVCC ドキュメントから、ホスト コード内で __CUDA_ARCH__ が正しく機能しないことがわかっています。テクスチャ参照をグローバル変数として定義する必要があります。ホストコードに属していますか?コンパイルされるファイルの拡張子は .cu です。
2) レイヤード テクスチャを使用して正しく動作するプログラムがあります。次に、2 つの方法で __CUDA_ARCH__ マクロを追加します。
#ifdef __CUDA_ARCH__
texture<float, cudaTextureType2DLayered> depthmapsTex;
#endif
と
#ifndef __CUDA_ARCH__
texture<float, cudaTextureType2DLayered> depthmapsTex;
#endif
どちらも機能しないことがわかりました。どちらも同じエラーです。エラー: 識別子 "depthmapsTex" は未定義です。MACRO __CUDA_ARCH__ が定義されていて、同時に定義されていないように見えます。これは、コンパイルに 2 つのステージがあり、ステージの 1 つだけが __CUDA_ARCH__ を参照できるという事実に関連していると思われますが、正確に何が起こったのかはわかりません。
プロジェクトのセットアップとコードのコンパイルには、cmake + Visual Studio 10 を使用します。ここに何か問題があるのではないかと思います。
十分な情報を提供できたかどうかわかりません。どんな助けでも大歓迎です。ありがとうございました!
編集: Nvidia CUDA SDK 5.0 で __CUDA_ARCH__ を使用する例を見つけようとしました。次のコードは、grabcutNPP プロジェクトのファイル GPUHistogram.h の 20 行目から 24 行目までを抜粋したものです。
#if __CUDA_ARCH__<300
#define PARALLEL_HISTS 64
#else
#define PARALLEL_HISTS 8
#endif
216 行目から 219 行目までは、MACRO PARALLEL_HISTS を使用しています。
int gpuHistogramTempSize(int n_bins)
{
return n_bins * PARALLEL_HISTS * sizeof(int);
}
しかし、ここで問題があることがわかりました。PARALLEL_HISTS が正しく定義されていません。最初の句を#if defined(__CUDA_ARCH__)&& __CUDA_ARCH__<300に変更すると、CUDA_ARCHが定義されていないことがわかりました。CUDA SDK の例ではCUDA_ARCHを間違った方法で使用していますか?