2

私の問題はこのリンクに非常に似ていますが、修正できません。

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を間違った方法で使用していますか?

4

2 に答える 2

1

エレガントな解決策があるかもしれない正確な問題を理解しているかどうかはわかりません。これは、私が過去に使用したエレガントでないブルートフォースアプローチです。署名は同じで名前が異なる2つのカーネルを作成します(例:foo_sm10()、foo_sm20()、2つの別々の.cuファイル。1つのファイルをsm_10用にコンパイルし、もう1つのファイルをsm_20用にコンパイルします。計算機能に依存しない共通コードをに移動します。ヘッダーファイルを作成し、前述の両方の.cuファイルからインクルードします。ホストコードで、アーキテクチャに依存するカーネルを呼び出す関数ポインターを作成します。計算機能に基づいて、適切なアーキテクチャに依存するカーネルへの関数ポインターを初期化します。実行時に検出されました。

于 2012-12-20T20:47:09.790 に答える
0

GPUのコンピューティング機能を把握したい場合は、次のような方法を試すことができます。

int devID;    
cudaDeviceProp props;
CUDA_SAFE_CALL( cudaGetDevice(&devID) );
CUDA_SAFE_CALL( cudaGetDeviceProperties(&props, devID) );

float cc;
cc = props.major+props.minor*0.1;
printf("\n:: CC: %.1f",cc);

しかし、私はあなたの問題をどのように解決するのか分かりません。

于 2012-12-20T19:43:52.527 に答える