2015-08-24 76 views
2

下面是代碼。我在2015年8月5日的VS2013,Win64主幹上使用Halide。當我執行diag.compile_to_lowered_stmt(「diag.html」,{},HTML)時,halide.dll中出現堆棧溢出。「簡單」Halide程序編譯時產生堆棧溢出

Image<uint8_t> orig_uint = Tools::load_image("../foo.ppm"); 

Var x, y, c; 
Func orig("orig"), orig_lum("orig_lum"), m45("m45"), m135("m135"), f45("f45"), f135("f135"), f4x4_horiz("f4x4_horiz"), f4x4("f4x4"), diag("diag"); 

Func orig_clamped = BoundaryConditions::repeat_edge(orig_uint); 

const float wta = 1.0f, wtb = 3.0f, wt0 = wta * wta, wt1 = wta * wtb, wt2 = wtb * wtb; 

orig(x, y, c) = cast<float_t>(orig_clamped(x, y, c)); 

orig_lum(x, y) = 0.299f * orig(x, y, 0) + 0.587f * orig(x, y, 1) + 0.114f * orig(x, y, 2); 

m45(x, y) = abs(orig_lum(x - 1, y - 1) - orig_lum(x, y)) + abs(orig_lum(x, y) - orig_lum(x + 1, y + 1)) + abs(orig_lum(x + 1, y + 1) - orig_lum(x + 2, y + 2)); 

m135(x, y) = abs(orig_lum(x + 2, y - 1) - orig_lum(x + 1, y)) + abs(orig_lum(x + 1, y) - orig_lum(x, y + 1)) + abs(orig_lum(x, y + 1) - orig_lum(x - 1, y + 2)); 

f45(x, y, c) = wta * (orig(x - 1, y - 1, c) + orig(x + 2, y + 2, c)) + wtb * (orig(x, y, c) + orig(x + 1, y + 1, c)); 

f135(x, y, c) = wta * (orig(x - 1, y + 2, c) + orig(x + 2, y - 1, c)) + wtb * (orig(x, y + 1, c) + orig(x + 1, y, c)); 

f4x4_horiz(x, y, c) = wta * (orig(x - 1, y, c) + orig(x + 2, y, c)) + wtb * (orig(x, y, c) + orig(x + 1, y, c)); 

f4x4(x, y, c) = wta * (f4x4_horiz(x, y - 1, c) + f4x4_horiz(x, y + 2, c)) + wtb * (f4x4_horiz(x, y, c) + f4x4_horiz(x, y + 1, c)); 

diag(x, y, c) = select(m135(x, y) > m45(x, y), f45(x, y, c), select(m45(x, y) > m135(x, y), f135(x, y, c), f4x4(x, y, c))); 

// schedule 
orig_lum.compute_root(); 
m45.compute_root().bound(x, 0, orig_uint.width()).bound(y, 0, orig_uint.height()); 
m135.compute_root().bound(x, 0, orig_uint.width()).bound(y, 0, orig_uint.height()); 
f45.compute_at(diag, x); 
f135.compute_at(diag, x); 
f4x4.compute_at(diag, x); 
diag.compute_root(); 

// compile so we can take a look at the code 
diag.compile_to_lowered_stmt("diag.html", {}, HTML); // stack oflo here 

有沒有想法?我也很樂意接受改進的時間表,如果你想提供一個 - 我只是想先得到一些基本的運行。

(我加diag.compute_root()之後綁定對,但是這似乎並沒有幫助。我想最終夾緊診斷係數)。

回答

4

MSVC默認使用一個相當小的堆棧( 1 MB),並且許多Halide編譯器傳遞做深入遞歸的東西。我只是將堆棧大小增加到8兆字節(例如,添加編譯標記/ STACK:8388608,1048576)。這就是我們爲Windows上的Halide測試所做的。

+0

已解決,謝謝!該標誌位於鏈接器>系統屬性頁面中,作爲堆棧保留值。 –