0

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

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

4

1 回答 1

1

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

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

如果您想将计划写入与 C++ 代码分开的文件中,我们正在研究更好的序列化和反序列化,这提供了另一种切片。但是再一次,您仍然必须知道要安排的代码的详细信息才能使其正常工作。它还涉及使用序列化格式作为调度的编程语言或开发另一种语言。

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

于 2016-05-26T20:08:22.610 回答