好的,所以:我已经为我的小图像处理项目成功地将第一个可用的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等)。这不是卤化物特定的。
Func
定义来构建。您可以将两个集合都放在同一个源代码文件中,并Target
在生成时测试对象以在它们之间进行选择。您可以自由选择要支持的功能集和库的数量。
另一种方法是在程序启动(JIT)时编译您的Halide代码。我建议使用由Target
返回的对象get_jit_target_from_environment()
,该对象使用环境变量HL_JIT_TARGET
或“主机”的内容(如果未设置该变量)。“主机”目标字符串与相同get_host_target()
,表示Halide将检查CPU / GPU环境并设置找到的任何功能。然后,您可以动态测试Target
对象并使用GPU或CPU调度。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句