c++ - 将数组/指针作为模板参数传递

标签 c++ arrays templates parameters cuda

我正在尝试创建以下类型的模板函数:

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/

相关文章:

c++ - 当 key 存在时,RegOpenKey/RegOpenKeyEx 在 Windows 7 上返回 2(未找到文件)

java - 将 double 数组中的一些元素复制到 double 数组列表

c++ - DLL 共享数据的推荐方式是什么?

c++ - 尝试编译跨平台 C++ 代码。未定义对 C 函数的引用

java - 需要 Java 数组帮助使用扫描仪类输出平均值和排序方法

JavaScript 将数组值除以 Int

c++ - "Unable to resolve template based identifier X"- 从模板类调用模板参数类的方法 (C++)

C# 泛型与 C++ 模板的比较

c++ - 使用透明 std 函数对象时,我们还需要写空尖括号吗?

c++ - 对成对的 vector 进行排序