有关软件分发类型的一些详细信息会有所帮助。这个问题暗示了源代码分发,但是程序员可能需要在细粒度级别与 Halide 生成的代码进行交互的库与最终用户和最终用户基本上不可见使用 Halide 的应用程序之间存在很大差异。目标只是让它建立。
分发位码是可行的,但有问题。为了便于携带,您必须使用 PNaCl 后端之类的东西。(PNaCl 非常接近通用 LLVM 位码表示。)如果您针对特定架构,则无法保证位码将在任何其他架构上编译或运行。(例如,卤化物可以降低到特定于体系结构的内在函数。)LLVM 社区不鼓励使用位码作为分发格式,尽管如果它是源代码形式(.ll,而不是 .bc),它可能相当稳定,并且看起来并不比运输差多少装配文件在长期稳定性方面。
Halide 在生成的输出中包含特定于操作系统的运行时,因此即使使用位码,结果也会包含许多特定于目标的依赖项。
通常,最终设计会在运行时根据所使用的处理器的实际类型在多个卤化物输出之一之间进行选择。例如,使用 Halide 为 SSE2 和 AVX2 处理器编译具有两种不同调度的相同算法。在这个模型中,无论如何都会有很多目标文件,人们可以在构建时简单地选择要包含给给定架构和操作系统的目标文件。将对象分发为 .ll 文件而不是 .o 文件可能会起作用,但我不确定它会买多少。
我会努力提供完整的源代码,如果要从头开始编译,则需要 Halide,并寻找提供各种级别的二进制分发的方法。当然,对于最终用户软件,重点应该放在如何将完全构建的软件包交到用户手中。对于库,Halide 可用于向库的用户展示更高级别的编程模型,在这种情况下,无论如何都需要存在 Halide 编译器。
我们努力使 Halide 相当容易进入系统并且非常稳定,但还没有完全确定。我可能会尝试提供某种程度的回退,并且使用 C 后端生成通用 C 代码可能是一种不错的方法,无需直接用 C 重写所有内容。(如果从源代码构建,可以选择安装 Halide 或使用预构建的 C 代码。)这是 C 后端更好的用例之一。(从 Halide 生成 C 代码通常是一个非常边缘的想法,尽管起初它似乎是一个不错的想法。)