Image processing 分配卤化物生成功能的推荐方法?
我目前正在试验,初步测试显示性能有了很大的提高 我现在想知道分发卤化物代码的最佳策略是什么。此时要求用户安装卤化物似乎是一个沉重的障碍(因为没有自动安装选项) 一个选项是使用Image processing 分配卤化物生成功能的推荐方法?,image-processing,llvm,software-distribution,llc,halide,Image Processing,Llvm,Software Distribution,Llc,Halide,我目前正在试验,初步测试显示性能有了很大的提高 我现在想知道分发卤化物代码的最佳策略是什么。此时要求用户安装卤化物似乎是一个沉重的障碍(因为没有自动安装选项) 一个选项是使用将_编译为_c,将生成的c代码添加到存储库中,并分发此类c代码的编译脚本。对Cython生成的代码使用类似的策略。对于Halide来说,这似乎是不可能的,因为生成的C代码丢失了所有的优化,从而破坏了Halide的用途 我现在的想法是使用 ,将生成的位代码与调用以生成所需机器代码的编译脚本一起分发。用户的唯一要求是安装llc(
将_编译为_c
,将生成的c代码添加到存储库中,并分发此类c代码的编译脚本。对Cython生成的代码使用类似的策略。对于Halide来说,这似乎是不可能的,因为生成的C代码丢失了所有的优化,从而破坏了Halide的用途
我现在的想法是使用
,将生成的位代码与调用以生成所需机器代码的编译脚本一起分发。用户的唯一要求是安装llc
(即llvm
)
有人对此有经验吗?我发布比特码的想法有哪些优点和缺点?
你会推荐什么?绝对不推荐编译成c(),因为它生成的代码不是很优化;它主要用作调试/开发工具 compile_to_bitcode()听起来似乎可以工作,但我不知道有人使用它作为分发方法
(对于Halide来说,自动安装可能会很有用。)关于软件发行类型的一些详细信息会有所帮助。这个问题意味着源代码的分发,但是程序员可能需要在细粒度级别与卤化物生成的代码进行交互的库与最终用户基本上看不到卤化物的使用并且目标只是让其构建的应用程序之间有很大的区别 分发比特码是可行的,但有问题。为了便于移植,您必须使用类似PNaCl后端的东西。(PNaCl非常接近于通用LLVM位代码表示。)如果您针对特定的体系结构,则无法保证位代码将在任何其他体系结构上编译或运行。(例如,Halide可以降低到特定于体系结构的内部函数。)LLVM社区不鼓励使用位代码作为分发格式,但如果它是源代码格式(.ll,而不是.bc),它可能相当稳定,并且在长期稳定性方面似乎并不比发送程序集文件差多少 Halide在生成的输出中包含特定于操作系统的运行时,因此即使使用位代码,结果也包含许多特定于目标的依赖项 通常,最终的设计是,在运行时,根据实际使用的处理器类型,在多个卤化物输出中选择一个。例如,使用卤化物为SSE2和AVX2处理器编译具有两个不同调度的相同算法。在这个模型中,无论如何都会有很多对象文件,人们可以在构建时简单地选择为给定的体系结构和操作系统包含哪些文件。将对象作为.ll文件而不是.o文件分发可能会起作用,但我不确定这是否能带来多少好处 我将努力提供完整的源代码,如果要从头开始编译,则需要使用卤素,并寻找提供不同级别二进制分发的方法。当然,对于最终用户软件来说,重点应该放在如何将完全构建的软件包交到用户手中。对于库,可以使用Halide向库的用户呈现更高级别的编程模型,在这种情况下,无论如何都需要Halide编译器
我们努力使卤化物相当容易进入系统,并且非常稳定,但还没有完全解决这一问题。我可能会尝试提供某种级别的回退,使用C后端生成通用C代码可能是一种不错的方法,无需直接在C中重写所有内容。(如果从源代码构建,则可以在安装Halide或使用预构建的C代码之间进行选择。)这是C后端更好的用例之一。(从卤化物中生成C代码通常是一个非常边缘化的想法,尽管一开始它看起来是一个好主意。)所以说到底,比特码是一个坏主意。我将提供一个没有卤化物的编译路径,对于最快的版本,卤化物将是一个要求。是的,我指的是应用程序的开源版本。