好的,所以:我已经成功地将第一个工作的卤化物生成器集成到我的小图像处理项目的cmake 构建系统中。
生成器基于 Halide 代码库中的示例代码实现了图像大小调整和重采样算法Halide/apps/resize/resize.cpp
——我调整了示例以利用生成器参数,并使用定义的函数将生成器的编译和调用绑定到我的 cmake 脚本in HalideGenerator.cmake
,就像 Halide 项目在它自己的构建脚本中所做的那样。
到目前为止,这一切都很好——但我在代码生成细微差别领域缺乏专业知识。例如,我调整了调度方法以在我的笔记本电脑上获得最佳观察到的经验速度——但是尽管在 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
在没有选项调用时输出的内容: