在CUDA中复制数组

时间:2014-11-16 01:27:19

标签: pointers memory cuda

为什么我的cudaMemcpy无效?我把它包装在checkCUDAErrors中,这是我正在上课的调试功能。我的程序没有错误,除了一个:

CUDA error at: student_func.cu:202
invalid argument cudaMemcpy(&d_filter,&h_filter, sizeof(float) * filterWidth * 
filterWidth, cudaMemcpyHostToDevice);
然而,NVCC没有报告任何错误。我哪里错了?

unsigned char *d_red, *d_green, *d_blue;
const float* const *d_filter;

void allocateMemoryAndCopyToGPU(const size_t numRowsImage, const size_t numColsImage,
                                const float* const h_filter, const size_t filterWidth)
{

  checkCudaErrors(cudaMalloc(&d_red,   sizeof(unsigned char) * numRowsImage * numColsImage));
  checkCudaErrors(cudaMalloc(&d_green, sizeof(unsigned char) * numRowsImage * numColsImage));
  checkCudaErrors(cudaMalloc(&d_blue,  sizeof(unsigned char) * numRowsImage * numColsImage));
  d_filter = &h_filter;
  checkCudaErrors(cudaMalloc(&d_filter, sizeof(float) * filterWidth * filterWidth));
  checkCudaErrors(cudaMemcpy(&d_filter,&h_filter, sizeof(float) * filterWidth * filterWidth, cudaMemcpyHostToDevice)); //line with error

}

1 个答案:

答案 0 :(得分:1)

原型是:

cudaMemcpy  (   void *  dst,
const void *    src,
size_t  count,
enum cudaMemcpyKind     kind     
)   

所以你应该摆脱&而不是将dst作为const

所以改变这个:

const float* const *d_filter;

到此:

float *d_filter;

并改变这一点:

checkCudaErrors(cudaMemcpy(&d_filter,&h_filter, sizeof(float) * filterWidth * filterWidth, cudaMemcpyHostToDevice)); //line with error

到此:

checkCudaErrors(cudaMemcpy(d_filter,h_filter, sizeof(float) * filterWidth * filterWidth, cudaMemcpyHostToDevice));