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

时间:2016-08-24 16:07:42

标签: opencl gpu gpgpu

我经历了几个资源:OpenCL Khronos书,GATech教程,纽约大学教程,我可以通过更多。但我仍然不完全理解。 内核和程序对象之间有什么区别?

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

也许程序对象是代码?内核是编译后的可执行文件吗?是吗?因为我能理解类似的东西。

提前致谢!

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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

  • 为了便于为程序所使用的设备编译内核 附加
  • 提供确定构建错误和查询程序信息的工具

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

  • 我们知道,要执行内核,我们需要向其传递参数。内核对象的主要目的是这样。

这里要弄清楚它是一个类比,Aaftab Munshi等人在“ OpenCL编程指南”一书中给出了类似的说法

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