为什么我们两次构建opencl程序?

时间:2013-10-05 16:58:10

标签: opencl gpu

我在amd平台的opencl程序中观察到我们需要两次构建程序。一旦使用clBuildProgram ...();当我们构建整个代码时。为什么我们这样做两次?

1 个答案:

答案 0 :(得分:10)

在OpenCL主机代码编译和内核代码编译是两个单独的步骤。

当你编译你所称的整个代码时,你基本上只是编译主机代码,即编排和控制OpenCL内核执行的代码。

将在支持OpenCL的设备(CPU,GPU,DSP,FPGA,加速器......)上执行的内核代码有两个主要的编译选项:

  • 您可以将程序中的实际OpenCL内核源包含在单独的.cl文件中,或者将其作为字符串嵌入到主机代码中。使用此编译路径时,使用program创建传递给clBuildProgram的{​​{1}}对象。然后,主机代码可以使用运行时的在线编译器来编译内核,以获得要在其上运行内核的OpenCL功能设备的所需体系结构。这样做的好处是您不需要事先知道(在创建主机程序时)OpenCL设备的架构(Intel,AMD,Nvidia,...)。您可能甚至没有该架构的编译器。缺点是你的内核源代码是可见的,如果你有嵌入有价值的IP,这是不可取的。
  • 您可能决定事先为所有要支持的OpenCL设备体系结构编译内核,并将这些内核的二进制文件与您的主机代码一起发送,而不是内核源代码。使用此编译路径时,使用clCreateProgramWithSource创建传递给program的{​​{1}}对象。

您可能还想查看SPIR specification,它结合了两种方法的优点,并允许您发送内核的中间表示,因此您不必拥有所有目标OpenCL编译器也不必提供内核的简单源代码。