【发布时间】:2013-04-03 22:31:23
【问题描述】:
这将是我发布的第一个 SO 问题!
std::cout << "Hello mighty StackOverflow!" << std::endl;
我正在尝试使用英特尔的 SSE4.2 和/或 AVX 内在函数优化立体视觉应用的“块匹配”实现。我正在使用“绝对差异之和”来找到最佳匹配块。在我的情况下,blockSize 将是一个 odd 数字,例如 3 或 5。这是我的 C++ 代码的 sn-p:
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 扩展包含许多指令以促进使用 SAD 进行块匹配,例如 _mm_mpsadbw_epu8 和 _mm_sad_epu8 ,但它们都以 blockSizes 为目标,即 4、16 或 32。@ 987654321@。我的问题是在我的应用程序中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 个连续字节!
我将不胜感激对此的任何想法。
【问题讨论】:
-
欢迎来到 Stack Overflow!对于新成员来说,这是一个精心设计的问题。我想你很快就会得到一个好的答案。 :)
-
您只对(水平)差异感兴趣吗?
-
我怀疑最好的答案是简单地用零填充你的行/列(这样这些条目对你的最终总和没有任何贡献)。
-
总和将超过 3x3 或 5x5 块 - 即 1+8 和 1+24 项加在一起。 8 和 24 OTOH 是可以使用 SIMD 有效处理的数字。
-
是的@AkiSuihkonen。我假设之前已经对数据进行了调平。
标签: c++ c optimization sse simd