Kam*_*yar 9 c c++ optimization sse simd
这将是我发布的第一个SO问题!
std::cout << "Hello mighty StackOverflow!" << std::endl;
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用英特尔的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;
}
}
Run Code Online (Sandbox Code Playgroud)
我知道流式SIMD扩展包含许多指令,以便利用SAD进行块匹配,例如_mm_mpsadbw_epu8和 _mm_sad_epu8,但它们都接缝为4,16 blockSize或32的目标.例如来自英特尔的此代码.我的问题是在我的应用程序中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) );
Run Code Online (Sandbox Code Playgroud)
但是从这里开始,我不知道从中总结3或5个连续字节的方法s0!
我很感激任何想法.
我怀疑如果块大小小到 3-5 字节 x 3-5 字节,那么使用 SSE 或类似指令您将获得相当少的好处,因为您将花费太多快速进行数学计算的“收益”在“swizzling”(将数据从一个地方移动到另一个地方)中。
但是,查看代码,看起来您正在rImage[i, j]多次处理相同的内容,我认为这是没有意义的。