【问题标题】:why we build opencl program twice?为什么我们两次构建opencl程序?
【发布时间】:2013-10-06 02:09:51
【问题描述】:

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

【问题讨论】:

  • 这个 Q 在你修复它时被删除了 (stackoverflow.com/questions/20519090/…) 答案是你的 Linux 机器上的编译器在针对 x86 时在 4 字节边界上对齐双精度数。但是您的 Windows 编译器在 8 字节边界上对齐。

标签: opencl gpu


【解决方案1】:

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

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

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

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

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

【讨论】:

  • +1,很好的解释。谢谢。 (不幸的是我不能投票,也许没有足够的积分..)
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 2019-08-26
  • 2011-12-01
  • 2020-05-23
  • 2012-02-06
相关资源
最近更新 更多