2012-03-17 12 views
0

我必須提取數組的部分並將塊設置爲另一個數組。例如,我有一個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

謝謝。

回答

1

如果您只是想將數據從一個陣列複製到另一個陣列上,則不需要內核。

如果您的設備指針與源數據和主機代碼分配給您的目標指針:

僞代碼:

//source and target device pointers 
double * source_d, target_d; 

//get offseted source pointer 
double * offTarget_d + offset * sizeof(double); 

//copy n elements from offseted source data to target device pointer 
cudaMemcpy(offTarget_d, source_d, n * sizeof(double), cudaMemcpyDeviceToDevice); 

目前還不清楚,如果你只是想複製一維數組的範圍,或者如果您想將二維數組中的每一行的範圍複製到另一個二維數組的目標行中

+0

謝謝,我編輯了我的問題。 – Sayan 2012-03-17 00:34:51

+1

@djmj:一個for循環實際上是一個好主意,但只是沒有一個單元跨度。每個線程的多個副本將比單個副本更有效 - 它有助於隱藏線程調度開銷和安裝成本。 – talonmies 2012-03-17 01:27:04

+0

沒錯,但線程調度的性能成本是多少?大多數消息來源指出,在佔用率達到100%時,應該儘可能多地使用線程來保持GPU的繁忙。 (我假設一個簡單的1D陣列拷貝內核)。內存延遲是一個更大的問題,可以使用100%的佔用率來隱藏。見性能圖表:http://www.cs.berkeley.edu/~volkov/volkov10-GTC.pdf#page=30 – djmj 2012-03-17 02:53:17