编译 OpenCL 应用程序和使用可用编译器选项的正确方法
Proper way of compiling OpenCL applications and using available compiler options
我是 OpenCL 方面的新手。
编译 OpenCL 项目的最佳方法是什么?
使用支持的编译器(GCC
或 Clang
):
当我们使用编译器时
像 gcc
或 clang
,我们如何控制这些选项?他们是
必须在源代码中设置,或者,同样是正常的
编译流程我们可以在命令行上传递它们。查看Khornos-Manual-1.2,为cl_int clBuildProgram
提供了几个options
用于优化。 :
gcc|clang -O3 -I<INCLUDES> OpenCL_app.c -framework OpenCL OPTION -lm
实际上,我试过了并收到错误消息:
gcc: error: unrecognized command line option '<OPTION>'
或者,使用 openclc
:
我看到有人使用 openclc
编译器使用
一个Makefile。
我想知道哪种方法最好(如果
实际上有两种不同的方式),我们如何控制
使用不同的编译时间选项。
...how do we control these options? Are they have to be set inside the source code, or, likewise the normal compilation flow we can pass them on the command line.
选项可以在源代码里面设置。例如:
const char options[] = "-cl-finite-math-only -cl-no-signed-zeros";
/* Build program */
err = clBuildProgram(program, 1, &device, options, NULL, NULL);
我从未见过在命令行指定 opencl 选项,我不知道这是否可行。
您可能知道,但重申一下很重要。 OpenCL 标准包含两件事:
- OpenCL C 语言和编程模型(我认为最近的标准包括一些 C++)
- 用于管理设备的 OpenCL 主机库
gcc
和 clang
是 OpenCL 项目主机端的编译器。因此,将无法使用主机编译器为 OpenCL 设备代码编译提供编译器选项,因为它们甚至不知道任何 OpenCL。
除了 clang
之外,还有一个接受 OpenCL 设备代码的标志,即包含内核的 .cl 文件。这样你就可以使用 clang
并提供标志和选项,如果我没记错的话,但现在你将拥有 llvm IR 或 SPIR
输出而不是设备可执行对象。然后,您可以使用设备的 运行 时间环境(opencl 驱动程序)将 SPIR
对象加载到设备。
您可以查看这些链接:
Using Clang to compile kernels
Llvm IR generation
其他选择是使用目标平台提供的工具。每个声称支持 opencl 的供应商都应该有一个 运行-time 环境。通常,他们有单独的 CLI 工具来编译 OpenCL 设备代码。在你的情况下(我猜)你有 Apple 的驱动程序,因此你有 openclc
.
现在回答您的主要问题(编译 opencl 的最佳方式)。这取决于你想做什么。你没有具体说明你有什么样的要求所以我不得不推测。
如果您想在没有宿主程序的情况下进行离线编译,以上注意事项会对您有所帮助。否则,您必须使用 OpenCL 库并为您的内核进行在线编译,这通常是需要可移植性的产品的首选。因为如果您在程序开始时编译所有内核,您可以直接使用提供的环境,而无需为每个目标平台提供库。
因此,如果你有一个OpenCL项目,你必须决定如何编译。如果您真的想使用通用标志并且不依赖第三方工具。我建议你有一个 class 来构建你的内核并提供你想要的标志。
我是 OpenCL 方面的新手。
编译 OpenCL 项目的最佳方法是什么?
使用支持的编译器(
GCC
或Clang
):当我们使用编译器时 像
gcc
或clang
,我们如何控制这些选项?他们是 必须在源代码中设置,或者,同样是正常的 编译流程我们可以在命令行上传递它们。查看Khornos-Manual-1.2,为cl_int clBuildProgram
提供了几个options
用于优化。 :gcc|clang -O3 -I<INCLUDES> OpenCL_app.c -framework OpenCL OPTION -lm
实际上,我试过了并收到错误消息:
gcc: error: unrecognized command line option '<OPTION>'
或者,使用
openclc
:我看到有人使用
openclc
编译器使用 一个Makefile。
我想知道哪种方法最好(如果 实际上有两种不同的方式),我们如何控制 使用不同的编译时间选项。
...how do we control these options? Are they have to be set inside the source code, or, likewise the normal compilation flow we can pass them on the command line.
选项可以在源代码里面设置。例如:
const char options[] = "-cl-finite-math-only -cl-no-signed-zeros"; /* Build program */ err = clBuildProgram(program, 1, &device, options, NULL, NULL);
我从未见过在命令行指定 opencl 选项,我不知道这是否可行。
您可能知道,但重申一下很重要。 OpenCL 标准包含两件事:
- OpenCL C 语言和编程模型(我认为最近的标准包括一些 C++)
- 用于管理设备的 OpenCL 主机库
gcc
和 clang
是 OpenCL 项目主机端的编译器。因此,将无法使用主机编译器为 OpenCL 设备代码编译提供编译器选项,因为它们甚至不知道任何 OpenCL。
除了 clang
之外,还有一个接受 OpenCL 设备代码的标志,即包含内核的 .cl 文件。这样你就可以使用 clang
并提供标志和选项,如果我没记错的话,但现在你将拥有 llvm IR 或 SPIR
输出而不是设备可执行对象。然后,您可以使用设备的 运行 时间环境(opencl 驱动程序)将 SPIR
对象加载到设备。
您可以查看这些链接:
Using Clang to compile kernels
Llvm IR generation
其他选择是使用目标平台提供的工具。每个声称支持 opencl 的供应商都应该有一个 运行-time 环境。通常,他们有单独的 CLI 工具来编译 OpenCL 设备代码。在你的情况下(我猜)你有 Apple 的驱动程序,因此你有 openclc
.
现在回答您的主要问题(编译 opencl 的最佳方式)。这取决于你想做什么。你没有具体说明你有什么样的要求所以我不得不推测。
如果您想在没有宿主程序的情况下进行离线编译,以上注意事项会对您有所帮助。否则,您必须使用 OpenCL 库并为您的内核进行在线编译,这通常是需要可移植性的产品的首选。因为如果您在程序开始时编译所有内核,您可以直接使用提供的环境,而无需为每个目标平台提供库。
因此,如果你有一个OpenCL项目,你必须决定如何编译。如果您真的想使用通用标志并且不依赖第三方工具。我建议你有一个 class 来构建你的内核并提供你想要的标志。