在CUDA中提取和设置数组的部分

时间:2012-03-17 00:02:49

标签: cuda memcpy

我必须提取数组的部分并将块设置为另一个数组。

例如,我有一个2d数组(1d格式),如A [32 X 32];还有另一个数组B [64 X 64],我想复制一个8X8的B块,从B的(0,8)开始,并将它放在A的(8,8)中。

目前,我可能会使用类似下面的内核,以便在传递偏移时获取一部分数据。类似的也可以用于将块设置为更大的阵列。

__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 个答案:

答案 0 :(得分: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);

目前尚不清楚是否只想复制一维数组的范围,或者是否要将二维数组中每行的范围复制到另一个二维数组的目标行 < / p>