Pointers 在CUDA中复制数组

Pointers 在CUDA中复制数组,pointers,memory,cuda,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没有报告任

为什么我的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

}
原型是:

cudaMemcpy  (   void *  dst,
const void *    src,
size_t  count,
enum cudaMemcpyKind     kind     
)   
所以您应该去掉&而不是将dst设为const

因此,改变这一点:

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

float *d_filter;
checkCudaErrors(cudaMemcpy(d_filter,h_filter, sizeof(float) * filterWidth * filterWidth, cudaMemcpyHostToDevice));
改变这一点:

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

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

我想两者都有。这些已经是指针,使用&pass pointer to pointer会导致NVCC出现以下错误:student_func.cu203:错误:const float*const*类型的参数与void*类型的参数不兼容是的,在您的float声明中将其删除为const float**d_filter;并得到以下错误:student_func.cu188:错误:不能将const float*const*类型的值分配给const float类型的实体**