我在amd平台的opencl程序中观察到我们需要两次构建程序。一旦使用clBuildProgram ...();当我们构建整个代码时。为什么我们这样做两次?
答案 0 :(得分:10)
在OpenCL主机代码编译和内核代码编译是两个单独的步骤。
当你编译你所称的整个代码时,你基本上只是编译主机代码,即编排和控制OpenCL内核执行的代码。
将在支持OpenCL的设备(CPU,GPU,DSP,FPGA,加速器......)上执行的内核代码有两个主要的编译选项:
program
创建传递给clBuildProgram
的{{1}}对象。然后,主机代码可以使用运行时的在线编译器来编译内核,以获得要在其上运行内核的OpenCL功能设备的所需体系结构。这样做的好处是您不需要事先知道(在创建主机程序时)OpenCL设备的架构(Intel,AMD,Nvidia,...)。您可能甚至没有该架构的编译器。缺点是你的内核源代码是可见的,如果你有嵌入有价值的IP,这是不可取的。clCreateProgramWithSource
创建传递给program
的{{1}}对象。 您可能还想查看SPIR specification,它结合了两种方法的优点,并允许您发送内核的中间表示,因此您不必拥有所有目标OpenCL编译器也不必提供内核的简单源代码。