将使用malloc制作的阵列传递给cuda

问题描述 投票:-3回答:1

我对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 *"

任何帮助将非常感激!谢谢!

arrays cuda
1个回答
2
投票

首先研究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)
© www.soinside.com 2019 - 2024. All rights reserved.