我必須提取數組的部分並將塊設置爲另一個數組。例如,我有一個2d數組(1d格式),比如A [32 X 32];我有一個2d數組(1d格式),比如A [32 X 32]。還有另一個數組B [64×64],我想從B的(0,8)開始複製一個8×8塊B,並將它放在A的(8,8)中。提取並設置CUDA中的數組的部分
目前,我可能會使用類似下面的內核的東西,當偏移量通過時獲取一部分數據。類似的也可以用於將塊設置爲更大的陣列。
__global__ void get_chunk (double *data, double *sub, int xstart, int ystart, int rows, int cols, int subset)
{
int i,j;
i = blockIdx.x * blockDim.x + threadIdx.x;
for (j = 0; j < subset; j++)
sub[i*subset+j] = data[i*cols + (xstart*cols + ystart)+j];
}
,我認爲可以用cudamemCpy *(也許cudamemCpyArray(...))的變體來完成相同的,但我不知道該怎麼做。我需要一些代碼示例或關於如何完成的一些指導。
PS我在nvidia論壇上有完全相同的問題,沒有回覆,所以試着在這裏。 http://forums.nvidia.com/index.php?showtopic=223386
謝謝。
謝謝,我編輯了我的問題。 – Sayan 2012-03-17 00:34:51
@djmj:一個for循環實際上是一個好主意,但只是沒有一個單元跨度。每個線程的多個副本將比單個副本更有效 - 它有助於隱藏線程調度開銷和安裝成本。 – talonmies 2012-03-17 01:27:04
沒錯,但線程調度的性能成本是多少?大多數消息來源指出,在佔用率達到100%時,應該儘可能多地使用線程來保持GPU的繁忙。 (我假設一個簡單的1D陣列拷貝內核)。內存延遲是一個更大的問題,可以使用100%的佔用率來隱藏。見性能圖表:http://www.cs.berkeley.edu/~volkov/volkov10-GTC.pdf#page=30 – djmj 2012-03-17 02:53:17