簡體   English   中英

使用x86 / x64 Streaming SIMD Extension進行塊匹配優化

[英]Block Matching optimization using x86/x64 Streaming SIMD Extension

這將是我發布的第一個SO問題!

    std::cout << "Hello mighty StackOverflow!" << std::endl;

我正在嘗試使用英特爾的SSE4.2和/或AVX內在函數優化立體視覺應用的“塊匹配”實現。 我正在使用“絕對差異之和”來找到最佳匹配塊。 在我的情況下, blockSize將是一個奇數 ,例如3或5.這是我的C ++代碼片段:

    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            minS = INT_MAX;
            for (int k = 0; k <= beta; ++k) {
                S = 0;
                for (int l = i; l < i + blockSize; ++l) {
                    for (int m = j; m <= j + blockSize ; ++m) {
                        // adiff(a,b) === abs(a-b)
                        S += adiff(rImage.at<uchar>(l, m), lImage.at<uchar>(l, m + k));
                    }
                }
                if (S < minS) {
                    minS = S;
                    kStar = k;
                }
            }
            disparity.at<uchar>(i, j) = kStar;
        }
    }

我知道Streaming SIMD Extension包含許多指令,以便利用SAD進行塊匹配,例如_mm_mpsadbw_epu8_mm_sad_epu8 ,但是它們都是針對blockSize或32的blockSize例如來自Intel的代碼 我的問題是在我的應用程序中, blockSize是一個奇數,大多數是3或5。

我考慮了以下起點:

            r0 = _mm_lddqu_si128 ((__m128i*)&rImage.at<uchar>(i, j));
            l0 = _mm_lddqu_si128 ((__m128i*)&lImage.at<uchar>(i, j));
            s0 = _mm_abs_epi8 (_mm_sub_epi8 (r0 , l0) );

但是從這里開始,我不知道從s0總結3或5個連續字節的方法!

我很感激任何想法。

我懷疑如果blocksize小到3-5個字節x 3-5個字節,那么使用SSE或類似指令你會得到相當少的好處,因為你將花費太多的“收益”來快速做數學運算在“swizzling”(將數據從一個地方移動到另一個地方)。

但是,看看代碼,看起來你rImage[i, j]處理相同的rImage[i, j] ,我覺得這沒有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM