【问题标题】:cudaMemCpy returning cudaInvalidDatacudaMemCpy 返回 cudaInvalidData
【发布时间】:2014-11-13 20:26:28
【问题描述】:

为了运行 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 所做的只是接收一个 2D 数组并将其转换为 1D 数组并返回它。每当我尝试使用copy_to_device 方法时,它都会返回cudaErrorInvalidValue,这在NVIDIA 的网站上没有很好的记录。你们碰巧知道我传递给导致此错误的函数的参数有什么问题吗?它会在内核执行期间引起问题。如果您需要更多详细信息,请询问。

这是device_malloc的方法:

void device_malloc(uint32_t *buffer, int size)
{
    cudaMalloc((void **) &buffer, size*sizeof(uint32_t)); 
}

【问题讨论】:

  • @Tae-SungShin 我不讨厌,但在我的 cuda 代码中,我 #include 定义了 uint32_t。

标签: c++ cuda memcpy


【解决方案1】:

问题出在这里:

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 功能更方便地打印出状态。

【讨论】:

  • 感谢您的帮助!我在原始帖子中添加了方法device_malloc 的定义。我确实在cudaMalloc 的第一个参数中给它一个指向该指针的引用。你说的是这个吗?
  • 这不是对指针的引用;这是指针本身。由cudaMalloc 分配给buffer 的值未在调用代码中分配给input_device
  • 是的,就是这样。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 2011-08-02
相关资源
最近更新 更多