我试图了解模板的使用方式:
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。如果它是一个常数,模板将如何有用?它针对特定类型而固定。我对吗?谢谢
答案 0 :(得分:1)
这个问题与CUDA无关。
如果以这种方式定义模板,则意味着如果您实例化模板但没有具体提供该参数,则它将default to the value indicated。您仍然可以使用其他值实例化模板,以获得不同的行为。
答案 1 :(得分:0)
只有typename可以用作模板参数。 int const也可以是模板参数。
这很有用,因为这个参数可以在编译时确定,而不是在运行时确定。早期的确定有助于生成更优化的运行时代码。
在您的特定情况下,必须在编译期间确定结构ParallelCounter
的大小。 C ++不接受在运行时之前无法确定其大小的类型。
如果您的代码中未使用模板,则可能必须为struct ParallelCounter
void initCounter()
和SPREAD