ARM Neon 列子 - Vector Add


///
// ARM Neon/** FIR 滤波器*           y(n)=h(0)x(n) + h(1)x(n-1) + h(2)x(n-2) + ... h(N-1)x(n-N-1)**/
void TaskManger::fir_filter_c(short * y, const short *x, const short *h, int n_out, int n_coefs)
{int n;for (n = 0; n < n_out; n++){int k, sum = 0;for(k = 0; k < n_coefs; k++){sum += h[k] * x[n - n_coefs + 1 + k];}y[n] = ((sum>>15) + 1) >> 1;}
}void fir_filter_neon(short * y, const short *x, const short *h, int n_out, int n_coefs)
{int n, k;int sum;int16x4_t h_vec;int16x4_t x_vec;int32x4_t result_vec;for (n = 0; n < n_out; n++){/* Clear the scalar and vector sums */sum = 0;result_vec = vdupq_n_s32(0);      /* vdup -> duplicates a scalar into every element of the destination vector */for(k = 0; k < n_coefs / 4; k++){/* Four vector multiply-accumulate operations in parallel */h_vec = vld1_s16(&h[k*4]);x_vec = vld1_s16(&x[n - n_coefs + 1 + k*4]);result_vec = vmlal_s16(result_vec, h_vec, x_vec);}/* Reduction operation - add each vector lane result to the sum */sum += vgetq_lane_s32(result_vec, 0);sum += vgetq_lane_s32(result_vec, 1);sum += vgetq_lane_s32(result_vec, 2);sum += vgetq_lane_s32(result_vec, 3);/* consume the last few data using scalar operations */if(n_coefs % 4){for(k = n_coefs - (n_coefs % 4); k < n_coefs; k++)sum += h[k] * x[n - n_coefs + 1 + k];}/* Store the adjusted result */y[n] = ((sum>>15) + 1) >> 1;}
}/** RGB转灰度图像*/void reference_convert (uint8_t * __restrict dest, uint8_t * __restrict src, int n)
{int i;for (i=0; i<n; i++){int r = *src++; // load redint g = *src++; // load greenint b = *src++; // load blue// build weighted average:int y = (r*77)+(g*151)+(b*28);// undo the scale by 256 and write to memory:*dest++ = (y>>8);}
}void neon_convert (uint8_t * __restrict dest, uint8_t * __restrict src, int n)
{int i;uint8x8_t rfac = vdup_n_u8 (77);uint8x8_t gfac = vdup_n_u8 (151);uint8x8_t bfac = vdup_n_u8 (28);n /= 8;for (i=0; i<n; i++){uint16x8_t  temp;uint8x8x3_t rgb  = vld3_u8 (src);            // vld3 ->loads 3 vectors from memory. 就是 uint8x8_t val[3]uint8x8_t result;temp = vmull_u8 (rgb.val[0],      rfac);     // 长指令相乘temp = vmlal_u8 (temp,rgb.val[1], gfac);temp = vmlal_u8 (temp,rgb.val[2], bfac);result = vshrn_n_u16 (temp, 8);              // vshrn -> ri = ai >> b; 移位指针vst1_u8 (dest, result);                      // vst1 -> stores a vector into memorysrc  += 8*3;dest += 8;}
}/** Vector add */uint32_t TaskManger::vector_add_c(uint32_t *s, uint32_t n)
{// assert n % 4 == 0uint32_t sum = 0;for(uint32_t i = 0; i < n; i++)sum += *s++;return sum;
}uint32_t TaskManger::vector_add_neon(uint32_t *s, uint32_t n)
{// assert n % 4 == 0uint32_t sum, *i;uint32x2_t vec64a, vec64b;uint32x4_t vec128 = vdupq_n_u32(0);for (i = s; i < (s + n); i += 4){uint32x4_t temp128 = vld1q_u32(i);            // 从内存加载一个向量vector, vld1 -> loads a vector from memoryvec128 = vaddq_u32(vec128, temp128);          // 向量相加uint32x4_t相加,一次加4个uint32_t,  vector add, vadd -> ri = ai + bi}vec64a = vget_low_u32(vec128);                    // returns the lower half of the 128-bit input vector.vec64b = vget_high_u32(vec128);                   // returns the higher half of the 128-bit input vector.vec64a = vadd_u32 (vec64a, vec64b);               // 再将     uint32x2_t 向量相加sum =  vget_lane_u32(vec64a, 0);                  // returns the value from the specified lane of a vector.sum += vget_lane_u32(vec64a, 1);return sum;
}void TaskManger::neon_demo()
{//1, demo 1
#define ELE  65536uint32_t arry[ELE];struct timeval tpstart,tpend;float timeuse;printf("run neon demo 1, vector add\n");srand((unsigned int) time(NULL));for(int i = 0; i < ELE; i++){arry[i] = rand() % 500;}// c/c++gettimeofday(&tpstart,NULL);uint32_t result2 = vector_add_c(arry, ARRAY_SIZE(arry));gettimeofday(&tpend,NULL);timeuse = 1000000*(tpend.tv_sec-tpstart.tv_sec)+ tpend.tv_usec-tpstart.tv_usec;printf("generator loop c add result:%d, used time:%f ms\n\n\n", result2, timeuse);// neongettimeofday(&tpstart,NULL);uint32_t result1 = vector_add_neon(arry, ARRAY_SIZE(arry));gettimeofday(&tpend,NULL);timeuse = 1000000*(tpend.tv_sec-tpstart.tv_sec)+ tpend.tv_usec-tpstart.tv_usec;printf("neon vector add result:%d, used time:%f ms\n\n\n", result1, timeuse);
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/242954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

任意奇数倍时钟分频

任意奇数倍时钟分频 题目描述 编写一个模块,对输入的时钟信号clk_in,实现任意奇数分频,要求分频之后的时钟信号占空比为50%。模块应包含一个参数,用于指定分频的倍数。 模块的接口信号图如下: 题目解读 题目要求实现任意奇数倍数的分频,实现分频的基本方法是采用计数器…

全款买房划算,还是贷款划算?

买房&#xff0c;很多人可能都在纠结到底是全款买房好呢&#xff0c;还是按揭贷款好呢&#xff0c;今天我们就来一起探讨下。一、全款买房优势&#xff1a;1、手续比较方便&#xff0c;不用准备太多的材料证明。2、不用支付银行利息&#xff08;贷款要多支付&#xff09;3、可以…

ARM Neon 简介

“ARM Advanced SIMD”,nick-named “NEON”, it provides: (1)、A set of interesting scalar/vectorinstructions and registers(the latter are mapped to the same chip area as theFPU ones), comparable to MMX/SSE/3DNow! in the 86 world; (2)、VFPv3-D32 as a…

简单使用Modelsim跑个仿真

简单使用Modelsim跑个仿真 第一步:打开Modelsim 第二步:点击File->New->Project(注意等待加载完了再去操作) 第三步:输入工程名称->选择工程文件->ok 第四步:添加激励文件和设计文件

企业贷款还不上,股东有偿还责任吗?

现在是一个全民创业的时代&#xff0c;创业既有个人单打独斗的&#xff0c;也有抱团合伙的。而且创业始终离不开一个话题&#xff0c;那就是钱&#xff0c;刚开始创业的企业大多数都是没有钱的&#xff1b;没有钱怎么办呢&#xff1f;那就借&#xff01;借钱确实可以解决企业发…

农村房屋能抵押做贷款吗?

在贷款过程中&#xff0c;很多时候贷款机构都会问借款人有没有抵押物&#xff1f;如果有抵押物不论是对于抵押贷款还是信用贷款都是有很大的帮助。所以经常出现很多借款人提到农村的房屋算抵押物吗&#xff1f;能不能作抵押做贷款呢&#xff1f;确实对于很多人来说&#xff0c;…

数字电路与逻辑设计笔记

数字电路与逻辑设计笔记 变量和常量的关系式 根据真值表写表达式 以真值表内输出端“1”为准 第一步&#xff1a;从真值表内找输出端为“1”的各行&#xff0c;把每行的输入变量写成乘积形式;遇到“0”的输入变量上加非号。 第二步&#xff1a;把各乘积项相加&#xff0c;即…

ARM和NEON指令 very gooooooood.............

http://blog.csdn.net/chshplp_liaoping/article/details/12752749 在移动平台上进行一些复杂算法的开发&#xff0c;一般需要用到指令集来进行加速。目前在移动上使用最多的是ARM芯片。 ARM是微处理器行业的一家知名企业&#xff0c;其芯片结构有&#xff1a;armv5、armv6、a…

未成年人可以申请贷款吗?

缺钱是很多人都会遇到的问题&#xff0c;包括未成年人&#xff0c;所以我们经常看到一些未成年人去申请贷款&#xff0c;那未成年人到底能不能贷款呢&#xff1f;在这可以肯定的告诉大家&#xff0c;如果是正规的贷款机构&#xff0c;是不允许给未成年人放贷的。那为什么贷款机…

逾期之后还能贷款吗?

逾期是一件很让人头疼的事情&#xff0c;因为一旦和逾期扯上关系&#xff0c;贷款就比较困难。甚至有一句话说到“一旦逾期深似海&#xff0c;从此贷款是路人”&#xff0c;虽然这句话有点夸大其词&#xff0c;但是逾期对贷款申请的影响是不争的事实。银行对征信的要求有一个原…

VCS安装

基于软件 ubuntu-14.04.2-desktop-amd64.iso/rhel-server-7.1-x86_64-dvd.iso/synopsys vcs-mx_vI-2014.03... software: installer v3.1 & scl v11.7 & vcs-mx_vI-2014.03 & ubuntu 14.04 原始synopsis vcs是 RedHat Enterprise Linux 4.0 编译的&#xff0c;&a…

你是信用卡卡奴吗?怎么摆脱卡奴?

信用卡是一把双刃剑&#xff0c;用得好对生活理财都有很大的帮助&#xff0c;用得不好&#xff0c;就会陷入卡奴的无底深渊&#xff0c;还不完的卡债&#xff0c;给不完的利息。所以&#xff0c;在使用信用卡之前&#xff0c;要多学习信用卡的相关知识&#xff0c;让信用卡成为…

CAN总线笔记

CAN总线 协议11898 边界条件 物理构成 controler&#xff08;控制器&#xff09; transver&#xff08;收发器&#xff09; 低速can收发器 高速can收发器 抗干扰能力 总线逻辑 线与逻辑 communication&#xff08;通讯&#xff09; 通信矩阵 帧格式 数据帧 总线…

常用电平标准

常用电平标准 现在常用的电平标准有TTL、CMOS、LVTTL、LVCMOS、ECL、PECL、LVPECL、RS232、RS485等&#xff0c;还有一些速度 比较高的LVDS、GTL、PGTL、CML、HSTL、SSTL等。下面简单介绍一下各自的供电电源、电平标准以及使用注意事项。 TTL&#xff1a;Transistor-Transistor…

借钱不还,法院可以单方拍卖房产吗?

借钱不还是一个让人很尴尬的事情&#xff0c;虽然有的是人确实有难处还不上&#xff0c;但是对于那些有能力还却不想还的&#xff0c;实在让人深恶痛绝。据法制晚报报道&#xff0c;有一名欠钱不还的老赖&#xff0c;不但拒绝偿还债权人的钱&#xff0c;还和法院玩起了躲猫猫&a…

最小系统介绍

最小系统介绍 &#xff08;1&#xff09;电源电路 &#xff08;2&#xff09;复位电路 &#xff08;3&#xff09;晶振电路 &#xff08;4&#xff09;下载电路 1 电源电路 2 复位电路 3 晶振电路 4 下载电路 TMS320F28335支持多种启动模式

欢迎使用CSDN-markdown编辑器

欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来&#xff0c;用它写博客&#xff0c;将会带来全新的体验哦&#xff1a; Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰…

央行无意放宽松,7月贷款仍有可能吃紧

6月的信贷市场可谓硝烟四起&#xff0c;加息揽存&#xff0c;停贷&#xff0c;上调房贷利率&#xff0c;调高首付比例。。。一切看起来就是资金很紧张的局面&#xff0c;所以有不少借款需求的人在观望&#xff0c;6月过后&#xff0c;7月贷款是否会变得容易一些&#xff1f;央行…

CCS6软件安装

CCS6软件安装 第一步&#xff1a;点击右键->以管理员身份安装&#xff08;安装路径不能有中文&#xff09; 第二步&#xff1a;安装驱动