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

use*_*108 1 gpu opencl

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

小智 10

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

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

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

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

您可能还想查看SPIR规范,该规范结合了两种方法的优点,并允许您发布内核的中间表示,因此您不必拥有所有目标OpenCL编译器,也不必发送内核的普通源代码.