【问题标题】:What is the difference between kernel and program object?内核和程序对象有什么区别?
【发布时间】:2016-12-31 21:04:08
【问题描述】:

我浏览过多种资源:OpenCL Khronos 书籍、GATech 教程、NYU 教程,我还可以浏览更多。但是我还是没有完全理解。 内核和程序对象有什么区别?

到目前为止,对我来说最好的解释是这样的,但这还不足以让我完全理解: 程序对象:程序对象封装了一些源代码(可能带有几个内核函数)及其最后一次成功构建。 KERNEL:内核对象封装了内核的值 内核执行时使用的参数。

也许程序对象就是代码?内核是编译后的可执行文件吗?是这样吗?因为我能理解这样的事情。

提前致谢!

【问题讨论】:

  • 这个解释对我来说也没有意义:内核是在 OpenCL 设备上运行的 OpenCL 函数;程序对象是实现内核的程序源代码和可执行文件。我的脱节是函数和源代码对我来说意味着同样的事情。
  • 我不知道为什么这对你很重要——你似乎对术语很着迷。实际方面很重要,这很清楚——内核是一个可以执行的编译函数;该程序是编译后的代码,可能包含多个内核。所以它是不同抽象级别的对象,与任何编程语言中的程序和函数/例程完全相同。
  • 知道了!这是完全有道理的。谢谢!

标签: opencl gpu gpgpu


【解决方案1】:

程序是一个或多个内核以及可选支持功能的集合。可以从源代码或多种类型的二进制文件(例如 SPIR、SPIR-V、本机)创建程序。在从中选择内核之前,需要为一个或多个设备(使用 clBuildProgram 或 clCompileProgram 和 clLinkProgram)构建一些程序对象(从源代码或中间二进制文件创建)。考虑程序的最简单方法是,它们就像 DLL 和导出内核以供程序员使用。

内核是一个可执行实体(不一定要编译,因为您可以拥有代表硬件的内置内核(例如英特尔硬件上的视频运动估计内核)),您可以绑定它的参数并将它们提交到各种队列中执行。

【讨论】:

  • 非常感谢,我认为 Lubo 的评论和您的回答相结合,让我有了丰富的理解,这是我在书/幻灯片中找不到的。再次感谢!
【解决方案2】:

对于一个 OpenCL 上下文,我们可以创建多个程序对象。首先,我将描述程序对象在 OpenCL 应用程序中的用途。

  • 为程序所在设备的内核编译提供便利 附上
  • 提供用于确定构建错误和查询程序以获取信息的工具

OpenCL 应用程序使用内核对象在设备上并行执行功能。内核对象是从程序对象创建的。一个程序对象可以有多个内核对象。

  • 众所周知,要执行内核,我们需要向它传递参数。内核对象的主要目的就是这个。

为了更清楚地了解它,这是 Aaftab Munshi 等人在“OpenCL 编程指南”一书中给出的类比

一个有助于理解内核对象和程序对象之间区别的类比是,程序对象就像一个动态库,因为它包含内核函数的集合。内核对象就像动态库中函数的句柄。程序对象是从源代码 (OpenCL C) 或已编译的程序二进制文件创建的(稍后会详细介绍)。该程序是为程序对象所连接的任何设备构建的。然后使用内核对象访问编译后的内核函数的属性,将调用入队并设置其参数。

【讨论】:

    猜你喜欢
    • 2011-05-31
    • 2010-09-15
    • 1970-01-01
    • 2019-10-16
    • 2012-07-05
    • 2020-02-12
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多