Gcc 编译OpenCL应用程序和使用可用编译器选项的正确方法
我是OpenCL的新手 编译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
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我从未见过在命令行中指定opencl选项,我不知道这是否可行。您可能知道,但重申这一点很重要。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。你能为我的另一个问题提供一个提示吗