在CUDA中的设备上移动内存

在CUDA中的设备上移动内存,cuda,Cuda,在CUDA中,移动设备上数据的最快方式是什么 我需要做的基本上是将连续的子行和子列(我在设备上有索引)从行主矩阵复制到新的较小矩阵中,但从我观察到的情况来看,CUDA中的内存访问并不是特别有效,因为看起来核心是优化的,以进行计算,而不是内存 现在,CPU似乎非常擅长执行顺序操作,例如将对齐的内存行从一个位置移动到另一个位置。 我认为有三种选择: 制作一个执行内存复制的内核 在内核外部,为每个位置调用cudaMemcpy(..,设备到设备)(我猜列的速度非常慢) 将内存移到主机上,创建新的较小矩

在CUDA中,移动设备上数据的最快方式是什么

我需要做的基本上是将连续的子行和子列(我在设备上有索引)从行主矩阵复制到新的较小矩阵中,但从我观察到的情况来看,CUDA中的内存访问并不是特别有效,因为看起来核心是优化的,以进行计算,而不是内存

现在,CPU似乎非常擅长执行顺序操作,例如将对齐的内存行从一个位置移动到另一个位置。
我认为有三种选择:

  • 制作一个执行内存复制的内核
  • 在内核外部,为每个位置调用cudaMemcpy(..,设备到设备)(我猜列的速度非常慢)
  • 将内存移到主机上,创建新的较小矩阵并将其发送回设备
现在我可以在我特定的gpu上测试它,但考虑到它的规格,我认为它不具有代表性。一般来说,推荐什么

编辑:

我基本上是将两个矩阵A,B相乘,但我只对X元素相乘感兴趣:

A =[[XX      XX]
    [  XX  XX  ]
    [XX  XX    ]]

B列中有相应的元素。XX始终具有相同的长度,我知道它们的位置(每行有固定数量的元素)。

如果您有一个矩阵存储模式,其中涉及到相应行元素(或相应列元素)之间不同的间距,
cublas
的输入转换或跨步功能都没有帮助,api跨步复制功能(如
cudaMemcpy2D
)也没有帮助


您需要编写自己的内核来收集数据,然后再将其提供给
cublasXgemm
。如果在向量中列出或以其他方式列出了传入数据元素的位置,那么这应该是相当简单的事情。

无论平台如何,通常最好避免移动数据。移动数据主要消耗大量能量。最好将数据移动合并到实际处理中。例如,CUBLAS API函数通常允许程序员指定单个(子)向量和子矩阵。大多数接受向量的函数还允许指定向量元素之间的跨距。如果找不到满足需要的CUBLAS函数,请在自定义处理过程中从适当的位置提取数据。常规访问模式将导致高内存带宽(100s的GB/秒)最终目标是对生成的矩阵进行gemm,因为我不认为我有能力仅使用矩阵所需的子部分重写这样的操作,我觉得最好是先复制然后再复制gemm,而不是自己做低效的矩阵乘法。CUBLAS中的?gemm函数都可以在子矩阵上运行(这就是为什么除了
m
n
k
之外还有
ldc
参数的原因)甚至可以对源矩阵进行隐式转置。目前还不清楚你是如何构造输入矩阵的,或者它们有多大;甚至CUSPARSE也可能适用。如果你能展示展示你正在做的事情的代码,这将是很有帮助的,否则这个问题看起来很广泛,会引起手工的意见,而不是aolsid的答案。几乎没有必要以你询问的方式复制数据。当使用密集矩阵和BLAS/LAPACK风格的线性代数库时,指针算法和交换覆盖了95%的实际情况。我编辑了我的问题。