1

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

4

1 回答 1

10

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

当您编译您所说的整个代码时,您实际上只是在编译主机代码,即编排和控制 OpenCL 内核执行的代码。

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

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

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

于 2013-10-05T18:09:51.800 回答