我有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使用相同的机制。
感谢。
答案 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);
}
};