CUDA:来自类方法的cudaMemcpy中的无效参数

时间:2017-10-14 18:30:43

标签: c++ cuda

我正在尝试编写一个简单的包装类来将数据移入/移出设备内存,但是当我尝试将数据从设备复制回主机时,我在调用cudaMempcy时出现“无效参数”错误。

这是我的代码:

#include <iostream>

#define gpu_chk(ans) { gpu_assert( ( ans ), __FILE__, __LINE__ ); }
inline void gpu_assert( cudaError_t code, const char *file, int line, bool abort=true ) {
   if ( code != cudaSuccess ) {
      fprintf( stderr,"GPUassert: %s %s %d\n", cudaGetErrorString( code ), file, line );
      if( abort ) exit( code );
   }
}

class DevMatrix {
    int nrow;
    int ncol;
    double* dptr;

public:
    DevMatrix( int nrow, int ncol ) : nrow( nrow ), ncol( ncol ) {
        gpu_chk( cudaMalloc( (void**) &dptr, nrow * ncol * sizeof( double ) ) );
    }

    ~DevMatrix() {
        gpu_chk( cudaFree( dptr ) );
    }

    __host__ __device__ double* get() {
#if (defined(__CUDA_ARCH__) && (__CUDA_ARCH__ > 0))
        return dptr;
#else
        double* hptr;
        gpu_chk( cudaMemcpy( hptr, dptr, nrow * ncol * sizeof( double ), cudaMemcpyDeviceToHost ) );
        return hptr;
#endif
    }
};

__global__ void akernel( DevMatrix dm ) {
    int i = blockIdx.x;
    int j = threadIdx.x;
    int idx = ( gridDim.x * i ) + j;
    double* d = dm.get();
    d[idx] = -1;
}

#define ROWS 2
#define COLS 2

int main() {
    DevMatrix dm( ROWS, COLS );
    akernel<<<ROWS,COLS>>>( dm );
    double* hptr = dm.get();
    for( int i = 0; i < ROWS; i++ ) {
        for( int j = 0; j < COLS; j++ ) {
            int idx = ( i * ROWS ) + j;
            std::cout << hptr[idx] << std::endl;
        }
    }
    return 0;
}

在回答其他“无效论证”问题后,我尝试了不同的组合,如hptr,&amp; hptr等。

在cuda-gdb中运行上面的内容,我可以看到hptr和ptr具有我认为正确的类型,即:

(cuda-gdb) p hptr
$1 = (double *) 0x7fffffffdd30
(cuda-gdb) p dptr
$2 = (double *) 0xb00a80000

但我每次都会遇到同样的错误。上面的代码出了什么问题?

0 个答案:

没有答案