9

这将是我发布的第一个 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_epu8and _mm_sad_epu8,但它们都以 4、16blockSize或 32为目标。例如来自 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 个连续字节。

我将不胜感激对此的任何想法。

4

1 回答 1

1

我怀疑如果块大小小到 3-5 字节 x 3-5 字节,那么使用 SSE 或类似指令您将获得相当少的好处,因为您将花费太多快速计算的“收益”在“swizzling”(将数据从一个地方移动到另一个地方)。

但是,查看代码,您似乎rImage[i, j]多次处理相同的内容,我认为这没有意义。

于 2013-04-11T16:27:45.763 回答