我知道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 版和计算能力 1.3 GPU(四个 Tesla C1060 卡)。