块匹配优化使用x86/x64流SIMD扩展
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;
}
}
我知道流式SIMD扩展包含许多指令,以方便使用SAD进行块匹配,例如_mm_mpsadbw_epu8
和_mm_sad_epu8
,但它们都针对blockSize
s,即4,16或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) );
但是从这里开始,我不知道从s0
中总结3或5个连续字节的方法!
我将感谢任何关于这个的想法。
我怀疑如果块大小只有3-5个字节x 3-5个字节,那么使用SSE或类似的指令将获得相当少的好处,因为您将花费太多的"增益"来快速进行"swizzling"(将数据从一个地方移动到另一个地方)的数学运算。
然而,查看代码,看起来您正在多次处理相同的rImage[i, j]
,我认为这没有意义。
相关文章:
- 为x86而非x64编译时出错
- 为什么在 x64 中忽略__stdcall调用约定?
- 在 C++ 中使用 SIMD 向量的矩阵乘法
- 使用 VS2015 在 Windows 10 上构建 Fortran .lib x64 位并将其链接到 C++
- 加载"D:UsersPublicDocumentsopencvbuildx64vc14binopencv_world340d.dll",找不到或打开PDB文件
- VS 2017 使用交叉编译器构建 x64 项目
- 在VS2019项目中集成ImageMagick:x64-windows-static library
- C++变量在调用 x64 程序集函数后重置为 0
- 在 masm x64 上打印具有多个参数
- 在Visual Studio中使用vcpkg使用paho-mqtt x64时出错
- 以 x64 配置访问证书公钥
- 为什么从具有较大阵列的 SIMD 内部函数中获得的相对加速比标量更大?
- 是否有用于元素部分移位的 simd 指令/内在/内置指令?
- 发布代码的 gdb 堆栈跟踪可读性如何影响 x64?
- 如何从 x64 程序集中的堆栈中获取参数?
- C++ OPENCV 4.3.0 x64 为什么face_cascade抛出错误?
- 如何在 x64 上"stack oveflow"例外
- 关于连续迭代器的 SIMD 指令
- 为什么 C++ 标准库中没有 SIMD 功能?
- 块匹配优化使用x86/x64流SIMD扩展