在CUDA中移动设备上的数据的最快方法是什么?
我需要做的是基本上将连续的子行和子列(我在设备上有索引)从行主矩阵复制到新的小矩阵中,但从我观察到的情况来看,CUDA中的内存访问是不是特别有效,因为看起来核心被优化来进行计算而不是内存 .
现在,CPU似乎非常擅长执行顺序操作,例如将对齐内存行从一个地方移动到另一个地方 .
我看到三个选择:
-
创建一个执行内存复制的内核
-
在内核之外,为每个位置调用cudaMemcpy(..,设备到设备)(对于我猜的列来说非常慢)
-
将内存移动到主机,创建新的较小矩阵并将其发送回设备
现在我可以在我的特定gpu上测试这个,但考虑到它的规格,我认为它不具有代表性 . 一般来说,推荐什么?
编辑:
我基本上将两个矩阵A,B相乘,但我只对X元素的乘法感兴趣:
A =[[XX XX]
[ XX XX ]
[XX XX ]]
使用B列中的相应元素.XX总是具有相同的长度,我知道它们的位置(并且每行有固定的数量) .
1 回答
如果你有一个矩阵存储模式,涉及不同的行元素(或相应的列元素)之间的间距,
cublas
的输入转换或跨步功能都没有帮助,并且api跨越复制功能(例如cudaMemcpy2D
)都不会救命 .在将数据提供给
cublasXgemm
之前,您需要编写自己的内核来收集数据 . 如果传感数据元素的位置在向量中列出或以其他方式列出,那么这应该是相当简单的 .