要充分利用支持CUDA的GPU使用sm_21架构,需要使用矢量数据类型(如uint2)编写内核。
想象一下内核中的一行如下所示:
uint2 a = make_uint2 (123);
这很好用。值123存储到a.x和a.y.但是读取写操作很烦人,特别是当你必须编写大型代码块并初始化大量变量时。
我习惯于编写普通的C代码,所以我不是C ++的极客。也许我正在寻找的东西非常简单。
我知道可以“重载”操作员。我的问题是:是否有可能重载赋值运算符?
我试过了:
inline __device__ uint2 operator = (int a)
{
return make_uint2 (a, a);
}
但它失败并显示错误消息:
错误:“operator =”必须是成员函数
任何?
答案 0 :(得分:4)
可以重载赋值运算符,但是(正如错误消息告诉你的那样)它必须是成员函数。这意味着要使用它,你必须创建一个类作为uint2
的“包装器”。然而,当你这样做时,你实际上不需要/想要重载operator=
的可能性非常大 - 相反,你只需要创建一个ctor来创建一个包装器的实例{{1另一个来自uint2
的人。这些将用于从您提供的值创建包装器的实例,并将该临时实例分配给目标。代码看起来像这样:
int
特别是考虑到您正在使用CUDA,可能会出现有关效率的问题,因此我会提前解决这些问题:在正常情况下,这可能不会产生任何开销。但是,我不太确定CUDA的情况,以及你是否能够(例如)在上面的代码中使用class uint_2 {
uint2 value;
public:
uint_2(uint2 init) : value(init) {}
uint_2(int init) : value(make_uint2(init)) {}
operator uint2() { return value; }
};
。我的直接猜测可能不是,但说实话,我真的只是不知道 - 几年前我写了一个小 CUDA代码,当时它是新的,但我很确定我从来没有试过这个。我怀疑我是否一直在制定规则,但如果我这样做了,我就不再记得了。