当前位置: 首页 > 知识库问答 >
问题:

使用x86/x64 Streaming SIMD扩展进行块匹配优化

沈茂
2023-03-14

这将是我发布的第一个问题!

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

我正在尝试使用Intel的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;
        }
    }

我知道,数据流单指令多数据扩展指令集包含许多指令,以便于使用SAD进行块匹配,例如mm\u mpsadbw\u epu8和mm\u SAD\u epu8,但它们都以4、16或32为目标。e、 g.此代码来自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个连续字节的总和的方法!

如果您对此有任何想法,我将不胜感激。

共有1个答案

东郭承业
2023-03-14

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

但是,看看代码,看起来您正在多次处理相同的笠美,我认为这没有意义。

 类似资料:
  • Axis2可以通过模块(Module)进行扩展。Axis2模块至少需要有两个类,这两个类分别实现了Module和Handler接口。开发和使用一个Axis2模块的步骤如下: 编写实现Module接口的类。Axis2模块在进行初始化、销毁等动作时会调用该类中相应的方法)。 编写实现Handler接口的类。该类是Axis2模块的业务处理类。 编写module.xml文件。该文件放在META-INF目录

  • 本文向大家介绍php使用自带dom扩展进行元素匹配的原理解析,包括了php使用自带dom扩展进行元素匹配的原理解析的使用技巧和注意事项,需要的朋友参考一下 DOMDocument php提供了非常好用的解析html和xml文档的扩展库DOM,使用这个库可以非常高效的进行html和xml文档的解析,它的原理就是通过寻找首尾匹配对来进行文档的解析。 从上面的分析可以看出,如果首位不匹配,可能就会导致一

  • 问题内容: 我正在尝试使用简单的Chrome扩展程序,但是在为数组提供值时遇到了问题。 当我尝试将此扩展程序加载到Chrome中时,收到以下消息: 无法从“ C:\ Users \ foo \ Desktop \ Extensions \ bar”加载扩展名。 “ content_scripts”的值无效。 我看不到我的值是什么“无效”。我想做的是匹配每个URL,以便我的扩展程序可以操纵它所运行的

  • 场景:匹配算法已识别ID1,ID2已匹配。我需要对匹配做进一步的分析。为此,我需要减少输出中的行数并正确排序。 这个输入只是样本和子集。拥有数千条实际记录使这项任务变得困难。 输入: 预期产出: 我需要确保输出应该有ID,应该有ID1和ID2组合的不同记录,这仍然很好,因为我可以进行distinct和union。 棘手的部分是确保输出中的数据排序。我需要将相似的行按顺序排列。 示例: 111,22

  • 问题内容: 我有一个名为“ acts”的表,该表具有3个被索引在一起的列: 在表格中,一行有一个名为“红色暴动”的行为 当我执行以下搜索时,结果中会出现红色暴动: 但是,如果我对此进行扩展并搜索,则不会返回任何结果: 这是为什么?有没有更好的方法在查询中使用通配符? 我尝试更改为,但这在任一查询上均未返回任何结果。 问题答案: 值“ re”是MATCH()搜索的停用词。 http://dev.my

  • 问题内容: 我对使用ngram的单词有部分匹配。如何修改映射以始终偏爱精确匹配而不是ngram令牌?我不想修改查询。一个搜索框将搜索多种类型,每种类型都有各自的字段。 例如,假设我正在搜索职位,一个人的标题为“现场工程师”,另一个人的标题为“引擎技术员”。如果用户搜索“引擎”,我希望ES将后者返回为更相关。 我几乎逐字使用此映射:例外:我使用的ngram的最小值为3,最大值为11,而不是边缘ngr