gpt4 book ai didi

c++ - 如何在cuda程序中实现[]运算符重载?

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

我正在 Cuda 中实现一个 device_vector,我正在从著名的库中汲取灵感 Thust .

现在要访问和修改 device_vector (v) 中的元素,我需要执行 v[N] = x。为此,我需要重载 [] 运算符。

这是用于重载 [] 运算符的代码:

T& operator[] (unsigned int index)
{
if (index >= numEle)
return ptr[0];
else
return ptr[index];
}

问题是:要修改设备内存中的任何内存位置,我们需要进行 Cuda 内核调用,而 Cuda 内核调用不能返回任何内容。

就 [] 重载而言,它返回对我们要修改的元素的引用。

我们如何为 Cuda 内核执行此操作?

注意:我知道 Thrust Library 以某种方式做到了这一点,但我无法理解如何做到这一点。

最佳答案

评论有很好的指示,但作为示例,您可以创建一个对象,允许您使用 [] 运算符直接写入 CUDA 数组(或做任何其他事情你选择):

struct CudaVector {

unsigned int get(unsigned int index) {
cout << "Get from device: " << index << endl;
return 0; // TODO read actual value
}
void set(unsigned int index, unsigned int value) {
cout << "Set in device: " << index << " " << value << endl;
// TODO write actual value
}

struct Item {
CudaVector& vector;
unsigned int index;
operator unsigned int() const {
return vector.get(index);
}
unsigned int operator=(unsigned int other) {
vector.set(index, other);
return other;
}
unsigned int operator=(const Item& other) {
return (*this = static_cast<unsigned int>(other));
}
};

Item operator[](unsigned int index) {
return Item{*this, index};
}
};

这就像:

CudaVector vector;
unsigned int foo = vector[8];
vector[5] = vector[6] = vector[7];

输出:

Get from device: 8
Get from device: 7
Set in device: 6 0
Set in device: 5 0

想法是您的 operator[] 不返回引用,而是返回一个临时对象,该对象能够处理“读取”(使用转换运算符)和“写入”(使用赋值运算符)。

(第二个重载允许链式赋值,因为如果您不首先从 unsigned int 赋值,第一个重载将不会被自动拾取。)

关于c++ - 如何在cuda程序中实现[]运算符重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35391622/

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