c++ - cudaMemCpy 返回 cudaInvalidData

标签 c++ cuda memcpy

为了运行 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/

相关文章:

python - SWIG:未完全复制或显示字符串?

c++ - 类变量 : public access read-only, 但私有(private)访问读/写

c++ - 多维数组的目的是什么?

cuda - 限制 GPU 使用的代码

c - 在 CUDA 中实现固定精度数字

c++ - 以这种方式使用 memcpy() 是不好的做法吗?

c++ - 两个 `std::map` 的交集

c++ - 初始化 vector 数组,其中每个 vector 的大小为 0

arrays - 如何使用 CUDA 将多个线程映射到不同元素具有不同线程数的数组元素?

c - 当我尝试向我的结构添加变量时出现段错误