【发布时间】:2013-10-10 19:01:33
【问题描述】:
我了解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 卡)。
【问题讨论】:
-
请创建一个简单的完整代码来重现错误。 SO 期望:“有关您编写的代码问题的问题必须在问题本身中描述具体问题 - 并包括有效的代码来重现它。请参阅 SSCCE.org 以获得指导” 您尚未提供 SSCCE.org 代码。请注意,我并不是要您将所有代码转储到这个问题中 - 只是一个简单的复制器。您的前提很简单 - 一个模板化函数或内核调用其他模板化函数。为你正在做的事情创建一个简单的复制器。
-
@mrei - 这对我有用 - gist.github.com/eugeneo/e681bf73020ddf0b5705
-
@RobertCrovella 我的问题比其他任何问题都更具概念性。如何创建这些调用?模板函数的原型放在哪里?内核对模板函数的调用是这样的 `if (hstate->sim->ignoreAdetection == 1) { MCMLKernel>>(DeviceMem, tstates); } else { MCMLKernel>>(DeviceMem, tstates);'
-
@Eugene 我要试试。基本上我必须从标题中移动函数,对吧?
-
您可以将内核放在另一个头文件中(从编译器的角度来看,都是一样的)。我更新了要点。
标签: c++ cuda header nsight template-function