带有模板参数的空结构的目的是什么?

What is the purpose of an empty struct with template arguments?

提问人:Foobar 提问时间:11/13/2023 最后编辑:Robert CrovellaFoobar 更新时间:11/14/2023 访问量:72

问:

我正在阅读一些 C++ CUDA 代码,如下所示:

  using Q_vec = typename Vec<scalar_t, VEC_SIZE>::Type;
  const scalar_t* q_ptr = q + seq_idx * q_stride + head_idx * HEAD_SIZE;
  __shared__ Q_vec q_vecs[THREAD_GROUP_SIZE][NUM_VECS_PER_THREAD];
#pragma unroll
  for (int i = thread_group_idx; i < NUM_VECS_PER_THREAD; i += NUM_THREAD_GROUPS) {
    const int vec_idx = thread_group_offset + i * THREAD_GROUP_SIZE;
    q_vecs[thread_group_offset][i] = *reinterpret_cast<const Q_vec*>(q_ptr + vec_idx * VEC_SIZE);
  }

的定义是:Vec

// A vector type to store Q, K, V elements.
template<typename T, int VEC_SIZE>
struct Vec {};

我试图了解实际存储的内容。 是一个空的结构,所以我认为它实际上并没有存储数据片段。那么,它是否存储指向数据片段的指针?q_vecsVecVEC_SIZEVEC_SIZE

定义了专业化,但它们似乎没有多大作用:

// FP16 vector types for Q, K, V.
template<>
struct Vec<uint16_t, 1> {
  using Type = uint16_t;
};
C++ 模板元编程

评论

2赞 Sam Varshavchik 11/13/2023
几乎可以肯定的是,这个模板定义了一堆专业化。具有模板参数的空结构的目的是声明一个模板,无论模板参数是什么,该模板都会实例化为空结构。
0赞 Ted Lyngmo 11/13/2023
也可能只是充当类型载体。
1赞 Evg 11/13/2023
如果没有专业化,将无法编译。Vectypename Vec<scalar_t, VEC_SIZE>::Type
0赞 Foobar 11/13/2023
@SamVarshavchik定义了专业化,但它们似乎没有多大作用。
0赞 Sam Varshavchik 11/13/2023
好吧,无论他们做什么,那一定是他们的目的。

答: 暂无答案