CUDA 代码中的模板用法
Template usage in CUDA code
我试图了解模板在这里的使用方式:
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 ParallelCounter
和void initCounter()
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 代码中的"sprintf"用法是否需要释放内存?
- 在这个C++代码中捕获的用法是什么
- C-do{.}while(0);可以从代码中删除,不包括嵌套的if-else用法
- 用于实例化模板化代码的显式习惯用法 - 不包括其源代码
- 工会用法和混乱的代码
- CUDA 代码中的模板用法
- 语义问题 "Attempt to use a deleted function" 遇到使用 std::线程用法编译 c++ 代码
- c++代码中void的奇怪用法