0

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

谢谢。

4

1 回答 1

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);
    }
};
于 2013-07-08T13:05:47.870 回答