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 枚) を使用しています。