C++ 用于共享内存拷贝的cudaMemcpy2D

C++ 用于共享内存拷贝的cudaMemcpy2D,c++,cuda,C++,Cuda,我在设备上分配了一些内存,这些内存只有一个大小为H*W*sizeof(float)的malloc 这表示一个H*W矩阵 我有一个需要交换矩阵象限的代码。我可以使用cudaMemcpy2D来完成这个任务吗?我是否只需要将spitch和dpitch指定为W*sizeof(float),并使用指向矩阵每个象限的指针来实现这一点 另外,当这些cudaMemcpy谈到内存区域不重叠时——这是否意味着src和dst根本不能重叠?如中所示,如果我有一个10字节宽的数组,我想左移一次,它会失败吗 谢谢您可以使用

我在设备上分配了一些内存,这些内存只有一个大小为H*W*sizeof(float)的malloc

这表示一个H*W矩阵

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

另外,当这些cudaMemcpy谈到内存区域不重叠时——这是否意味着src和dst根本不能重叠?如中所示,如果我有一个10字节宽的数组,我想左移一次,它会失败吗


谢谢

您可以使用cudaMemcpy2D来移动子块,这些子块是较大的倾斜线性内存分配的一部分。这样做没有问题。非重叠需求是不可协商的,如果您尝试它,它将失败。源和目标可以来自同一分配,但源和目标的地址范围不能重叠。如果您需要在有重叠的地方进行一些“原位”复制,那么最好编写一个内核来进行复制(请参阅SDK中的矩阵转置示例,这是一种很好的方法)。

您可以使用cudaMemcpy2D来移动子块,这些子块是较大的倾斜线性内存分配的一部分。这样做没有问题。非重叠需求是不可协商的,如果您尝试它,它将失败。源和目标可以来自同一分配,但源和目标的地址范围不能重叠。如果您需要在有重叠的地方进行一些“原位”复制,那么最好编写一个内核来进行复制(请参阅SDK中的矩阵转置示例,这是一种很好的方法)。

我建议编写一个简单的内核来进行矩阵操作。我认为它比使用cudaMemcpy(2D)更容易写,而且如果你写它来获得良好的记忆连贯性,几乎肯定会更快

可能最简单的方法是进行不适当的变换(即不同的输入和输出数组),以避免对输入矩阵的冲击。每个线程只需读取其输入偏移量,然后写入转换后的偏移量


这类似于矩阵转置。CUDA SDK中有一个函数。

我建议编写一个简单的内核来执行此矩阵操作。我认为它比使用cudaMemcpy(2D)更容易写,而且如果你写它来获得良好的记忆连贯性,几乎肯定会更快

可能最简单的方法是进行不适当的变换(即不同的输入和输出数组),以避免对输入矩阵的冲击。每个线程只需读取其输入偏移量,然后写入转换后的偏移量

这类似于矩阵转置。CUDA SDK中有一个