OpenCL缓冲区map / unmap和enqueueWrite带宽

时间:2014-02-09 23:55:40

标签: c++ mapping opencl bandwidth dma

我的opencl C ++包装器存在性能问题,我需要尽可能快地将数据从缓冲区d传输到缓冲区b(使用map / unmap实现pci-e的6GB / s DMA速度)然后复制该数据缓冲a(设备速度约为40GB / s)

*********************************
*       device(discrete gpu)    *
*                               *
*     (enqueueCopyBuffer)       *
*   a <---->b                   *
*********************************
            ^
            |(map/unmap)
            |
***************
*   d------>c *
*  (memcpy)   *
*             *
*    host     *
*             *
***************

我为a,b和c尝试过ALLOC_HOST_PTR,COPY_HOST_PTR,...的许多组合,但无法找到最佳解决方案。

我尝试过的一些内容:

 d---->c (memcpy 10GB/s)
 c----->b(map/unmap CL_ALLOC_HOST_PTR)(6GB/s) ,  b---->a (enqueueCopyBuffer ~5 GB/s) 
                                              (I think  ALLOC makes b host buffer)

 d---->c (memcpy 10GB/s)
 c------>b(map/unmap CL_READ_WRITE)(1.4GB/s) , b---->a (enqueueCopyBuffer 40GB/s)
                     (now b is device buffer but map/unmap is not good and buggy)

 d------>a(enqueueWriteBuf CL_READ_WRITE)(1.7GB/s) 
          (I started the new project with this)
          (multithreaded read/write does not go beyond 2GB/s)

但我需要:

 d----->c(memcpy 10GB/s)
 c----->b(map/unmap CL_???_PTR)(6GB/s) ,  b---->a (enqueueCopyBuffer 40 GB/s)

分离a和b的原因是,内核执行必须使用设备内存。

分离d和c的原因是,我正在对开源项目实施GPU加速,我不想改变项目的阵列完整性。

我必须使用至少十几个a,b,c,d。 2表示速度,1表示压力,......

问题:我必须实现哪种缓冲结构才能达到“瓶颈部分不得低于6GB / s”的目标。我应该将所有的b捆绑在一起(对于c来说是相同的)到一个更大的缓冲区来为所有这些做一个读/写/映射/取消映射吗?

1 个答案:

答案 0 :(得分:1)

您的固定带宽要求非常严格。

如果&amp; b都是设备端缓冲区,我的建议是使用pinned memory technique和简单的CL_MEM_READ_WRITE分配标志。尽管如此,我在PCIe 2.0 x16上获得的最佳结果是大约5.3 GB / s。考虑到内存传输通常只有几微秒,你可以通过主机端的事件等待进行非阻塞内存传输。这种传送时尚任务通常表现出良好的带宽。

通常(对于a,b,c&amp; d缓冲区),我的建议是为每种类型的内存流量使用单独的命令队列,以获得DMA传输的好处。通常,3个命令队列就足够了 - 主机到设备,设备到设备&amp;主机到主机。

GPU内存控制器旨在提供良好的峰值吞吐量和高延迟,因此大量异步内存传输通常更快。尽量避免任何同步操作,它们冻结了整个事情。