1

我试图了解模板是如何在这里使用的:

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);
}

到目前为止,我看到的所有模板示例在上面第一行的 < > 中都有一些变量。但是为什么我们在这里有一个常量 uint32_t N_ATOMIC=32 。如果它是一个常数,那么模板有什么用处?它针对特定类型是固定的。我对吗?谢谢

4

2 回答 2

1

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

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

在您的特定情况下,结构的大小ParallelCounter必须在编译时确定。C++ 不会接受在运行时才能确定大小的类型。

如果您的代码中没有使用模板,您可能需要为不同的值编写一系列struct ParallelCountervoid initCounter()SPREAD

于 2013-09-20T14:26:05.183 回答
1

这个问题与CUDA无关。

如果您以这种方式定义模板,则意味着如果您实例化模板但未专门提供该参数,它将默认为指定的值。您仍然可以使用其他值实例化模板,以获得不同的行为。

于 2013-09-20T14:18:50.167 回答