CUDA 内核中的重载赋值运算符
Overloading assignment operator in CUDA kernel
要充分利用使用sm_21架构的具有CUDA功能的GPU,需要使用矢量数据类型(如uint2)编写内核。
想象一下内核中的一行,如下所示:
uint2 a = make_uint2 (123);
这工作正常。值 123 存储到 a.x 和 a.y。但是读取写入是很烦人的,尤其是当您必须编写大型代码块并初始化大量变量时。
我习惯于编写纯C代码,所以我不是一个C++极客。也许我正在寻找的东西很简单。
我知道有可能使操作员"超载"。我的问题是:是否也可以重载赋值运算符?
我试过这个:
inline __device__ uint2 operator = (int a)
{
return make_uint2 (a, a);
}
但它失败并显示错误消息:
错误:"运算符="必须是成员函数
任何人?
可以重载赋值运算符,但是(正如错误消息告诉您的那样)它必须是成员函数。这意味着要使用它,您必须创建一个类来充当uint2
的"包装器"。但是,当您这样做时,您很有可能实际上不需要/想要重载operator=
- 相反,您只需创建一个 ctor 从uint2
创建包装器的实例,另一个从int
创建一个包装器实例。这些将用于从您提供的值创建包装器的实例,并将该临时实例分配给目标。代码如下所示:
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,可能会出现有关效率的问题,因此我将预先解决这些问题:在正常情况下,这可能不会产生任何开销。但是,我对 CUDA 的情况以及您是否能够(例如)在上面的代码中使用__device__
不太确定。我的直接猜测可能不是,但说实话,我真的只是不知道 - 几年前我写了一些 CUDA 代码,当时它是新的,但我很确定我从未尝试过这个。我怀疑我是否肯定会改变规则,但如果我这样做了,我就不再记得了。
相关文章:
- 为什么初始化时没有调用重载赋值运算符?
- 在类外重载赋值运算符
- 重载赋值运算符函数和复制构造函数中的错误
- 为多个签名使用相同的代码重载赋值运算符?
- 错误消息:使用复制构造函数和重载赋值运算符
- 类模板中的重载赋值运算符
- C++库类的重载赋值运算符
- 为什么为单个赋值操作调用复制构造函数和重载赋值运算符
- 如何重载赋值运算符以满足 ob1=ob2=ob3(ob1,ob2,ob3 是同一类的对象)
- 带有非类型参数的C++模板类:如何重载赋值运算符
- C++重载赋值运算符在不相关的类中被调用
- C++重载赋值运算符声明中做什么?
- 在c++中操作重载赋值运算符
- 如何避免重载赋值运算符将右值转换为左值
- 重载赋值运算符的问题
- 复制构造函数、重载赋值运算符和deepCopy
- 重载赋值运算符带下标运算符
- 如何在不重载赋值运算符的情况下运行此代码
- 重载赋值运算符 - 多态容器
- 如何重载赋值运算符以允许我的类等于基元类型,例如'int'