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

时间:2016-02-14 12:17:20

标签: c++ cuda

我正在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不知何故这样做但我无法理解。

1 个答案:

答案 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分配,第一个不会被自动拾取。)