我有一个Halide管道,我想尝试一些时间表。我想通过创建带有优化的单独文件,然后在运行时将它们应用于给定的Func来做到这一点,以便我可以自动尝试它们以找到最快的文件。
我开始编写自己的函数来执行此操作,但是对于某些优化(例如compute_at),这变得相当复杂。 compute_at将Func作为第一个参数。有没有一种方法可以访问管道中的Funcs,而不必保留所有函数的列表,然后将此列表传递给我的函数?我了解由于Halide的设计方式,这可能根本不可能。
最佳答案
可以步行通过IR查找按名称查找的Func,也可以将其藏在地图中以备将来参考。但是,这仅解决了命名的底层机制。问题在于名称本身成为接口的一部分,而调度仍然特定于代码结构的底层细节。 (并且还需要Var名称,这些名称通常更易于使用。)
此时,最好定义一个结构,该结构包含调度例程可能依赖的信息,并在构建IR时将其填写。然后可以将此结构传递给C ++函数进行调度。调度的公共部分可以抽象出来,等等。对于复杂的情况,我们经常使用C ++循环,即使所有IR是在单个例程中构建和调度的,也可以将调度的一部分应用于一组Funcs。实际上,该结构封装了算法和调度之间的接口。
如果您想将时间表写入与C ++代码分开的文件中,我们正在努力进行更好的序列化和反序列化,从而提供了另一个方面。但是再次,您仍然必须知道计划的代码的详细信息才能使其正常工作。它还涉及使用序列化格式作为用于调度的编程语言或开发另一种语言。
当前最有希望的途径是自动启发式调度。 Ravi Teja Mullapudi等人在SIGGRAPH上发表了一篇论文。