我正在尝试编写一个简单的包装类来将数据移入/移出设备内存,但是当我尝试将数据从设备复制回主机时,我在调用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
但我每次都会遇到同样的错误。上面的代码出了什么问题?