为了运行 cudaMemcpy,我编写了一个从 .cpp 文件调用的方法。方法如下:
void copy_to_device(uint32_t *host, uint32_t *device, int size)
{
cudaError_t ret;
ret = cudaMemcpy(device, host, size*sizeof(uint32_t), cudaMemcpyHostToDevice);
if(ret == cudaErrorInvalidValue)
printf("1!\n");
else if(ret == cudaErrorInvalidDevicePointer)
printf("2!\n");
else if(ret == cudaErrorInvalidMemcpyDirection)
printf("3!\n");
}
我的 .cpp 文件这样调用它:
uint32_t *input_device;
device_malloc(input_device, INPUT_HEIGHT*INPUT_WIDTH);
uint32_t *oneDinput = TwoDtoOneD(input, INPUT_HEIGHT, INPUT_WIDTH);
copy_to_device(oneDinput, input_device, INPUT_HEIGHT*INPUT_WIDTH);
TwoDtoOneD 所做的就是接受一个二维数组并将其转换为一维数组并返回它。每当我尝试使用 copy_to_device
方法时,它都会返回 cudaErrorInvalidValue NVIDIA 的网站上没有详细记录。你们碰巧知道我传递给我的函数的参数有什么问题导致了这个错误吗?它在内核执行期间导致问题。如果您需要更多详细信息,请询问。
这是方法device_malloc
:
void device_malloc(uint32_t *buffer, int size)
{
cudaMalloc((void **) &buffer, size*sizeof(uint32_t));
}
最佳答案
问题出在这里:
uint32_t *input_device;
device_malloc(input_device, INPUT_HEIGHT*INPUT_WIDTH);
无论 device_malloc
做什么,它都不会修改 input_device
值。也就是说,除非第一个参数是对指针的引用,但我敢打赌它不是。
您需要将device_malloc
的第一个参数更改为指向指针的指针,然后这样调用它:
device_malloc(&input_device, INPUT_HEIGHT*INPUT_WIDTH);
或者让 device_malloc
返回一个指向已分配内存的指针。
为了更直接地回答您的问题,cudaMemcpy
返回错误,因为它的第一个参数 device
不是有效的设备指针,CUDA 运行时有一种检查方法.由于上述问题,您从未对其进行初始化,因此它可能拥有垃圾值。
作为旁注且与问题无关,您可能希望使用 cudaGetErrorString
函数来更方便地打印状态。
关于c++ - cudaMemCpy 返回 cudaInvalidData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26917762/