访问Halide管道中的Func

时间:2016-05-26 09:21:04

标签: c++ optimization halide

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

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

1 个答案:

答案 0 :(得分:1)

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

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

我们正在开发更好的序列化和反序列化,如果您想将计划写入与C ++代码分开的文件中,则会对此进行另一次切片。但是,您仍然需要知道正在安排的代码的详细信息才能使其正常工作。它还涉及使用序列化格式作为编程语言来安排或开发另一种语言。

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