使用最佳编译器标志和配置从cmake运行Halide生成器

鱼2000

好的,所以:我已经为我的小图像处理项目成功地将第一个可用的Halide生成器集成到了cmake构建系统

生成器基于Halide代码库中的示例代码实现图像调整大小和重新采样算法– Halide/apps/resize/resize.cpp–我修改了示例以利用生成器参数,并使用定义的函数将生成器的编译和调用绑定到我的cmake脚本在HalideGenerator.cmake,只是作为卤化物项目确实在自己构建脚本。

到目前为止,所有这些工作都很好-但是我的领域专业知识缺少代码生成细微差别的领域。例如,我调整了计划方法以在笔记本电脑上获得最佳的观察到的经验速度-但是尽管花了很多时间进行长时间的修补课程和代码读取工作,但深入到Halide的许多与发电机相关的工具脚本的深度,我还是最肤浅的了解代码生成过程。

具体来说,我不知道该如何处理。是最好使用默认值,还是尝试为目标平台打开特定选项-如果是后者,我是否必须在某个地方放置条件代码,或者二进制文件可以包含回退?

这就是我正在谈论的内容:在Halide教程#15的源代码中,有一个复杂的脚本可以调用带有各种选项的生成器。以下是此脚本中的代码注释片段:

# If you're compiling and linking multiple Halide pipelines, then the
# multiple copies of the runtime should combine into a single copy
# (via weak linkage). If you're compiling and linking for multiple
# different targets (e.g. avx and non-avx), then the runtimes might be
# different, and you can't control which copy of the runtime the
# linker selects.

# You can control this behavior explicitly by compiling your pipelines
# with the no_runtime target flag. Let's generate and link several
# different versions of the first pipeline for different x86 variants: [snip]

......从这个很难分开什么必须做,从什么应该做,或者什么可以做,擅自。相对而言,在设置C ++或Objective-C项目(甚至更多的拜占庭示例)时,不必处理这些问题,因为编译器和链接器为您做出了大多数决定,并且最多只需要一个或两个标志即可。

我的问题是:如何将Halide生成器的输出库二进制文件集成到我现有的项目中-以便生成器的输出尽可能快(例如,使用GPU,SSE2 / 3,AVX2等)而又不进一步限制可移植性(例如,它将不会) t在稍有不同的计算机上进行神秘的段错误)?

具体来说,我的流程应该是什么?例如,首先我应该只针对最低公分母,然后逐步利用更多奇特的处理器功能吗?


编辑:正如我在下面的评论中提到的,这是我的GenGen二进制输出到stdout不带任何选项的情况下输出的内容

伊姆古尔

霍里·乔丹奴

对于预生成二进制文件(AOT)的情况,听起来像是要运行时调度。您的程序将在启动时检查CPU / GPU环境,并确定应使用哪些功能(AVX,OpenCL等)。这不是卤化物特定的。

  • 选择一组最佳功能作为目标(高性能台式机GPU)作为最佳案例,并选择一组最少的功能以适用于每台计算机(仅限SSE2)。
  • 为这些功能集构建一个DLL / dylib / so,其中包含每个需要性能的功能。这些可以安排不同的时间,甚至可以用完全不同的Func定义来构建您可以将两个集合都放在同一个源代码文件中,并Target在生成时测试对象以在它们之间进行选择。
  • 在程序启动时,查看是否存在最佳情况功能,如果存在,请加载该库并使用它。如果缺少任何功能,则默认为最兼容的版本。

您可以自由选择要支持的功能集和库的数量。

另一种方法是在程序启动(JIT)时编译您的Halide代码。我建议使用由Target返回对象get_jit_target_from_environment(),该对象使用环境变量HL_JIT_TARGET或“主机”的内容(如果未设置该变量)。“主机”目标字符串与相同get_host_target(),表示Halide将检查CPU / GPU环境并设置找到的任何功能。然后,您可以动态测试Target对象并使用GPU或CPU调度。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在哪里配置Eclipse Java编译器(javac)标志?

使用cmake,如何确定每种构建类型的默认编译器标志?

CMake Fortran编译器相关标志

什么是CMake生成器?

Cabal配置,用于编译器标志和运行时选项

Qt Creator使用MinGW编译器和CMake

CMake-访问多配置生成器的配置参数

在CMake中可移植地设置-Wall和-pedantic等编译器选项的最佳方法

在CMake中使用本地编译器标志

同时使用CMAKE_INSTALL_PATH和CPack WiX生成器

如何在循环中使用链式生成器模式而不产生编译器错误?

CMAKE脚本中的编译器标志设置

使用noexcept和编译器标志关闭异常

配置电子生成器以运行Powershell脚本

CMake编译器独立标志

cmake:如何根据当前编译器版本添加编译器标志

定制命令中的Cmake(<3.6)编译器标志

与CMake交叉编译时的Makefile生成器规范

CMAKE设置rc编译器标志吗?

运行 make 时附加编译器标志

如何通过 CMake 传递编译器标志以使用 GTest

如何配置 maven 和 intellij 以包含 groovy 和 java 的参数编译器标志

代码生成器生成自己的 CMake 文件和目标

打字稿编译器给出了一个包含生成器函数的代码

使用相同编译器标志的不同 Makefile 会生成不同的二进制文件

使用 CMake 时处理编译器标志的正确方法

CMake:通过 NVCC 传递编译器标志列表

编译器:没有为 sort Optional[KVar] 定义新的生成器

如何使用带有 Ninja 生成器的 CMake 将修饰符标志传递给存档文件 (ar)