我正在尝试创建以下类型的模板函数:
template <bool isHorizontal, float* kernel>
__global__ void smoothFilterColumns(const TwImageCUDA_Device* source, TwImageCUDA_Device*
destination)
{
// code...
}
(不用担心 __global__
;这是在 CUDA 上实现的。)
不幸的是,它不允许我像这样创建这个函数的实例:
float ptrKernel[] = {1, 2, 1};
smoothFilterColumns<true, ptrKernel>(dxBuffer->cuda_image, dxOutput->cuda_image);
我已经尝试了各种 float*
和 float[]
,有和没有 const
修饰符。甚至可以创建此类模板吗?
提前致谢。
注意。内核作为模板参数而不是普通函数参数传递,因为这允许我通过展开循环在 CUDA 中创建更高效的代码。
更新 指向 float 的指针作为标准 C++ 的模板参数工作,但显然没有办法让它们与 CUDA 设备函数一起工作,因为它们需要指向设备地址的指针并且不能在外部定义这些指针.如果有人成功了,请告诉我。
最佳答案
我怀疑您能否让它发挥作用。正如其他人指出的那样,C++ 标准规定作为模板参数传递的任何对象或函数都必须具有外部链接(因此未在当前翻译单元的范围内定义)。问题是 CUDA 目前根本不支持外部链接——设备代码中使用的每个符号都必须有内部链接(即在同一个翻译单元中定义)。此限制的根本原因是 CUDA 目前没有设备代码的链接器。
关于c++ - 将数组/指针作为模板参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5592027/