2011-05-16 133 views
0

我有一些内存已分配在设备上,它只是一个大小为H * W * sizeof(float)的单一malloc。cudaMemcpy2D共享内存拷贝

这是表示H * W矩阵。

我有一个代码,我需要交换矩阵的象限。我可以使用cudaMemcpy2D来完成此操作吗?我是否需要将spitch和dpitch指定为W * sizeof(float),并仅使用指向矩阵每个象限的指针来完成此操作?

此外,当这些cudaMemcpy谈论的内存区域不重叠 - 是否意味着src和dst根本不能重叠?如果我有一个10字节宽的阵列,我想向左移一次 - 它会失败吗?

由于

回答

2

可以使用cudaMemcpy2D周边的子块,其是较大的投线性内存分配的一部分移动。这样做没有问题。不重叠的要求是不可谈判的,如果你尝试它,它会失败。源和目标可以来自相同的分配,但源和目标的地址范围不能重叠。如果需要在存在重叠的地方进行一些“原位”复制,则可能会更好地编写内核来执行此操作(请参阅SDK中的矩阵转置示例,这是执行此类操作的一种合理方法)。

1

我建议编写一个简单的内核来完成这个矩阵操作。我认为编写它比使用cudaMemcpy(2D)更容易,而且假设你编写它以获得良好的内存一致性,它几乎肯定会更快。

为避免破坏输入矩阵,可能最容易进行不适当的转换(即不同的输入和输出数组)。每个线程将简单地从其输入偏移量读取并写入转换的偏移量。

它将类似于矩阵转置。 CUDA SDK中有a matrix transpose example