我必须提取数组的部分并将块设置为另一个数组。例如,我有一个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