提问人:Foobar 提问时间:11/13/2023 最后编辑:Robert CrovellaFoobar 更新时间:11/14/2023 访问量:72
带有模板参数的空结构的目的是什么?
What is the purpose of an empty struct with template arguments?
问:
我正在阅读一些 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_vecs
Vec
VEC_SIZE
VEC_SIZE
定义了专业化,但它们似乎没有多大作用:
// FP16 vector types for Q, K, V.
template<>
struct Vec<uint16_t, 1> {
using Type = uint16_t;
};
答: 暂无答案
评论
Vec
typename Vec<scalar_t, VEC_SIZE>::Type