c ++中的模板常量究竟是什么,以及我们如何使用它们?

时间:2014-10-04 20:11:00

标签: c++ cuda

这是我的代码:

template<int BlockWidth, int FilterWidth>
__global__ gaussian_blur(uchar4 inputImage, uchar4 outputImage, 
                         int numRows, int numCols, 
                         int BLOCKWIDTH, int FILTERWIDTH)
{...}

int main()
{
    ...


    const int blockWidth = 16;
    const int filerWidth = 9;
    gaussian_blur<<<gridDimension, blockDimension>>>(d_input, d_output, 
                                                     numRows, numCols, 
                                                     blockWidth, filterWidth);
    ...
}

编译器只是说它无法匹配参数。经过一段时间的搜索,我也试过了:

gaussian_blur<<<gridDimension, blockDimension>>><int, int>(d_input, d_output, 
                                                           numRows, numCols, 
                                                           blockWidth, filterWidth);

但它仍然无效。

顺便说一句,您是否也可以解释为什么在尝试从硬件中挤出性能时会使用模板常量?

2 个答案:

答案 0 :(得分:3)

这些不是模板参数;三重转换是NVIDIA非标准CUDA语法的一部分。您应该删除模板声明,您提供的参数的使用由CUDA编译器处理。

(具体来说,摆脱template<int BlockWidth, int FilterWidth>。调用设备(或全局)函数时用<<<传递的参数由nvcc处理。)

答案 1 :(得分:1)

应在CUDA <<<...>>>语法之前指定模板参数:

const int blockWidth = 16;
const int filerWidth = 9;
gaussian_blur<blockWidth, filerWidth><<<gridDimension, blockDimension>>>(
                                                 d_input, d_output, 
                                                 numRows, numCols, 
                                                 blockWidth, filterWidth);