我有一些内存已经在设备上分配,它只是一个大小为H * W * sizeof(float)的malloc。
这是代表H * W矩阵。
我有一个代码,我需要交换矩阵的象限。我可以用cudaMemcpy2D来完成这个吗?我是否只需要将spitch和dpitch指定为W * sizeof(float)并只使用指向矩阵每个象限的指针来完成此操作?
另外,当这些cudaMemcpy谈论内存区域不重叠时 - 这是否意味着src和dst根本不能重叠?就像在,如果我有一个10字节宽的数组,我想向左移一次 - 它会失败吗?
由于
答案 0 :(得分:2)
您可以使用cudaMemcpy2D移动子块,这些子块是较大的线性内存分配的一部分。这样做没有问题。非重叠要求是不可协商的,如果您尝试它将失败。源和目标可以来自相同的分配,但源和目标的地址范围不能重叠。如果你需要在有重叠的情况下进行一些“原位”复制,你可能会更好地编写一个内核来执行它(参见SDK中的矩阵转置示例,作为执行此类操作的合理方法)。
答案 1 :(得分:1)
我建议编写一个简单的内核来执行此矩阵操作。我认为编写比使用cudaMemcpy(2D)更容易,并且假设你编写它以获得良好的内存连贯性几乎肯定更快。
最简单的做法是使用不合适的变换(即不同的输入和输出数组)来避免破坏输入矩阵。每个线程只需从其输入偏移量读取并写入变换后的偏移量。
它类似于矩阵转置。 CUDA SDK中有a matrix transpose example。