CUDA 代码中的模板用法

Template usage in CUDA code

本文关键字:用法 代码 CUDA      更新时间:2023-10-16

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

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。 如果它是一个常量,模板将如何有用?对于特定类型,它是固定的。我说的对吗?谢谢

这个问题与 CUDA 无关。

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

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

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

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

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