我的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来说是相同的)到一个更大的缓冲区来为所有这些做一个读/写/映射/取消映射吗?
答案 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内存控制器旨在提供良好的峰值吞吐量和高延迟,因此大量异步内存传输通常更快。尽量避免任何同步操作,它们冻结了整个事情。