模板函数调用其他函数

时间:2013-10-03 22:10:47

标签: c++ cuda header nsight template-function

我理解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卡)。

2 个答案:

答案 0 :(得分:1)

__device__ void RestoreThreadState(...);是一个前向声明,意味着在同一个翻译单元中有一个正确的定义(它甚至可能在函数调用之下)。

__device__ void RestoreThreadState(...) {}是无操作函数的定义。

__device__ int HitBoundary(PhotonStructGPU *photon);是前瞻性声明。你提供定义吗?

<强>更新

Here's the Gist基于您提供的代码段。我将内核,设备功能和类型声明保存在3个单独的标题中。我可以编译它(虽然显然它不能运行)

答案 1 :(得分:0)

@Eugene提供了这个问题的答案。

我像这样创建了被调用函数的原型

__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模板函数调用。它给了我一个警告:

  • 警告:在非空函数“HitBoundary”
  • 结束时缺少return语句

更新:在另一个源文件 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];
}

摘要:我有四个源文件

  1. main.cu
  2. kernel.cu
  3. rng.cu
  4. mem.cu
  5. main.cu 外,每个源文件都有一个关联的标题

    1. kernel.cuh
    2. rng.cuh
    3. mem.cuh
    4. 我想在 main.cu 中转发声明要使用的函数。

      一切都很好,直到我进入模板函数,它调用 kernel.cu rng.cu 中的函数。