在CUDA中移动设备上的内存

时间:2015-03-24 17:51:56

标签: cuda

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

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

现在,CPU似乎非常擅长执行顺序操作,例如将对齐内存行从一个地方移动到另一个地方 我看到三个选项:

  • 创建一个执行内存复制的内核
  • 在内核之外,为每个位置调用cudaMemcpy(..,device to device)(对于我猜的列来说非常慢)
  • 将内存移至主机,创建新的较小矩阵并将其发送回设备

现在我可以在我的特定gpu上测试这个,但鉴于其规格,我认为它不具有代表性。一般来说,推荐什么?

编辑:

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

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

与B列中的相应元素.XX总是具有相同的长度,我知道它们的位置(并且每行有固定的数量)。

1 个答案:

答案 0 :(得分:2)

如果你有一个矩阵存储模式,它涉及不同的行元素(或相应的列元素)之间的间距,cublas的输入转换或跨步功能都没有帮助,也没有api跨越复制函数(例如cudaMemcpy2D)将有所帮助。

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