在 Halide 管道中访问函数

Accessing Funcs in a Halide pipeline

我有一个 Halide 管道,我想在上面尝试几个时间表。我想通过创建一个单独的优化文件来做到这一点,然后在运行时将它们应用于给定的 Func,这样我就可以自动尝试找到最快的。

我开始编写自己的函数来执行此操作,但是对于某些优化,例如 compute_at,这变得相当复杂。 compute_at 将 Func 作为第一个参数。有没有一种方法可以访问管道中的函数,而无需保留所有函数的列表,然后将此列表传递给我的函数?我知道由于 Halide 的设计方式,这可能根本不可能。

可以通过 IR 查找 Func 的名称,也可以将它们藏在地图中以备将来参考。然而,这只是解决了命名的低级机制。问题在于名称本身成为接口的一部分,并且调度仍然特定于代码结构的低级细节。 (并且还需要 Var 名称,这些通常更容易使用。)

在这一点上,最好定义一个包含调度例程可以依赖的信息的结构,并在构建 IR 时填充它。然后可以将此结构传递给 C++ 函数来进行调度。可以抽象出调度的公共部分等。对于复杂的情况,我们经常使用 C++ 循环等将调度块应用于一组 Func,即使所有 IR 都是在单个例程中构建和调度的。实际上,该结构封装了算法和调度之间的接口。

我们正在致力于更好的序列化和反序列化,如果您想将计划写入与 C++ 代码分开的文件,则可以提供另一个切片。但是再一次,您仍然必须知道被调度代码的详细信息才能使其工作。它还涉及使用序列化格式作为编程语言进行调度或开发另一种语言。

目前最有前途的途径是自动启发式调度。 Ravi Teja Mullapudi 等人在 SIGGRAPH 上发表了一篇论文。