首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用SIMD优化for循环的计算?

如何使用SIMD优化for循环的计算?
EN

Stack Overflow用户
提问于 2019-05-09 12:04:21
回答 1查看 247关注 0票数 1

我正在尝试使用Neon SIMD在ODROID XU4 ARM平台上加速一个立体匹配算法。对于这个puropose,我使用openMp的编译指示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 void StereoMatch:: sadCol(uint8_t* leftRank,uint8_t* rightRank,const int SAD_WIDTH,const int SAD_WIDTH_STEP, const int imgWidth,int j, int d , uint16_t* cost) 
  {

   uint16_t sum = 0;
   int n = 0;
   int m =0;
      for ( n = 0; n < SAD_WIDTH+1; n++)
      {

     #pragma omp simd
     for(  m = 0; m< SAD_WIDTH_STEP; m = m + imgWidth ) 
         {


        sum += abs(leftRank[j+m+n]-rightRank[j+m+n-d]);

         };
         cost[n] = sum;
         sum = 0;



  };

我对SIMD和openMp比较陌生,我知道在代码中使用SIMD杂注将指导编译器向量化减法,但当我执行代码时,我注意到没有区别。我应该向我的代码添加什么才能将其矢量化?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-17 15:53:31

正如评论中所说,ARM-Neon有一条指令,可以直接做你想做的事情,即计算无符号字节的绝对差,并将其累加为无符号短整型。

假设使用SAD_WIDTH+1==8,下面是一个使用内部函数的非常简单的实现(基于@nemequ的简化版本):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void sadCol(uint8_t* leftRank,
            uint8_t* rightRank,
            int j,
            int d ,
            uint16_t* cost) {
    const int SAD_WIDTH = 7;
    const int imgWidth = 320;
    const int SAD_WIDTH_STEP = SAD_WIDTH * imgWidth;

    uint16x8_t cost_8 = {0};
    for(int m = 0; m < SAD_WIDTH_STEP; m = m + imgWidth )  {
        cost_8 = vabal_u8(cost_8, vld1_u8(&leftRank[j+m]), vld1_u8(&rightRank[j+m-d]));
    };
    vst1q_u16(cost, cost_8);
};

vld1_u8加载8个连续字节,vabal_u8计算绝对差值并将其累加到第一个寄存器。最后,vst1q_u16将寄存器存储到内存中。

您可以轻松地设置imgWidthSAD_WIDTH_STEP函数参数。如果SAD_WIDTH+1是8的不同倍数,您可以为此编写另一个循环。

我手头没有ARM平台来测试它,但是“它可以编译”:https://godbolt.org/z/vPqiYI (在我看来,程序集看起来很好)。如果您使用-O3进行优化,则gcc将展开循环。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56059038

复制
相关文章
如何优化循环
有时候你会遇到循环,或者递归函数,它们会花费很长的执行时间,可能是你的产品的瓶颈。在你尝试使循环变得快一点之前,花几分钟考虑是否有可能把它整个移除掉,有没有一个不同的算法?你可以在计算时做一些其他的事情吗?如果你不能找到一个方法去绕开它,你可以优化这个循环了。这是很简单的,move stuff out。最后,这不仅需要智慧而且需要理解每一种语句和表达式的开销。这里是一些建议:
硬核编程
2019/09/17
9610
MATLAB循环_matlab如何循环计算
1. while循环 在给定条件为真时,重复一个语句或一组语句。它在执行循环体之前测试状态。 语法 MATLAB中while循环的语法是 : while <expression> <statements> end 只要表达式(expression)为true,while循环将重复执行程序语句(statements)。 当结果为非空并且包含所有非零元素(逻辑或实数)时,表达式(expression)为true。 否则,表达式(expression)为false。 栗子: a = 10; % while loop execution while( a < 20 ) fprintf(‘value of a: %d\n’, a); a = a + 1; end 执行上面示例代码,得到以下结果 – value of a: 10 value of a: 11 value of a: 12 value of a: 13 value of a: 14 value of a: 15 value of a: 16 value of a: 17 value of a: 18 value of a: 19 2. for循环 多次执行一系列语句,并缩写管理循环变量的代码。 for循环是一种重复控制结构,可以让您有效地编写一个需要执行特定次数的循环。 语法 MATLAB中for循环的语法是 for index = values <program statements> … End 值(values)具有以下格式 – 值格式 描述 initval:endval index变量从initval到endval每次递增1,并重复程序语句 的执行,直到index大于endval。 initval:step:endval 通过每次迭代值步长(step)增加索引(index)的值,或者 当step为负时递减。 valArray 在每个迭代中从数组valArray的后续列创建列向量索 引。 例如,在第一次迭代中,index = valArray(:,1)。 循环最多执行n次,其中n是由numel(valArray,1,:)给出的valArray的列数。valArray可以是任何MATLAB数据类型,包括字符串,单元格数组或结构体。 前两种挺简单的,所以在此值对于第三种语法进行举例子说明: X=rand(5,1); for i=X i end X=rand(1,5); for i=X i end 运行结果是: i = 0.4898 0.4456 0.6463 0.7094 0.7547 i = 0.2760 i = 0.6797 i = 0.6551 i = 0.1626 i = 0.1190 注意:对于向量建立的是列向量索引!! X=magic(3); X for i=X i end 运行输出
全栈程序员站长
2022/11/10
2.5K0
SIMD
SIMD(发音/sim-dee/)是“Single Instruction/Multiple Data”的缩写,意为“单指令,多数据”。它是 JavaScript 操作 CPU 对应指令的接口,你可以看做这是一种不同的运算执行模式。与它相对的是 SISD(“Single Instruction/Single Data”),即“单指令,单数据”。 SIMD 的含义是使用一个指令,完成多个数据的运算;SISD 的含义是使用一个指令,完成单个数据的运算,这是 JavaScript 的默认运算模式。显而易见,SIMD 的执行效率要高于 SISD,所以被广泛用于 3D 图形运算、物理模拟等运算量超大的项目之中。
小小杰啊
2022/12/21
7270
性能优化-多层嵌套for循环如何优化
代码示例 package com.cwl.po; /** * @program: cwl-performance-optimization * @description: 测试for循环-嵌套循环 * @author: ChenWenLong * @create: 2019-11-22 11:27 **/ public class TestNestedLoop { // 当需要嵌套循环时 外层循环越小 性能越好 // 例如 10*100*1000 与 1000*100*10
cwl_java
2019/11/29
3.5K0
python如何使用for循环_Python 中for循环的应用
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170074.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
7K0
bash for循环是如何使用的
10 Bash for Loop In One Line Examples Bash For Loop Examples In Linux What Is Bash in Linux? Bash fo
用户8418197
2021/09/11
2.1K0
嵌套循环的优化
今天拿到这样一个需求:有Map A和Map B,这两个Map都持有着一个同样的key——id,其对应的value可能相同,也可能不相同。现在需要对两个Map中该key对应的value相同的键值对做些特殊的操作。
雨临Lewis
2022/01/11
2.4K0
优化循环的方法-循环展开
循环展开对于算术运算来说,优化的作用是很大的。我分别对整数运算和浮点数运算作了多次测试,得出表格如下:
谭光志
2020/09/28
9780
如何优化云计算投资
关注组织的目标可以确保支出、连接性和安全性保持在可控制的范围内,并与组织的IT愿景保持一致。成本优化的云平台将利用所有资源并以更低成本实现目标,从而使组织能够专注于其他IT优先事项。
静一
2020/06/17
8240
DCIM如何优化边缘计算
边缘计算,也被称为雾计算(与云计算类似,只是位置更接近),近年来由于许多原因越来越受欢迎。但是,对于监控和管理IT基础设施的工作人员来说,计算能力、处理和存储的分散化带来了独特的挑战。 边缘计算广泛应用的原因 边缘计算的应用越来越广泛的原因是,诸如流媒体视频内容和带宽密集型的其他信息需要在本地保留数据。内部部署计算正被用于商业,公共场所和娱乐场所的面部识别和安全,以及零售点和分支机构的过程自动化。 边缘计算还可以实现更低的延迟,并且由于边缘数据中心可能位于二级市场,数据中心运营商需要更低的带宽成本
静一
2018/03/28
1K0
DCIM如何优化边缘计算
CPU SIMD简介
之前的两篇文章,分别介绍了CPU和CPU Cache两个话题,性能是永恒的核心。我们也谈到了优化CPU性能面临的三堵墙:
Peter Lu
2018/09/30
2.5K0
CPU SIMD简介
第18讲 for循环优化:嵌套的for循环
ug902(v2018.1) High-Level Synthesis User Guide page 313 - page 321
Lauren的FPGA
2019/10/31
1.5K0
常见的for循环优化方式
经常使用一些循环,进行耗时计算的操作,特别是 for 循环,它是一种重复计算的操作,如果处理不好,耗时就比较大,如果处理书写得当,将大大提高效率,下面总结几条 for 循环的常见优化方式。
程序员 NEO
2023/10/12
2600
常见的for循环优化方式
我们都经常使用一些循环耗时计算的操作,特别是for循环,它是一种重复计算的操作,如果处理不好,耗时就比较大,如果处理书写得当将大大提高效率,下面总结几条for循环的常见优化方式。
Kevin_Zhang
2021/10/21
1K0
使用SIMD指令校验UTF-8
翻看postgresql email list,发现有对SIMD指令应用到PG的讨论,很有价值。记录下来以作分析使用。
yzsDBA
2022/01/05
4440
python中如何使用for循环_python循环5次
for循环可以把字符串里面的元素都依次取出来,自动赋值给变量i然后再执行循环体内的代码块
全栈程序员站长
2022/09/22
4.9K0
python中如何使用for循环_python循环5次
CNN 的计算是如何进行优化的?
传统的卷积计算方式如上图所示(上半部分),是提取一个个与 Kernel 大小一致的图像区域,然后分别和 Kernel 进行计算得到输出结果。
caoqi95
2019/07/28
1.1K0
Doris开发手记2:用SIMD指令优化存储层的热点代码
最近在进行Doris的部分查询调优工作,通过perf定位CPU执行热点时,发现了以下的热点部分:
HappenLee
2021/07/14
1.3K0
Doris开发手记2:用SIMD指令优化存储层的热点代码
如何在JavaScript中使用for循环
循环允许我们通过循环数组或对象中的项并做一些事情,比如说打印它们,修改它们,或执行其他类型的任务或动作。JavaScript有各种各样的循环,for循环允许我们对一个集合(如数组)进行迭代。
chuckQu
2022/11/28
5.1K0
如何在JavaScript中使用for循环
如何在 Bash 中使用循环
人们希望学习批处理命令的一个普遍原因是要得到批处理强大的功能。如果你希望批量的对文件执行一些指令,构造一个可以重复运行在那些文件上的命令就是一种方法。在编程术语中,这被称作执行控制,for 循环就是其中最常见的一种。
用户1880875
2021/09/18
1.6K0

相似问题

优化SIMD直方图计算

11

SIMD优化难题

40

如何使用循环优化数组计算?

313

环的SSE SIMD优化

53

基于SIMD的HOG优化

210
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文