2013-10-05 17 views
1

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

+0

这个Q被删除,就像你修正它一样(http://stackoverflow.com/questions/20519090/why-the-structure-size-is-being-reported-different-on-linux-and-windows)答案在于,在针对x86时,Linux机器上的编译器在4个字节的边界上对齐双打。但是你的Windows编译器在8个字节边界上对齐。 –

回答

9

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

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

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

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

您可能还需要有一个看看SPIR specification,它结合了这两种方法的优点,并允许您装运内核的中间表示,所以你不必知道所有的目标的OpenCL编译器您也不需要发送内核的简单源代码。

+0

+1,绝佳的解释。谢谢。 (不幸的是我不能upvote,也许没有足够的分数..) – user25108

相关问题