0

template functions通常、ヘッダーファイルで宣言および定義されることを理解しています。

私が抱えている問題はtemplate function、他の関数を呼び出すことです。これらの他の関数のプロトタイプは、テンプレート関数自体の前の同じヘッダー ファイルにあります。

コードのその部分:

//header.h

template <int ignoreAdetection>
__global__ void MCMLKernel(SimState d_state, GPUThreadStates tstates)
{
  // photon structure stored in registers
  PhotonStructGPU photon;

  // random number seeds
  UINT64 rnd_x;
  UINT32 rnd_a;

  // Flag to indicate if this thread is active
  UINT32 is_active;

  // Restore the thread state from global memory.
  RestoreThreadState(&d_state, &tstates, &photon, &rnd_x, &rnd_a, &is_active);
...
...
}

関数RestoreThreadStateは、このテンプレート関数から呼び出されるいくつかの関数の最初のものです。その他は for ループ内で呼び出されます。

このテンプレート関数をヘッダー ファイルに含める必要があるかどうかはわかりません。ヘッダー ファイルに含める必要がある場合、これらの他の関数を呼び出すにはどうすればよいですか?

MCMLKernel のインスタンス化中にコンパイラから得られるエラー:

  • エラー: 明示的な型がありません ("int" と見なされます)
  • エラー: 変数 "RestoreThreadState" が初期化されていない可能性があります
  • エラー: タイプ「SimState *」の値を使用してタイプ「int」のエンティティを初期化することはできません
  • エラー: ")" が必要です
  • 警告: 宣言は以前の「RestoreThreadState」と互換性がありません

追加の詳細。この関数はすべて CUDA カーネル関数です。MCMLKernel__global__カーネルであり、それが呼び出す残りの関数は__device__カーネルです。Nsight Eclipse Edition と計算能力 1.3 GPU (Tesla C1060 カード 4 枚) を使用しています。

4

2 に答える 2

1

__device__ void RestoreThreadState(...);前方宣言です。つまり、同じ翻訳単位で適切な定義が続きます (関数呼び出しの下にある場合もあります)。

__device__ void RestoreThreadState(...) {}no-op 関数の定義です。

__device__ int HitBoundary(PhotonStructGPU *photon);前方宣言です。定義を提供しますか?

アップデート

あなたが提供したコードスニペットに基づく要点は次のとおりです。カーネル、デバイス関数、およびタイプの宣言を 3 つの個別のヘッダーに保持しました。コンパイルできます(もちろん実行できませんが)

于 2013-10-04T00:26:02.967 に答える