C++ CUDA矩阵类的运算符()重载
我有CPU和GPU(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矩阵类,我可以通过
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);
}
};