我理解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实例化期间从编译器获得的错误:
其他细节。所有这些功能都是CUDA内核功能。 MCMLKernel
是__global__
内核,其调用的其余函数是__device__
内核。我正在使用Nsight Eclipse Edition和计算能力1.3 GPU(四张Tesla C1060卡)。
答案 0 :(得分:1)
__device__ void RestoreThreadState(...);
是一个前向声明,意味着在同一个翻译单元中有一个正确的定义(它甚至可能在函数调用之下)。
__device__ void RestoreThreadState(...) {}
是无操作函数的定义。
__device__ int HitBoundary(PhotonStructGPU *photon);
是前瞻性声明。你提供定义吗?
<强>更新强>
Here's the Gist基于您提供的代码段。我将内核,设备功能和类型声明保存在3个单独的标题中。我可以编译它(虽然显然它不能运行)
答案 1 :(得分:0)
我像这样创建了被调用函数的原型
__device__ void RestoreThreadState(SimState *d_state, GPUThreadStates *tstates,
PhotonStructGPU *photon,
UINT64 *rnd_x, UINT32 *rnd_a,
UINT32 *is_active);
但是,以Eugene给出的例子应该是这样的(不是原型!见其他答案)
__device__ void RestoreThreadState(SimState *d_state, GPUThreadStates *tstates,
PhotonStructGPU *photon,
UINT64 *rnd_x, UINT32 *rnd_a,
UINT32 *is_active){}
请注意最后的{}
。
接下来在代码中我调用实际返回值的函数
__device__ int HitBoundary(PhotonStructGPU *photon);
从相同的MCMLKernel
模板函数调用。它给了我一个警告:
更新:在另一个源文件 kernel.cu 中,我有以下声明和定义(我有多个定义问题的原因):
__device__ void RestoreThreadState(SimState *d_state, GPUThreadStates *tstates,
PhotonStructGPU *photon,
UINT64 *rnd_x, UINT32 *rnd_a,
UINT32 *is_active)
{
UINT32 tid = blockIdx.x * NUM_THREADS_PER_BLOCK + threadIdx.x;
*rnd_x = d_state->x[tid];
*rnd_a = d_state->a[tid];
photon->x = tstates->photon_x[tid];
photon->y = tstates->photon_y[tid];
photon->z = tstates->photon_z[tid];
photon->ux = tstates->photon_ux[tid];
photon->uy = tstates->photon_uy[tid];
photon->uz = tstates->photon_uz[tid];
photon->w = tstates->photon_w[tid];
photon->sleft = tstates->photon_sleft[tid];
photon->layer = tstates->photon_layer[tid];
*is_active = tstates->is_active[tid];
}
摘要:我有四个源文件
除 main.cu 外,每个源文件都有一个关联的标题
我想在 main.cu 中转发声明要使用的函数。
一切都很好,直到我进入模板函数,它调用 kernel.cu 和 rng.cu 中的函数。