我是OpenCL的新手。
编译 OpenCL 项目的最佳方法是什么?
-
使用支持的编译器(
GCC
或Clang
):当我们使用编译器时 像
gcc
或clang
,我们如何控制这些选项?他们是吗 必须在源代码中设置,或者,同样正常的 编译流程我们可以在命令行上传递它们。查看 Khornos-Manual-1.2,提供了一些options
cl_int clBuildProgram
以进行优化。:gcc|clang -O3 -I<INCLUDES> OpenCL_app.c -framework OpenCL OPTION -lm
实际上,我尝试了这个并收到一个错误:
gcc: error: unrecognized command line option '<OPTION>'
-
或者,使用
openclc
:我见过有人使用
openclc
编译器 a 生成文件。
我想知道哪种是最好的方法(如果 实际上有两种不同的方式),我们如何控制 使用不同的编译时选项。
您可能知道,但重申这一点很重要。OpenCL 标准包含两件事:
- OpenCL C语言和编程模型(我认为最近的标准包括一些C++)
- 用于管理设备的 OpenCL 主机库
gcc
和clang
是 OpenCL 项目主机端的编译器。因此,无法使用主机编译器为 OpenCL 设备代码编译提供编译器选项,因为它们甚至不知道任何 OpenCL。 除了clang
有一个接受OpenCL设备代码的标志,包含内核的.cl文件。这样,如果我没记错的话,您可以使用clang
并提供标志和选项,但现在您将拥有llvm IR或SPIR
输出而不是设备可执行对象。然后,您可以使用设备的运行时环境(opencl 驱动程序)将SPIR
对象加载到设备。 您可以查看以下链接:
使用 Clang 编译内核
低密度红外生成
斯皮尔
另一种选择是使用目标平台提供的工具。每个声称支持 opencl 的供应商都应该有一个运行时环境。通常,它们具有单独的 CLI 工具来编译 OpenCL 设备代码。在您的情况下(我猜)您有来自Apple的驱动程序,因此您有openclc
.
以英特尔命令行界面为例
现在进入您的主要问题(编译 opencl 的最佳方法)。这取决于你想做什么。你没有具体说明你有什么样的要求,所以我不得不推测。
如果您想在没有主机程序的情况下进行离线编译,上述注意事项将为您提供帮助。否则,您必须使用 OpenCL 库并为您的内核进行在线编译,这通常是需要可移植性的产品的首选。因为如果您在程序开始时编译所有内核,则直接使用提供的环境,而无需为每个目标平台提供库。
因此,如果你有一个OpenCL项目,你必须决定如何编译。如果您真的想使用通用标志并且不依赖第三方工具。我建议你有一个类来构建你的内核并提供你想要的标志。
...我们如何控制这些选项?它们是否必须在源代码中设置,或者,同样,我们可以在命令行上传递它们的正常编译流程。
可以在源代码中设置选项。例如:
常量字符选项[] = "-cl-finite-math-only -cl-no-signed-zeros";/* 构建程序 */err = clBuildProgram(program, 1, &device, options, NULL, NULL);
我从未见过在命令行中指定 opencl 选项,也不知道这是否可能。