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

为什么我们要构建两次opencl程序?,opencl,gpu,Opencl,Gpu,我在amd平台的opencl程序中观察到,我们需要构建两次程序。一旦使用clBuildProgram…();当我们构建完整的代码时,还有一个。为什么我们要建造两次 在OpenCL中,主机代码编译和内核代码编译是两个独立的步骤 当你编译你所说的整个代码时,你实际上只是在编译宿主代码,也就是说,那些将协调和控制OpenCL内核执行的代码 将在支持OpenCL的设备(CPU、GPU、DSP、FPGA、加速器……)上执行的内核代码有两个主要编译选项: 您可以将实际的OpenCL内核源代码作为单独的.c

我在amd平台的opencl程序中观察到,我们需要构建两次程序。一旦使用clBuildProgram…();当我们构建完整的代码时,还有一个。为什么我们要建造两次

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

当你编译你所说的整个代码时,你实际上只是在编译宿主代码,也就是说,那些将协调和控制OpenCL内核执行的代码

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

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

您可能还想看看,它结合了这两种方法的优点,并允许您提供内核的中间表示形式,因此,您不必拥有所有的目标OpenCL编译器,也不必提供内核的普通源代码。

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

当你编译你所说的整个代码时,你实际上只是在编译宿主代码,也就是说,那些将协调和控制OpenCL内核执行的代码

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

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

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

+1,非常好的解释。谢谢(不幸的是,我不能投票,可能没有足够的分数。))+1,很好的解释。谢谢(不幸的是,我无法投票,可能没有足够的分数。)这个Q在您修复它时被删除了()答案是Linux机器上的编译器在针对x86时在4字节边界上对齐双倍。但是你的Windows编译器是在8字节边界上对齐的。这个Q在你修复它时被删除了()答案是你在Linux机器上的编译器在瞄准x86时在4字节边界上对齐了两倍。但是您的Windows编译器在8字节边界上对齐。