CUDA代码中的模板用法

时间:2013-09-20 14:15:16

标签: c++ cuda

我试图了解模板的使用方式:

template <uint32_t N_ATOMIC=32>
struct ParallelCounter {
public:
  uint32_t count[N_ATOMIC];

   // spread the counts across the counter
  __device__ __host__ void set(uint32_t x) {
    for(int i=0; i < N_ATOMIC; i++) count[i]=x/N_ATOMIC;

  } 

};



#ifndef SPREAD
#define SPREAD 32
#endif
__device__ ParallelCounter<SPREAD> myCounter;
__global__ void initCounter() {
  int tid = threadIdx.x + blockIdx.x * blockDim.x;

  if(tid == 0)
    myCounter.set(0);
}

到目前为止,我见过的模板上的所有示例都在&lt; &GT;在第一行上面。但是为什么我们这里有一个常数uint32_t N_ATOMIC = 32。如果它是一个常数,模板将如何有用?它针对特定类型而固定。我对吗?谢谢

2 个答案:

答案 0 :(得分:1)

这个问题与CUDA无关。

如果以这种方式定义模板,则意味着如果您实例化模板但没有具体提供该参数,则它将default to the value indicated。您仍然可以使用其他值实例化模板,以获得不同的行为。

答案 1 :(得分:0)

只有typename可以用作模板参数。 int const也可以是模板参数。

这很有用,因为这个参数可以在编译时确定,而不是在运行时确定。早期的确定有助于生成更优化的运行时代码。

在您的特定情况下,必须在编译期间确定结构ParallelCounter的大小。 C ++不接受在运行时之前无法确定其大小的类型。

如果您的代码中未使用模板,则可能必须为struct ParallelCounter

的不同值编写一系列void initCounter()SPREAD