gpt4 book ai didi

c++ - CUDA 矩阵类的 operator() 重载

转载 作者:行者123 更新时间:2023-11-28 07:31:48 24 4
gpt4 key购买 nike

我有 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 利用相同的机制。

谢谢。

最佳答案

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

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

关于c++ - CUDA 矩阵类的 operator() 重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17524215/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com