Gcc 编译OpenCL应用程序和使用可用编译器选项的正确方法

Gcc 编译OpenCL应用程序和使用可用编译器选项的正确方法,gcc,opencl,llvm,compiler-options,opencl-c,Gcc,Opencl,Llvm,Compiler Options,Opencl C,我是OpenCL的新手 编译OpenCL项目的最佳方式是什么 使用受支持的编译器(GCC或Clang): 当我们使用编译器时 像gcc或clang,我们如何控制这些选项?是吗 必须在源代码内部设置,或者,同样是正常的 编译流程我们可以在命令行上传递它们。查看,为cl\u int clBuildProgram提供了一些用于优化的选项 gcc|clang -O3 -I<INCLUDES> OpenCL_app.c -framework OpenCL OPTION -lm gcc | c

我是OpenCL的新手

编译OpenCL项目的最佳方式是什么

  • 使用受支持的编译器(
    GCC
    Clang
    ):

    当我们使用编译器时 像
    gcc
    clang
    ,我们如何控制这些选项?是吗 必须在源代码内部设置,或者,同样是正常的 编译流程我们可以在命令行上传递它们。查看,为
    cl\u int clBuildProgram
    提供了一些用于优化的
    选项

    gcc|clang -O3 -I<INCLUDES> OpenCL_app.c -framework OpenCL OPTION -lm
    
    gcc | clang-O3-I OpenCL_app.c-framework OpenCL OPTION-lm
    
    实际上,我尝试了这个,但收到了一个错误:

    gcc: error: unrecognized command line option '<OPTION>'
    
    gcc:错误:无法识别的命令行选项“”
    
  • 或者,使用
    openclc

    我见过有人使用
    openclc
    来编译 a

  • 我想知道哪一个是最好的方式(如果 实际上有两种不同的方法),我们如何控制 使用不同的编译时选项

    …我们如何控制这些选项?它们必须在源代码中设置,或者,同样,我们可以在命令行上传递它们的正常编译流

    可以在源代码内部设置选项。例如:

    const char options[] = "-cl-finite-math-only -cl-no-signed-zeros"; /* Build program */ err = clBuildProgram(program, 1, &device, options, NULL, NULL); 常量字符选项[]=“-cl仅限有限数学-cl无符号零”; /*构建程序*/ err=clBuildProgram(程序、1和设备、选项、NULL、NULL);
    我从未见过在命令行中指定opencl选项,我不知道这是否可行。

    您可能知道,但重申这一点很重要。OpenCL标准包含两个方面:

  • OpenCLC语言和编程模型(我认为最近的标准包括一些C++)
  • 用于管理设备的OpenCL主机库
  • gcc
    clang
    是OpenCL项目主机端的编译器。因此,将无法使用主机编译器为OpenCL设备代码编译提供编译器选项,因为它们甚至不知道任何OpenCL。 除了使用
    clang
    外,还有一个标志接受包含内核的OpenCL设备代码.cl文件。这样,您可以使用
    clang
    ,如果我没记错的话,还可以提供标志和选项,但现在您可以使用llvm IR或
    SPIR
    输出,而不是设备可执行对象。然后,您可以使用设备的运行时环境(opencl驱动程序)将
    SPIR
    对象加载到设备。 您可以签出以下链接:

    另一种选择是使用目标平台提供的工具。声称支持opencl的每个供应商都应该有一个运行时环境。通常,它们有单独的CLI工具来编译OpenCL设备代码。在你的情况下(我猜),你有苹果的驱动程序,因此你有
    openclc

    现在谈谈你的主要问题(编译opencl的最佳方法)。这取决于你想做什么。你没有具体说明你有什么样的要求,所以我不得不猜测

    如果您希望在没有宿主程序的情况下进行离线编译,上述注意事项将对您有所帮助。否则,您必须使用OpenCL库并对内核进行在线编译,这通常是需要可移植性的产品的首选。因为如果在程序开始时编译所有内核,则直接使用提供的环境,而不需要为每个目标平台提供库


    因此,如果您有一个OpenCL项目,您必须决定如何编译。如果您真的想使用通用标志并且不依赖第三方工具。我建议您使用一个类来构建内核并提供所需的标志。

    您是指以前完成的另一个内核编译的二进制输出吗?它缩短了编译时间,特别是对于FPGA。第一个问题你问什么?是否需要添加其他C程序的头文件?@huseyintugrulbuyukisik。我的问题是一般性的。编译opencl应用程序(主机+内核)的主要方式是什么。IS使用GCC/LLVM和OpenCL库或使用OpenCLC。您需要从操作系统中包含OpenCL LIB DLL文件,以供C++绑定工作和编译。opencl内核编译可以只给cl程序和cl内核对象一个字符串,然后在运行时编译,而不是在编译时编译。如果您有二进制文件,那么您可以从一开始就准备好opencl。如果安装了gpu驱动程序,您可以在一些文件夹中找到它们,但我不记得了。那么
    openclc
    的用途是什么呢?它是在您的程序之外编译的,因此您可以使用它的结果文件在您的程序中运行内核,而无需opencl编译。例如,我没有使用它,因此在我的计算机中编译3个设备需要10-20秒(在运行时)因为我将内核程序作为字符串和opencl.dll提供必要的函数,当我想从该字符串编译时,它会编译,但fpga需要几个小时来编译,所以他们会事先编译一次并发布它,这样用户就不会等待数小时来获得ComputeTanks@Sergio。如果OpenCL提供了一些可以在编译时控制的环境,那就太好了,否则您应该每次在源代码中修改
    options[]
    ,以获得完整的答案@Vermulo。你能为我的另一个问题提供一个提示吗