【问题标题】:Execution flow on the host just after starting the kernel刚启动内核后在主机上的执行流程
【发布时间】:2012-07-12 07:14:12
【问题描述】:

我有几个问题需要澄清。抱歉,如果它们看起来很基本。

  1. 当我们使用 clEnqueueNDRangeKernel 启动内核时,主机代码实际发生了什么,是等待内核完成还是..?

  2. 假设我们有多个内核,在这种情况下会发生什么?如果其中一个内核完成,主机是否可以从该内核检索结果,而其他内核仍在进行计算。

  3. 我正在阅读 clCreateBuffer (link here) 的 OpenCL 规范。检查标志 CL_MEM_USE_HOST_PTR 的描述。为了您的方便,我把它贴在这里: “表示应用程序希望 OpenCL 实现使用 host_ptr 引用的内存作为内存对象的存储位。”

我无法理解“应用程序”和“opencl 实现”的确切含义。此外,它还说“允许OpenCL 实现缓存缓冲区内容。”

【问题讨论】:

    标签: opencl


    【解决方案1】:
    1. 内核模块入队并异步执行,clEnqueueNDRangeKernel 立即返回,主机程序继续执行。要使此调用同步,请等待来自最后一个可选参数的事件,或调用 clFinish 以等待所有排队的命令。

    2. 如果多个内核属于同一个命令队列,它们会按照它们入队时的顺序依次执行。

    3. 应用程序是指您的代码在主机上运行。 OpenCL implementation 是一个实现 OpenCL 接口的库。有几种 OpenCL 实现,例如 AMD、NVidia 等。

    OpenCL 程序包含三个组件:在 CPU 中运行的主机代码、OpenCL 库(实现)和在 GPU 中运行的内核模块。

    【讨论】:

    • 对于第 2 点:除非使用 CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE 创建命令队列,否则可以保证按顺序执行。
    • 好的,谢谢。因此,如果我在 NDRangeKernel 之后有一个 clEnqueueReadBuffer 并且我没有给出任何等待事件。进一步的 clEnqueueReadBuffer 也是异步的,即不等待指定的事件。因此,在这种情况下,clEnqueueReadBuffer 将如何执行.. 它是否开始以增量方式读取数据,即它读取已由内核处理的数据,并且如果有更多数据被处理并由内核提供,则以类似的方式继续读取。 .. ??
    • 对于第 2 点:同时启动所有内核就足够了,只有单独的命令队列或所有上下文、程序..等必须为每个内核分开?
    • 通常您将多个命令排入同一个命令队列,然后等待最后一个。 clEnqueueReadBuffer 在下一个入队命令开始之前将整个缓冲区读取到 CPU。
    • 几个命令队列对不相关的任务有意义。一个命令队列可用于对某个内存对象(例如图像)进行后续操作。
    猜你喜欢
    • 2012-08-30
    • 1970-01-01
    • 2015-07-24
    • 2015-07-18
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 2017-03-27
    相关资源
    最近更新 更多