2015-08-25 23 views
2

我在Siggraph多年來參加了一些Halide面板,最後決定做一些測試以確定它是否有助於轉碼現有軟件。迄今爲止,結果令人印象深刻。意外的行爲:空循環導致模糊功能中的改進結果

我正在寫一個基於Siggraph 2015上展示的代碼的高斯模糊,並遇到了一些我無法理解的奇怪行爲。我不確定這是我自己的誤解還是某種錯誤/「功能」。

請參閱下面的代碼,注意空循環。 gkernel和normalize是我寫的用來產生高斯係數的函數。當我編譯並運行帶有循環註釋的代碼時,輸​​出圖像爲黑色(全爲零)。當我離開函數中的空循環執行得更快,並且輸出圖像正確模糊。

我錯過了一些基本的東西,或者是這種錯誤?我在Windows上使用MSVS專業2013 7.

功能代碼:

Func HalideGBlur(Func f){ 
    float k[3]; 
    gkernel(k); 
    normalize(k); 

    for (int i = 0; i < 1; i++){ 
     ; 
    } 

    Func ypass; 
    ypass(X, Y, C) = (k[1] * f(X, Y, C) + 
         k[0] * (f(X, Y - 1, C) + f(X, Y + 1, C))); 
    Func xpass; 
    xpass(X, Y, C) = (k[1] * ypass(X, Y, C) + 
         k[0] * (ypass(X -1, Y, C) + ypass(X + 1, Y, C))); 

    //scheduling for x and y passes 
    xpass.compute_root().vectorize(X, 8).parallel(Y); 
    ypass.compute_at(xpass, Y).vectorize(X, 8); 
    return xpass; 
} 

相關執行代碼:

Func g = HalideGBlur(bounded_image); 

htime = ocvtime = FLT_MAX; 
cout << "\n****Testing Gaussian Blur****\n"; 
//Run Halide tests 
for (int x = 0; x < 10; x++){ 
    start_time = omp_get_wtime(); 
    g.realize(output); 
    end = omp_get_wtime() - start_time; 
    if (end < htime){ htime = end; } 
} 
cout << "halide best: " << htime << "\n"; 

結果沒有意義的循環:

****Testing Gaussian Blur**** 
halide best: 0.0246554 
ocv best: 0.0318704 
Halide is 1.2926 times as fast as OpenCV. 

結果與無意義的循環:

****Testing Gaussian Blur**** 
halide best: 0.00749808 
ocv best: 0.0317644 
Halide is 4.2363 times as fast as OpenCV. 

回答

0

這是一個益智遊戲。也許你有一個內存跺腳的bug,並且這個循環會影響棧框架佈局。在Windows上可以使用valgrind來檢查嗎?

+0

我跑了VS的性能分析器,並沒有發現任何明顯的內存地址問題。我確實嘗試了一些其他的實驗,表明記憶跺腳的可能性。我刪除了循環,並試圖聲明一個integerI使用4個元素而不是3來初始化數組。這固定了問題並且輸出圖像是正確的。 – BHawk

+0

編輯 - 我刪除了循環,並試圖宣佈一個整數:輸出圖像仍然是黑色的。我用4個元素而不是3來初始化數組:輸出圖像是正確的(建議內存跺腳)。看起來很奇怪,內存跺腳會影響結果圖像,特別是因爲我沒有在計算中引用數組中的第3 [2]元素。我會繼續試驗,看看我能否就這個問題獲得更多有用的數據。 – BHawk