2016-05-26 46 views
0

我有一個Halide管道,我想嘗試幾個時間表。我想通過創建一個單獨的文件並進行優化來實現這一點,然後在運行時將這些文件應用於給定的Func,這樣我就可以自動嘗試找到最快的文件。在Halide管道中訪問Funcs

我開始編寫自己的函數來執行此操作,但對於compute_at等一些優化,這變得相當複雜。 compute_at將Func作爲第一個參數。有沒有辦法在管道中訪問Funcs,而不必保留所有函數的列表,然後將這個列表傳遞給我的函數?我明白,由於Halide的設計方式,這可能根本不可能。

回答

0

紅外線可以通過名稱找到Func's,也可以將它們藏在地圖中以備將來參考。然而,這只是解決了命名的低級機制。問題在於名稱本身成爲接口的一部分,調度仍然針對代碼結構的低級細節。 (並且還需要Var名稱,這些名稱通常更易於使用。)

此時,定義包含調度例程可以依賴的信息並填充它的結構會更好當建立IR時。然後可以將這個結構傳遞給C++函數來進行調度。調度的常見部分可以被抽象出來等等。對於複雜情況,我們經常使用C++循環等將一大塊調度應用於一組Func,即使所有IR都是在單個例程中構建和調度的。實際上,結構封裝了算法和調度之間的接口。

我們正在研究更好的序列化和反序列化,如果您想要將調度寫入獨立於C++代碼的文件,可以對此進行另外的分片。但是,再一次,您仍然必須知道正在計劃的代碼的細節才能使其工作。它還涉及使用序列化格式作爲調度或開發另一種語言的編程語言。

目前最有希望的途徑是自動啓發式調度。 Ravi Teja Mullapudi等人在SIGGRAPH上發表了一篇論文。