2016-10-03 39 views
0

我正在嘗試使用Halide做一些模板計算。因此,假設一個基本的5點2D模板,爲了評估單元i,j的某個值,我需要i-1,j i-2,j,i + 1,j i + 2,j的值。現在這種工作在C++的方式是,我有一個for語句:Halide選擇語句的問題

for(int i = 2; i < max_i - 2; i++) 
for(int j = 2; j < max_j - 2; j++) 
Calculate out = some_function_of(in(i,j), in(i-1,j), in(i-2,j), in(i+1,j), in(i+2,j)) 

現在我試圖用鹵化物做同樣的事情。所以我有一個名爲Buffer的緩衝區,其中的值與我在C++代碼中的輸入數組的值相同。我有一個函數功能叫了一聲:

out(i,j) = select(i >= 2 && j >= 2, some_function_of(in(i,j), in(i-1,j), in(i-2,j), in(i+1,j), in(i+2,j)) ,0.0f)

當我運行這段代碼,我得到了以下錯誤:

Error: Input buffer b0 is accessed at -1, which is before the min (0) in dimension 0 Aborted (core dumped)

從我的理解,此錯誤的原因是,選擇語句計算這兩個語句都是如此,儘管我不想計算i和j值小於2的任何值,函數在i = 0和j = 0時計算,因此無效地址訪問。

因此,無論如何要在Halide做到這一點? if/else語句是否還有其他等價物?

回答

2

使用的邊界條件會做你想要什麼: Func unbounded; unbounded(i, j,) = some_function_of(in(i,j), in(i-1,j), in(i-2,j), in(i+1,j), in(i+2,j)); out(i, j) = BoundaryConditions::constant_exterior(unbounded, 0.0f, 2, width - 4, 2, height - 4)(i, j);

我相信你可以使用的「寬 - 4」,而不是「Expr的()」 - 如果你想最大的無界或「4高」。

如果BoundaryConditions函數允許暗示編譯器指出if/else結構的哪個方向更可能,那麼使用它。