2013-03-06 55 views
0

我有一个如下设计的数组:color[100][3]。我想在内核中填充这个数组,然后在主机代码中使用它。我怎样才能做到这一点?我只需要拨打cudaMemcpy()来发送并获取。在CUDA内核memcpy调用中使用array [i] [j]

这就是我要发送到设备:

err = cudaMallocPitch(&d_color, &pitch, 3 * sizeof(unsigned char),100); 

这是我现在必须从设备(编者)得到它:

err = cudaMemcpy2D(color,100*3,d_color,pitch,3 *sizeof(unsigned char),3, cudaMemcpyDeviceToHost); 

cudaMemcpy2D的最后调用抛出

“无效参数”

:错误

如何获得color[100][3]阵列的音高?我应该假设它是填充的3+1

+0

为什么不使用普通的'cudaMalloc()'和'cudaMemcpy()'?你只需要一个指向内存的指针。 – KiaMorot 2013-03-06 11:11:11

+0

将你的二维数组映射到一维数组中。在调用内核时传递另一个参数,它告诉你,一个维度的长度是多少,例如'color [100 * 3]',并将100传递为dimSize,并且可以使用'color [i/* 53 */+ dim/* 2nd */* N/* 100 * /] = 0;' – 2013-03-06 11:15:22

+0

我想这个数组是Cimg框架的一部分。我必须按原样使用它,因为后面的代码以这种方式使用数组。 – 2013-03-06 11:37:54

回答

0
err = cudaMemcpy2D(
     color, 
     pitch, 
     d_color, 
     sizeof(unsigned char) * 100 * 3, // <<< WRONG - source pitch, not it's size! 
     3 * sizeof(unsigned char), 
     100 * sizeof(unsigned char), // <<< Shouldn't it be number of rows, not column size in bytes? 
     cudaMemcpyDeviceToHost 
     ); 

顺便说一句 - 不是更容易使用uchar3类型?

+0

啊是的,我混合了一些参数。我做了以下更改,我仍然遇到seg错误:err = cudaMemcpy2D(color,100 * 3,d_color,pitch,3 * sizeof(unsigned char),3,cudaMemcpyDeviceToHost); – 2013-03-06 11:36:56

+0

我如何获得颜色[100] [3]阵列的音高? – 2013-03-06 11:42:13

+0

我会使用uchar3,但CImg库和这个特定的数组被用作框架中的无符号字符。我试图升级框架中的例程以使用CUDA GPU。 – 2013-03-06 11:48:29