gpt4 book ai didi

c++ - 在 CUDA 内核中重载赋值运算符

转载 作者:行者123 更新时间:2023-11-30 02:04:49 25 4
gpt4 key购买 nike

要充分利用使用 sm_21 架构的支持 CUDA 的 GPU,需要使用 vector 数据类型(如 uint2)编写内核。

想象一下内核中的一行看起来像这样:

uint2 a = make_uint2 (123);

这很好用。值 123 存储在 a.x 和 a.y 中。但是读取写入很烦人,尤其是当您必须编写大型代码块并初始化大量变量时。

我习惯于编写纯 C 代码,所以我不是 C++ 极客。也许我正在寻找的东西很简单。

我知道可以“重载”运算符。我的问题是:是否也可以重载赋值运算符?

我试过这个:

inline __device__ uint2 operator = (int a)
{
return make_uint2 (a, a);
}

但它失败并显示错误消息:

error: "operator=" must be a member function

有人吗?

最佳答案

可以重载赋值运算符,但是(正如错误消息告诉您的那样)它必须是一个成员函数。这意味着要使用它,您必须创建一个类作为 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__。我的直接猜测可能不是,但老实说我真的不知道——我在几年前写了一个 little CUDA 代码,当时它是新的,但我很确定我从未尝试过这个.我怀疑我是否肯定会制定新规则,但如果我这样做了,我将不再记得它们。

关于c++ - 在 CUDA 内核中重载赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10142930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com