Pointers 在CUDA中复制数组
为什么我的cudaMemcpy不工作?我将它包装在checkCUDAErrors中,这是我正在使用的类提供的调试函数。我的程序没有错误,只有一个错误: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没有报告任
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类型的实体**