【发布时间】: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。