技术标签: NEON
目录
令初始数据为:
float d0[4] = {0.f, 1.f, 2.f, 3.f};
float d1[4] = {4.f, 5.f, 6.f, 7.f};
float d2[4] = {8.f, 9.f, 10.f, 11.f};
float d3[4] = {12.f, 13.f, 14.f, 15.f};
float32x4_t q0 = vld1q_f32(d0); // 加载 d0 地址起始的 4 个 float 数据到 q0
vst1q_f32(d1, q0);// 将 q0 中 4 个 float32,赋值给以 d1 为起始地址的 4 个 float32
float d4[8]= {1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f};
float32x4x2_t ret = vld2q_f32 (d4);
注意,此时在寄存器是交错读取的!
vst2q_f32 (d4, ret);
注意,由于寄存器是交错存储的,所以内存保持不变!
float d5[12] = {1.f, 2.f, 3.f, 4.f,
5.f, 6.f, 7.f, 8.f,
9.f, 10.f, 11.f, 12.f};
float32x4x3_t f = vld3q_f32 (d5);
vst3q_f32 (d5, f);
略
float32x4_t res = vdupq_n_f32(0.f); // 存储的四个 float32 都初始化为 0
float32x4x2_t q4 = vzipq_f32 (q0, q1);
float32x4x2_t ret = vuzpq_f32 (q0, q1);
可见,打包 (zip)、拆包(unzip)并不是想当然的可逆的运算
float32x2_t a = vget_low_f32(q0);
float32x2_t b = vget_high_f32(q0);
float32x4_t ret = vcombine_f32 (a, b);
float32x2_t low = vget_low_f32(q0); // 取低2位
float32x2_t high = vget_high_f32(q0); // 取高2位
float32x4x2_t ret = vtrnq_f32 (q0, q1)
// 拼接两个寄存器并返回从第 n 位开始的大小为4的寄存器 0<=n<=3
res = vextq_f32(q0, q1, 2); //取 q1 低2位,拼接到 q0 的高位,保留 q0 的高2位(移到低位)
// q0, q1 实际数据没有变化
uint8x8_t ret = vext_u8 (p, q, 2); // 取 q 的低两位作为 p 的高位,p 向左移动两位腾出空间
float lane0 = vget_lane_f32(ss0, 0);// get 0th parameter in vector
float32x4_t res = vsetq_lane_f32(d1[0], q1, 1);//用 d1[0] 的数据替换掉 q1[1](q1 实际数据没有变化)
int8x8_t r = vtbl1_s8 (p, q);
int8x8_t s = vrev16_s8 (q);
uint32x4_t ui0 = vcvtq_u32_f32 (q0);
int32x4_t i0 = vcvtq_s32_f32 (q1);
float32x4_t f0 = vcvtq_f32_s32 (i0);
float32x4_t uf0 = vcvtq_f32_u32 (ui0)
uint32x2_t c = vceq_f32 (a, b); // 等于
uint32x4_t q = vceqq_f32 (q1, q2); // 等于
float32x4_t ret = vmaxq_f32 (q2, q1);
float32x4_t ret0 = vminq_f32 (q2, q1);
int8x8_t r = vpmax_s8 (p, q);
int8x8_t s = vpmin_s8 (p, q);
int32x4_t q1 = vclsq_s32 (q0); // 统计和符号位相同的 bit 数(不包括符号位)
int32x4_t q2 = vclzq_s32 (q0); // 统计前缀 0 的个数
int8_t d0[8] = {0, 1, 2, 3, 4, 5, 6, 7};
int8x8_t q = vld1_s8(d0);
int8x8_t p = vcnt_s8 (q); // 二进制形式的 1 的个数
int8x8_t q = vmvn_s8 (p); // 按位取反
int8x8_t r = vqneg_s8 (p);
int8_t d0[8] = {0, 1, 2, 3, 4, 5, 6, 7};
int8_t d1[8] = {1, 1, 2, 2, 3, 3, 4, 4};
int8x8_t p = vld1_s8(d0);
int8x8_t q = vld1_s8(d1);
int8x8_t pq = vqshl_s8 (p, q); // 左移对应的位数
如果移位是负数 ,则变成截断的右移
int8_t d0[8] = {0, 1, 2, 3, 4, 5, 6, 7};
int8_t d1[8] = {-1, -1, -2, -2, -3, -3, -4, -4};
int8x8_t p = vld1_s8(d0);
int8x8_t q = vld1_s8(d1);
int8x8_t pq = vqshl_s8 (p, q);
略
float32x2_t ss0 = vadd_f32(vget_low_f32(q2), vget_high_f32(q2));//对应元素相加
float32x4_t q4 = vaddq_f32 (q1, q2);
float32x2_t ss1 = vpadd_f32(vget_low_f32(q2), vget_high_f32(q2));//相邻元素相加
float32x4_t res0 = vmulq_f32(q0, q1); //点乘
float32x4_t res1 = vmlaq_f32(q0, q1, q2);// q0 + q1*q2
// ri = ai + bi * c[d];
float32x4_t res = vmlaq_lane_f32(q0, q1, vget_low_f32(q2), 0);//取 q2 的第0个数,分别与 q1 中的 4 个数相乘,得到 4 个结果与 q0 累加
float32x4_t max = vmaxq_f32(q1, q2);//对应元素比较,取最大
float32x4_t q5 = vrecpeq_f32 (q1); // 倒数
float32x4_t q6 = vrsqrteq_f32 (q1); // 倒数平方根
待续
文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib
文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang
文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些
文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器
文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距
文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器
文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn
文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios
文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql
文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...
文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120
文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数