Opencl 内核和程序对象之间的区别是什么?

Opencl 内核和程序对象之间的区别是什么?,opencl,gpu,gpgpu,Opencl,Gpu,Gpgpu,我已经阅读了一些资源:OpenCLKhronos书籍、GATech教程、纽约大学教程,我还可以阅读更多。但我还是不完全明白内核和程序对象之间有什么区别? 到目前为止,对我来说最好的解释是这样的,但这还不足以让我完全理解: 程序对象:一个程序对象封装了一些源代码(可能有几个内核函数)及其最后一次成功构建。 内核:内核对象封装内核的 执行内核时使用的参数 也许程序对象就是代码?内核是编译后的可执行文件吗?是这样吗?因为我能理解这样的事情 提前谢谢 程序是一个或多个内核加上可选支持函数的集合。可以从源

我已经阅读了一些资源:OpenCLKhronos书籍、GATech教程、纽约大学教程,我还可以阅读更多。但我还是不完全明白内核和程序对象之间有什么区别?

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

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


提前谢谢

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


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

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

  • 为便于编译程序所连接设备的内核 附
  • 提供用于确定生成错误和查询程序信息的工具
OpenCL应用程序使用内核对象在设备上并行执行函数。内核对象是从程序对象创建的。一个程序对象可以有多个内核对象

  • 正如我们所知,要执行内核,我们需要向它传递参数。内核对象的主要用途如下
为了更清楚地了解这一点,Aaftab Munshi等人在《OpenCL编程指南》一书中给出了一个类比


有一个类比可能有助于理解内核对象和程序对象之间的区别,即程序对象类似于一个动态库,因为它包含一组内核函数。内核对象类似于动态库中函数的句柄。程序对象是从源代码(OpenCLC)或编译的程序二进制文件(稍后将详细介绍)创建的。程序为程序对象所连接的任何设备生成。然后,内核对象被用来访问已编译内核函数的属性,对其进行排队调用,并设置其参数。

这一解释对我来说也没有意义:内核是在OpenCL设备上运行的OpenCL函数;程序对象是实现内核的程序源代码和可执行文件。我的分歧在于函数和源代码对我来说意味着同一件事。我不知道为什么这对你很重要——你似乎对术语很着迷。实用的方面很重要,这一点非常清楚——内核是一个可以执行的编译函数;该程序是编译后的代码,可能包含几个内核。所以它是不同抽象层次的对象,与任何编程语言中的程序和函数/例程完全相同。明白了!这完全有道理。谢谢非常感谢你,我认为卢波的评论和你的回答结合在一起,给了我一个在书/幻灯片中找不到的丰富理解。再次感谢!