【问题标题】:OpenCL overlap communication and computationOpenCL 重叠通信和计算
【发布时间】:2013-08-19 07:06:51
【问题描述】:

OpenCL NVIDIA SDK 中有一个示例 oclCopyComputeOverlap,它使用 2 个队列交替传输缓冲区/执行内核。 在此示例中使用映射内存。

**//pinned memory** 
cmPinnedSrcA = clCreateBuffer(cxGPUContext, CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, szBuffBytes, NULL, &ciErrNum);
**//host pointer for pinned memory**
fSourceA = (cl_float*)clEnqueueMapBuffer(cqCommandQueue[0], cmPinnedSrcA, CL_TRUE,    CL_MAP_WRITE, 0, szBuffBytes, 0, NULL, NULL, &ciErrNum);
...
**//normal device buffer**
cmDevSrcA = clCreateBuffer(cxGPUContext, CL_MEM_READ_ONLY, szBuffBytes, NULL, &ciErrNum);
**//write half the data from host pointer to device buffer**
ciErrNum = clEnqueueWriteBuffer(cqCommandQueue[0], cmDevSrcA, CL_FALSE, 0, szHalfBuffer, (void*)&fSourceA[0], 0, NULL, NULL);

我有两个问题: 1)是否需要使用固定内存来发生重叠? fSourceA 不能只是一个简单的主机指针,

fSourceA = (cl_float *)malloc(szBuffBytes);
...
//write random data in fSourceA

2) 内核中不使用 cmPinnedSrcA,而是使用 cmDevSrcA。设备上的缓冲区占用的空间不是还在增长吗? (cmPinnedSrcA 所需的空间添加到 cmDevSrcA 所需的空间)

谢谢

【问题讨论】:

    标签: opencl communication nvidia overlap computation


    【解决方案1】:

    如果我正确理解了您的问题:

    1) 是的,您可以使用任何类型的内存(固定、主机指针等),并且仍然会发生重叠。只要您使用两个队列并且硬件/驱动程序支持它。

    但是,队列总是不同步的。并且在这种情况下,需要事件来防止复制队列复制运行内核的不一致数据。

    2)如果您使用固定内存,我认为您使用的内存是 2 倍,一个用于固定,另一个用于临时副本。但我不是100%肯定,也许只是一个指针。

    【讨论】:

    • 非常感谢您的回答。但我仍然不明白以下内容:1)为什么他在那里使用固定内存,因为架构是这样的:创建3个固定缓冲区,pinnedA,pinnedB,pinnedResult;创建固定指针,flA,flB,flResult;创建 3 个普通缓冲区,A、B、Result;将主机指针 flA 写入队列到 A(大小的一半),从 flB 写入队列 1 中的 B(大小的一半);将内核 K1 入队队列 1,从 flA 写入队列到 A(另一半),从 flB 写入队列2中的B(另一半);
    • 队列 1 中从 Result(前半部分)读取到 flResult 的队列,队列 2 中的内核 K2 队列;入队读取队列 2 中的 Result(另一半)。内核仅使用 A、B、Result 作为缓冲区。 2)我指的是固定缓冲区的大小(pinnedA、pinnedB、pinnedResult),它增加了其他缓冲区的大小(A、B、Result)。无论如何,再次感谢您这么快回答
    • 我不太了解 pinned 的工作原理。但是这种使用方法是固定内存的典型使用方法。
    猜你喜欢
    • 2019-03-06
    • 2016-05-06
    • 2018-05-06
    • 2012-12-07
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    相关资源
    最近更新 更多