C++ CUDA矩阵类的运算符()重载

C++ CUDA矩阵类的运算符()重载,c++,class,cuda,operator-overloading,C++,Class,Cuda,Operator Overloading,我有CPU和GPU(CUDA)矩阵类,我想重载操作符(),以便读取或写入矩阵的各个元素 对于CPU矩阵类,我可以通过 OutType & operator()(const int i) { return data_[i]; } (读)及 (写)。对于GPU矩阵类,我能够通过 __host__ OutType operator()(const int i) const { OutType d; CudaSafeCall(cudaMemcpy(&d,data_+i,sizeof(O

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

对于CPU矩阵类,我可以通过

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

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

__host__ OutType operator()(const int i) const { OutType d; CudaSafeCall(cudaMemcpy(&d,data_+i,sizeof(OutType),cudaMemcpyDeviceToHost)); return d; }
但我在写作上却不能做到这一点。有人能提供一些提示来解决这个问题吗

CPU的写情况返回了代码> > DATAY[i] < /C>,引用作业由构建C++ >代码>运算符=< /COD>执行。我不知道如何才能利用CUDA的相同机制


谢谢。

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

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);
    }
};

非常聪明的解决方案!非常感谢你。只是为了向其他可能感兴趣的用户澄清。此解决方案适用于“阅读”和“写作”案例。再次感谢。
class Matrix
{
    DeviceReferenceWrapper operator ()(int i)
    {
        return DeviceReferenceWrapper(data + i);
    }
};