3

我是 OpenCL 方面的新手。

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

  1. 使用支持的编译器(GCCClang):

    当我们使用类似gccor的编译器时clang,我们如何控制这些选项?它们是否必须在源代码中设置,或者像正常的编译流程一样,我们可以在命令行上传递它们。查看Khornos-Manual-1.2options提供了一些cl_int clBuildProgram用于优化的内容。:

    gcc|clang -O3 -I<INCLUDES> OpenCL_app.c -framework OpenCL OPTION -lm
    

    实际上,我试过这个并收到一个错误:

    gcc: error: unrecognized command line option '<OPTION>'
    
  2. 或者,使用openclc

    我见过人们使用Makefileopenclc来编译器。

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

4

2 回答 2

3

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

  1. OpenCL C 语言和编程模型(我认为最近的标准包括一些 C++)
  2. 用于管理设备的 OpenCL 主机库

gcc并且clang是 OpenCL 项目主机端的编译器。因此,将无法使用主机编译器为 OpenCL 设备代码编译提供编译器选项,因为它们甚至不知道任何 OpenCL。除了clang有一个接受 OpenCL 设备代码的标志外,.cl 文件包含内核。这样clang,如果我没记错的话,您可以使用并提供标志和选项,但是现在您将拥有 llvm IR 或SPIR输出不是设备可执行对象。然后,您可以SPIR使用设备的运行时环境(opencl 驱动程序)将对象加载到设备。您可以查看以下链接:

使用 Clang 编译内核

Llvm IR 生成

SPIR

其他替代方法是使用目标平台提供的工具。每个声称支持 opencl 的供应商都应该有一个运行时环境。通常,他们有单独的 CLI 工具来编译 OpenCL 设备代码。在您的情况下(我猜)您有来自 Apple 的驱动程序,因此您有openclc.

以英特尔 CLI 为例

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

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

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

于 2017-04-16T11:39:51.103 回答
2

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

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

    const char options[] = "-cl-finite-math-only -cl-no-signed-zeros";

    /* 构建程序 */
    err = clBuildProgram(program, 1, &device, options, NULL, NULL);

我从未见过在命令行中指定 opencl 选项,我不知道这是否可能。

于 2017-04-06T06:04:50.060 回答