内核和程序对象有什么区别?

5
我已浏览了多个资源:OpenCL Khronos书籍,GATech教程,NYU教程等等。但我仍然不完全理解。 内核和程序对象有什么区别?

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

也许一个程序对象就是代码?内核是编译后的可执行文件?就是这样吗?因为我可以理解这样的东西。

提前致谢!


这个解释对我也没有意义:内核是在OpenCL设备上运行的OpenCL函数;程序对象是实现内核的程序源代码和可执行文件。我的困惑在于,对我来说函数和源代码意思相同。 - Luis B
2
我不确定这对你有什么影响 - 似乎你过于纠结术语。实际应用才是最重要的,而且很明显 - 内核是一个可执行的编译函数;程序是包含多个内核的编译代码。因此,它们是不同抽象层次上的对象,与任何编程语言中的程序和函数/例程完全相同。 - Lubo Antonov
明白了!那样讲解很清晰易懂。谢谢! - Luis B
2个回答

8
一个程序是一个或多个内核以及可选的支持函数的集合。可以从源代码或几种类型的二进制文件(例如SPIR、SPIR-V、本机)创建程序。一些程序对象(从源代码或中间二进制文件创建)需要在选择内核之前为一个或多个设备构建(使用clBuildProgram或clCompileProgram和clLinkProgram)。最简单的理解程序的方法是,它们就像DLL并导出内核供程序员使用。
内核是可执行实体(不一定已编译,因为您可以拥有代表硬件部件的内置内核(例如Intel硬件上的视频运动估计内核)),您可以绑定其参数并将其提交到各种队列进行执行。

非常感谢,我觉得来自Lubo的评论和你的答案结合起来给了我丰富的理解,这是我在书籍/幻灯片中无法找到的。再次感谢! - Luis B

0
对于OpenCL上下文,我们可以创建多个程序对象。首先,我将描述在OpenCL应用程序中使用程序对象的用途。
  • 为了方便将内核编译到程序所连接的设备上
  • 提供查询构建错误和程序信息的功能
OpenCL应用程序使用内核对象在设备上并行执行函数。内核对象是从程序对象创建的。一个程序对象可以有多个内核对象。
  • 我们知道,要执行内核,我们需要向其传递参数。内核对象的主要目的就是这个。
为了更清楚地了解它,这里有一种类比,来自Aaftab Munshi等人的书《OpenCL编程指南》。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接