2013-03-06 58 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