我正在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不知何故这样做但我无法理解。
答案 0 :(得分:2)
注释具有非常好的指针,但作为示例,您可以创建一个对象,允许您使用[]
运算符直接写入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];
输出:
从设备中获取:8
从设备获取:7
设置在设备中:6 0
在设备中设置:5 0
想法是你的operator[]
没有返回引用,而是返回一个临时对象,它能够处理'read'(使用转换运算符)和'writes'(使用赋值运算符)
(第二个重载是允许链式分配,因为如果你不首先从unsigned int
分配,第一个不会被自动拾取。)