将使用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的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个重复的参数传递给 CUDA 内核

将结构作为参数传递给 CUDA 内核的行为

如何使用底部导航视图和 Android 导航组件将参数传递给片段?

如何将库类或对象传递给片段?

将参数传递给 XML 布局中定义的片段

如何将不同的参数传递给片段 [导航] Android