【问题标题】:Got completely confused on how to OpenCL data transfer对如何进行 OpenCL 数据传输完全感到困惑
【发布时间】:2015-09-12 22:35:00
【问题描述】:

我正在学习 OpenCL 并尝试在一些低延迟场景中使用它,所以我真的很担心内存传输延迟。

根据 NVidia 的 OpenCL 最佳实践指南以及许多其他地方,应避免对缓冲区对象进行直接读/写。相反,我们应该使用 map/unmap 实用程序。在该指南中,给出了这样的演示代码:

cl_mem cmPinnedBufIn = clCreateBuffer(cxGPUContext, CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR, memSize, NULL, NULL);
cl_mem cmDevBufIn = clCreateBuffer(cxGPUContext, CL_MEM_READ_ONLY, memSize, NULL, NULL);
unsigned char* cDataIn = (unsigned char*) clEnqueueMapBuffer(cqCommandQue, cmPinnedBufIn, CL_TRUE, CL_MAP_WRITE, 0, memSize, 0, NULL, NULL, NULL);

for(unsigned int i = 0; i < memSize; i++)
{
    cDataIn[i] = (unsigned char)(i & 0xff);
}

clEnqueueWriteBuffer(cqCommandQue, cmDevBufIn, CL_FALSE, 0, szBuffBytes, cDataIn , 0, NULL, NULL);

在这段代码sn-p中,显式生成了两个缓冲区对象,并显式调用了一个写入设备操作。

如果我的理解是正确的,当你用CL_MEM_ALLOC_HOST_PTRCL_MEM_USE_HOST_PTR 调用clCreateBuffer 时,缓冲区对象的存储是在主机端创建的,可能在DMA 内存中,并且在设备端没有分配存储。所以上面的代码实际上创建了两个独立的存储。如果是这样:

  • 如果我在没有主机端内存的cmDevBufIn 上调用映射缓冲区会发生什么?

  • 对于 CPU 集成 GPU,没有单独的图形内存。尤其是新版AMD APU,内存地址也是同源的。所以看起来创建两个缓冲区对象并不好。集成平台的最佳做法是什么?

  • 有没有办法为不同平台编写单行内存传输代码?或者我必须编写几套不同的内存传输代码,才能为 Nvidia、AMD 独立 GPU、AMD 旧 APU、AMD 新 APU 和 Intel HD 显卡实现最佳性能......

【问题讨论】:

    标签: opencl


    【解决方案1】:

    很遗憾,每个供应商的情况都不一样。

    NVIDIA 声称他们的最佳带宽是当您使用“固定”主机内存的读/写缓冲区时,这可以通过使用 CL_MEM_ALLOC_HOST_PTR 创建一个缓冲区并映射它来实现(我认为您的示例就是这样)。您还应该将其与仅映射和取消映射设备内存进行比较;他们最近的司机在这方面做得更好。

    使用 AMD,您只需映射/取消映射设备缓冲区即可获得全速。它们还有一堆特定于供应商的缓冲区标志,可以使某些场景更快;您应该研究它们,但更重要的是创建基准测试来尝试所有内容,看看哪些方法最适合您的任务。

    对于两个离散设备,您应该为传输操作使用单独的命令队列,以便它们可以与 其他(非依赖)计算操作重叠(查找各种计算重叠示例)。此外,一些高端的离散 GPU 可以在上传另一个缓冲区的同时下载一个缓冲区(使用双 DMA 引擎),因此您可以在下载一批工作的同时计算另一批工作,同时下载结果三分之一。如果写得优雅,这甚至比严格顺序版本的代码多不了多少,但是您必须使用 OpenCL 事件在命令队列之间进行同步。 NVIDIA 有一个 GTC 演讲,您可以观看该演讲,其中展示了如何对每 16 毫秒的视频帧执行此操作。

    使用 AMD 的 APU 和英特尔的集成显卡,“设备”缓冲区的映射/取消映射是“免费的”,因为它位于主内存中。不要在此处使用读/写缓冲区,否则您将支付不必要的传输费用。

    【讨论】:

    • 固定内存在 NVIDIA 系统上更快的原因是,如果您不提供固定内存,驱动程序使用不同(且速度较慢)的代码路径。从理论上讲,所有系统都可以通过使用固定内存来提高性能,因为它可以减少页面错误(和/或使用优化的驱动程序路径)。
    猜你喜欢
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多