CUDA kernel return value shortcut

CUDA の kernel 関数からの戻り値を毎回 cudaMemcpy したくない時につかう

template<class T>
class CudaValue
{
private:
    T* ptr;

public:
    CudaValue()
    {
        cudaMalloc(&ptr, sizeof(T));
    }

    ~CudaValue()
    {
        cudaFree(ptr);
    }

    operator T()
    {
        T ret;
        cudaMemcpy(&ret, ptr, sizeof(T), cudaMemcpyDeviceToHost);
        return ret;
    }

    CudaValue& operator=(const T& rhs)
    {
        cudaMemcpy(ptr, &rhs, sizeof(T), cudaMemcpyHostToDevice);
        return this;
    }

    T* get() { return ptr; }

private:
    CudaValue(const CudaValue&);
    CudaValue operator=(const CudaValue&);    
};