将使用malloc制作的阵列传递给cuda
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将使用malloc制作的阵列传递给cuda相关的知识,希望对你有一定的参考价值。
我对c ++很新,甚至更多cuda。如果这个问题在其他地方明显得到解答,我很抱歉。我尽我所能搜索答案基础,但我能找到的最接近的答案是this one。
然而,这个答案涉及将2d数组传递到cuda内存中。这比我想做的更复杂(我想)。
我知道为了将“标准”数组传递到cuda内核,你可以这样做:
int array[size];
int *pointer;
cudaMalloc((void**) &pointer, size*sizeof(int));
cudaMemcpy(pointer, array, size*sizeof(int), cudaMemcpyHostToDevice);
然后在我的内核中我收到它:
__global__ void kernel(int *array){
int bid = blockIdx.x;
array[i] = whatever; // Fill the array
}
但是我只使用上面的代码遇到了问题。我需要int数组长度为1920 * 1080 * 4字节(图像处理的东西)。但是,当我使用程序崩溃上面的代码生成此大小的数组时。
我从this answer发现它是因为我超过了我的堆栈大小。所以我学会了为这个数组分配空间:
int *differenceArray = (int*)malloc(sizeof(int)*1280*720);
但现在我很困惑如何将其传递给cuda内核。如果我尝试:
CUDA_CALL(cudaMalloc((void**) &differenceArray, 1280*720*sizeof(int)));
CUDA_CALL(cudaMemcpy(differenceArray, 1280 * 720*sizeof(int), cudaMemcpyHostToDevice));
我收到此错误:
error : argument of type "unsigned int" is incompatible with parameter of type "const void *"
任何帮助将非常感激!谢谢!
答案
首先研究memcpy
的工作原理。您以概念上类似的方式使用cudaMemcpy
。前3个参数基本相同。
你遇到了堆栈问题:
int array[size];
所以正确的做法不是这样的:
int *differenceArray = (int*)malloc(sizeof(int)*1280*720);
但是这个:
int *array = (int*)malloc(sizeof(int)*1280*720);
(当然删除了之前对array
的定义)。
随着这种变化,cudaMemcpy
操作看起来像这样:
int *differenceArray;
CUDA_CALL(cudaMalloc((void**) &differenceArray, 1280*720*sizeof(int)));
CUDA_CALL(cudaMemcpy(differenceArray, array, 1280 * 720*sizeof(int), cudaMemcpyHostToDevice));
// (dev ptr) <--- (host ptr)
以上是关于将使用malloc制作的阵列传递给cuda的主要内容,如果未能解决你的问题,请参考以下文章