为CUDA矩阵类重载operator()

时间:2013-07-08 10:20:07

标签: c++ class cuda operator-overloading

我有CPU和GPU(CUDA)矩阵类,我想重载operator(),以便我可以读取或写入矩阵的各个元素。

对于CPU矩阵类,我能够通过

完成
OutType & operator()(const int i) { return data_[i]; }

(阅读)和

OutType operator()(const int i) const { return data_[i]; }

(写)。对于GPU矩阵类,我能够通过

重载operator()以进行读取
__host__ OutType operator()(const int i) const { OutType d; CudaSafeCall(cudaMemcpy(&d,data_+i,sizeof(OutType),cudaMemcpyDeviceToHost)); return d; }

但是我无法做同样的写作。有人可以提供任何提示来解决这个问题吗?

CPU的写入案例返回data_[i]的引用,因此赋值作业由构建C ++ operator=执行。我无法弄清楚如何为CUDA使用相同的机制。

感谢。

1 个答案:

答案 0 :(得分:1)

您可以创建一个单独的类,它具有重载的赋值运算符和类型转换运算符,并模拟引用行为:

class DeviceReferenceWrapper
{
public:
    explicit DeviceReferenceWrapper(void* ptr) : ptr_(ptr) {}

    DeviceReferenceWrapper& operator =(int val)
    {
        cudaMemcpy(ptr_, &val, sizeof(int), cudaMemcpyHostToDevice);
        return *this;
    }

    operator int() const
    {
        int val;
        cudaMemcpy(&val, ptr_, sizeof(int), cudaMemcpyDeviceToHost);
        return val;
    }

private:
    void* ptr_;
};

并在矩阵类

中使用它
class Matrix
{
    DeviceReferenceWrapper operator ()(int i)
    {
        return DeviceReferenceWrapper(data + i);
    }
};