2012-03-17 91 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