比如gpu里一段连续的1到100的数据 但我只想N*10处的数据搬到cpu端 ,这个怎么做比较好

  • 1 replies
  • 339 views
*

sisiy

  • *****
  • 203
    • 查看个人资料
比如gpu里一段连续的1到100的数据  但我只想N*10处的数据搬到cpu端,
这个怎么做比较好

比如gpu里一段连续的1到100的数据  但我只想N*10处的数据搬到cpu端,
这个怎么做比较好

这个问题实质上是将显存中的一大段连续内容,中间离散的选出一些数据来,通过PCI-E,回传到内存上。

固然,我们可以直接的开启N次cudaMemcpy*()系列家族的函数,每次传输1个数据,重复N次,每次计算不同的开始传输地址和结束地址,但是这样代价高昂(Copy Engine(DMA控制器)对于小数据量表现不佳的)。

我建议考虑如下实际的方案:
(1)将数据全部通过PCI-E回传到内存,然后再执行一次内存->内存的传输,筛选出来中间你要的数据。注意这样对于过大的数据量依然不太适用(因为PCI-E往往是一个瓶颈)。
(2)上一个手写的kernel,不连续的(不能合并)读取离散的内容,然后回写到一个,page-locked memory所映射成的缓冲区,这样写入将直接通过zero-copy进行PCI-E回传,此时的回传是合并的、连续的。而显存的读取带宽往往比PCI-E高出大约1-2个数量级,这样综合下来,往往是最优的。