基于CEVA DSP BX2的架构分析(五)- 标量处理单元(二)

目录

5.3.5 结果饱和度

5.3.4 乘法饱和度

5.3.5 乘法后移位

5.3.6 标量浮点支持

5.3.7 复数支持

5.3.7.1 ​​​​​​​​​​​​​​16位复杂算法支持

​​​​​​​5.3.7.2 32位复杂算法支持

5.4 SPU算术标志

​​​​​​​5.4.1 进位标志

​​​​​​​5.4.2 溢出标志

​​​​​​​5.4.3 限制标志

​​​​​​​5.4.4 除以0标志


5.3.5 结果饱和度

SPU支持在与加法、减法、移位和乘法相关的指令中自动饱和计算结果。饱和操作使SPU能够将计算结果的值限制为目标寄存器和数据类型可以表示的最小或最大值。当结果的值不能由寄存器的类型表示时,饱和应用于有符号和无符号结果。

表 5-2 列出了支持的寄存器类型的饱和值。

表5-2.饱和度值

寄存器类型

最小值

最大值

Signed Char – rZ.c

-128

127

Signed Short – rZ(p).s(2)

-32,768

32,767

Signed int – rZ.i

-2,147,483,648

2,147,483,647

Unsigned Char – rZ.uc

0

255

Unsigned Short – rZ(p).us(2)

0

65,535

Unsigned int – rZ.ui

0

4,294,967,295

在支持的情况下,可以通过程序集语法中的{sat}开关应用饱和。当应用饱和时,处理器自动断言限制标志(见第5.4.3节,限制标志)。注意:long long(64位)类型变量不支持饱和。

5.3.4 乘法饱和度

当被乘数等于由类型(短和整数)表示的最小有符号值,并且作为操作的一部分执行1的左移位时,某些乘法指令可以使乘积饱和,如中所述。表5-3

表5-3.产品饱和度

多进制类型

饱和情况

饱和值(移位后)

Short (signed 16 bits)

0x8000 x 0x8000

0x7FFF

Integer (signed 32 bits)

0x80000000 x 0x800000000

0x7FFFFFFF

乘法饱和度是为支持{psat}开关的指令指定的。{psl1}开关激活左移1,并且需要{psat}才能生效。

对于使用{sat}开关的结果饱和度,独立地选择和执行产品饱和度。

注:总移位量也受SAMR寄存器中指定的右移位规范的影响,例5-2 演示左移1的产品饱和度。

例5-2.左移1的产品饱和度

mpy{psl1,psat}r1h.s2,r2h.s2、r3.i

(0x8000 x 0x8000)<<1=0x7fffffff

当应用饱和时,处理器自动断言限制标志(有关更多详细信息,请参阅第5.4.3节,限制标志)。

5.3.5 乘法后移位

涉及乘法的指令(如mpy、mac等)可以将乘法结果向左移位1位,或向右移位多达32位。移位发生在后续操作之前,例如舍入、饱和和累加。执行多个乘法的指令(如mad、mpycx、mac3等)对每个乘法结果执行移位。

乘法后移位的方向和量由左右贡献因子的总和确定,并受编译选项和SAMR寄存器中sv字段的值的影响:

  • 左移位贡献:由{psl1}开关激活。如果激活,则将左移位贡献设置为1。如果未激活,则将左移位贡献设置为0。
  • 右移位贡献:由SAMR中sv字段中指定的量隐式激活,该量保存从0到32的无符号值,该值指定右移位量。

通过指定{ns}或{rndns}编译开关,可以禁用右移贡献(设置为0)。

当{psl1}用非零右移贡献激活时,总移位贡献是右移贡献减去1。这意味着,只有当右移位被禁用或等于0时,才能发生左移位。

​​​​​​​5.3.6 标量浮点支持

根据IEEE-754标准,SPU支持可选的浮点机制。SPU也可以配置为支持32位单精度格式。它可以进一步配置为支持16位半精度格式。该机制支持比定点格式更大的动态范围。实数算术可以用浮点格式直接编码到硬件操作中,这有助于易于使用和减少开发时间。当处理非常大的数据集和范围不容易预测的数据集时,宽动态范围特别重要。

SPU可以在每个循环上执行一个单精度或半精度浮点操作。支持以下操作:

  • 浮点加法(fpadd,hpfpadd)
  • 浮点减法(fpsub,hpfpsub)
  • 浮点乘法(fpmpy,hpfpmpy)
  • 浮点比较(fpcmp,hpfpcmp)
  • 两个浮点数的最小值和最大值(fpmin,fpmax,hpfpmin,hpfpmax)
  • 将浮点数转换为各种整数类型(fp2int、fp2long、fp2ulong等,以及匹配的半精度转换)
  • 将各种类型的整数转换为浮点数(int2fp,long2fp,等等,以及将转换匹配到半精度)
  • 从单精度转换为半精度浮点数,反之亦然(fp2hpfp,hpfp2fp)
  • 将浮点数提取到其分量(fpextract、hpfpextract)
  • 将整数分量组合为浮点数(fpcombine,hpfp联合收割机)
  • 浮点乘法和正或负累加(fpmac、fpmsu、hpfpmac和hpfpmsu)
  • 非规格化浮点数的整数分量的规格化(fpcombine{fpnormal},hpfpcombine{hpfpnormal})
  • 整数分量的舍入和打包为浮点数(fpcombine{fpround},hpfpcombine{hpfproundneneneep)

将浮点数提取到其组件中会为每个浮点数产生三个部分:浮点符号、浮点指数和浮点尾数,其中每个组件都是定点数。通过提取浮点数分量,用户可以执行定点运算(如平方根和除法),然后将这些分量组合到一个浮点数中。

浮点机制(FLP)支持IEEE-754标准中描述的以下舍入模式:

  • 向偶数舍入:返回最接近无限精度结果的浮点数。

如果两个最近的浮点数相等地接近无限精度的结果,则返回LSB为偶数的结果。

  • 舍入远离:返回最接近无限精确结果的浮点数。

如果两个最近的浮点数相等地接近无限精确的结果,则返回幅度较大的结果。

  • 舍入到零:返回最接近无限精确结果的浮点数,其大小不大于该结果。
  • 向正舍入:返回最接近无限精度结果的浮点数,并且不小于无限精度结果。
  • 舍入为负:返回最接近无限精度结果的浮点数,并且不大于无限精度结果。

缩放浮点操作的舍入模式用法由FLPRND(法兰)SFPSR寄存器中的字段。注意:仅当使用适当的硬件配置时,才支持浮点指令。

​​​​​​​5.3.7 复数支持

CEVA-BX2支持以下复数格式:

  • 16位复数(16位实数+16位虚数)
  • 32位复数(32位实数+32位虚数)
  • 64位复数(64位实数+64位虚数)

注:该类型仅限于较短复杂类型的MAC操作的累加器。

用于处理这些格式的Vec-C约定是两元素向量,每个元素的底层数字类型(实数或虚数)是有符号整数。算术运算支持用于其他定点算术的机制,操作包括饱和度、舍入、左移位(用于Q15或Q31定点约定)和右移位(用于缩放)。

复杂类型由专用指令支持,专用指令期望数字在寄存器中以特定的方式组织,如和中所示。实施例5-3实施例5-4 16位复数组织在一个寄存器中,其中实数部分占用低16位,虚数部分占用高16位,如中所示。实施例5-3

实施例5-3.寄存器中16位复数的组织

在汇编语法中,使用类型.s2将复杂的16位数字指定为两元素16位向量。操作数的复数解释由相应的指令完成。例如,中的abs(绝对值)是正常的SIMD操作。然而,复杂的乘法运算解释实部和虚部,如和中所示。实施例5-3实施例5-3实施例5-4

32位复数组织在寄存器对中,其中实数部分在第一个指定的操作数中(对中的最左侧),虚数部分在对中的第二个操作数中,如中所示。实施例5-4

实施例5-4.寄存器对中32位复数的组织

在汇编语法中,使用.i1类型表示每个元素,将复杂的32位数字指定为两个元素的32位向量。操作数的复数解释由相应的指令完成。例如,中的abs是正常的SIMD操作。然而,复杂的乘法运算解释前面指定的实部和虚部。实施例5-4

64位复数作为较短复杂类型的乘法累加操作的累加器对的使用有限。因此,它不是由特定的语法标识的。每个累加器都被指定为两个寄存器(rA0.ll、rA1.lh)的常规长长类型操作数

5.3.7.1 ​​​​​​​​​​​​​​16位复杂算法支持

SPU使用四个16x16位乘法器,使其能够在单个周期内执行16位复数乘法,包括后置移位、舍入、累加和饱和的辅助功能。可以(根据相关性)将操作的目标选择为以下之一:

  • 四舍五入和饱和后缩回到16位复数
  • 32位复数(通常在乘法之后)
  • 64位复数(作为乘法累加操作后的累加器对)

以下算术运算支持16位复数。适用时,饱和、乘法后移位和舍入适用。每个指令在一个周期内执行:

  • 绝对值
  • 绝对平方值,到16位、32位和64位复数
  • 加法、减法(正则和共轭)
  • 共轭的
  • 乘法(常规和共轭),到16位和32位复杂目标
  • 将累加器(常规累加器和共轭累加器)乘以32位和64位复数累加器
  • 将复数与实数、16位和32位复数目标相乘
  • 将复数与实数相乘累加到32位复数目标
  • 向左和向右移动
  • 计算指数
​​​​​​​5.3.7.2 32位复杂算法支持

SPU具有两个32x32位乘法器,使其能够在两条指令中执行32位复数乘法,包括后置移位、舍入、累加和饱和的辅助功能。可以(根据相关性)将操作的目标选择为以下之一:

  • 四舍五入和饱和后缩回到32位复数
  • 64位复数,作为乘法累加操作后的累加器对

32位复数支持以下算术运算。适用时,饱和(到32位)、乘法后移位和舍入适用。除非另有规定,否则每个操作都由一条指令执行:

  • 绝对值
  • 绝对平方值(在两个指令中)
  • 加法、减法(正则和共轭)
  • 共轭的
  • 乘法(四条指令中的正则和带共轭)到32位和64位目标
  • 将累加器(正则和带共轭,在四条指令中)乘以32位和64位复合累加器
  • 将复数与实数相乘(在两条指令中),到32位和64位复数目标
  • 将复数与实数乘法累加(在两条指令中)到64位复数目标
  • 向左和向右移动(按两个指令)
  • 计算指数(在两个指令中)

5.4 SPU算术标志

一些SPU指令更新隐式算术状态,并将其保存在SASR标志中,如以下部分所述:

  • 5.4.1 进位标志
  • 5.4.2 溢出标志
  • 5.4.3 限制标志
  • 5.4.4 除零标志

进位、溢出和限制标志有两种变体:更新标志和粘性标志。每当执行影响更新标志的SPU指令时,更新标志都可以更改其状态。检测到第一个条件后,粘性标志保持设置,并且只能通过软件的显式写入来清除。列出了这些标志。表5-4

表5-4. SPU进位、溢出和限制标记

事件类型

正在更新标志

粘滞的标志

Carry

SCARRY

SCF

Overflow

SOVFL

SOF

Limit

SLIMIT

SLF

例如,在两条加法指令的序列中,一条产生进位条件,另一条不产生进位情况,第一条指令将同时设置SCARRY和SCF标志,第二条指令将在不更改SCF标志的情况下清除SCARRY标志。

当可以更新标志的两条指令同时执行时,例如在SPU0和SPU1中,或在SIMD操作中,如果条件发生在任何指令或SIMD操作上,则将设置相应的标志。

如果预测了可能影响标志的SPU指令,则标志不会受到影响。如果SIMD谓词仅基于一个SIMD操作,则该标志将根据另一SIMD操作进行更新。如果两个SIMD谓词都处于活动状态,算术标志将不受此指令的影响;然而,如果相关,它可能会受到并行执行的其他SPU指令的影响。

​​​​​​​5.4.1 进位标志

进位标志可以断言为加法、减法或移位操作:

  • 在加法运算中,如果两个数字的运算导致加法的最高有效(最左边)位的进位,则设置进位标志。
  • 减法运算被视为具有负数的加法运算,进位标志的计算方法与加法运算相同。
  • 在移位指令中,进位标志反映右移位或左移位中移出的最后一个位。

进位标志不受使用饱和开关的指令的影响。

​​​​​​​5.4.2 溢出标志

溢出标志可以由涉及各种类型的加法、减法、乘法和移位操作的指令设置:

  • 此外,减法和求反运算,如果结果不能由目标表示,则会设置溢出标志,无论是由于操作还是由于将结果强制转换为输出类型。
  • 在移位操作中,如果由于将结果强制转换为输出类型或将非零值移到源操作数的界限之外而导致结果不能由目标表示,则设置溢出标志。
  • 在乘法运算中,如果由于操作或由于将结果强制转换为输出类型而导致结果不能由目标表示,则设置溢出标志。

对于使用加法或减法执行的乘法(如mac、mad等),不会计算溢出。溢出标志不受使用自动饱和开关的指令的影响。

​​​​​​​5.4.3 限制标志

Limit标志可以由涉及各种类型的加法、减法、乘法和移位操作的指令断言。

限制标志检测用饱和值替换结果,并在以下自动饱和情况之一发生时设置:

  • 结果饱和:由于饱和,结果数被替换为最大或最小可能数。
  • 乘积饱和:特定于乘法指令。

有关饱和度的更多详细信息,请参见第5.3.5节,结果饱和度和第5.3.6节,产品饱和度。不使用饱和开关的指令不会更新限制标志。唯一的例外是bmac和bmac_first指令,它们在没有显式饱和开关的情况下固有地饱和结果。

​​​​​​​5.4.4 除以0标志

当除数为0时,在执行分步指令时设置“被0除”标志。该标志不是粘性标志,通常作为中断连接到ICU。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker部署docker管理工具easydockerweb

重要提示 功能比较少,建议体验一下即可 安装 docker run -it -d -p 10041:3000 -e EDW_USERNAMEadmin -e EDW_PASSWORDadmin -v /var/run/docker.sock:/var/run/docker.sock qfdk/easydockerweb 使用 概览 镜像管理 容器管理

Python命令行工具库之argcomplete使用详解

概要 命令行工具是开发者和系统管理员的得力助手&#xff0c;但随着命令行选项的增多&#xff0c;用户可能会感到困惑。Python 中的 argcomplete 库可以帮助轻松地为命令行工具添加自动补全功能&#xff0c;提高用户体验。本文将介绍如何使用 Python argcomplete 库实现命令行…

[嵌入式AI从0开始到入土]13_orangepi aipro开箱测评

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注&#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间&#xff0c;后期会考虑出视频教程&#xff0c;务必催更&#xff0c;以防我变身鸽王。 第1期 昇腾Altas 200 DK上手 第2期 下载昇腾案例并运行 第3期 官…

好看的安全跳转单页html源码

好看的安全跳转单页html源码,效果如下 代码如下&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <!--[if IE 8]><style>.ie8 .alert-circle,.ie8 .alert-footer{display:none}.ie8 .alert-box{padding-top:…

基于Vue2用keydown、keyup事件实现长按键盘任意键(或组合键)3秒触发自定义事件(以F1键为例)

核心代码 <template></template> <script> export default {created() {//监听长按快捷键addEventListener("keydown", this.keydown);addEventListener("keyup", this.keyup);},destroyed(d) {//移除长按快捷键removeEventListener(&…

一文get国自然热点“组蛋白乳酸化”的研究方向和思路

作为近些年的国自然热点&#xff0c;“组蛋白修饰”不仅是细胞记忆的守护者&#xff0c;也是生命过程调控的重要的参与者。组蛋白是构成染色质的基本蛋白质单位&#xff0c;它们能够通过各种化学修饰如乙酰化、甲基化、磷酸化和乳酸化等&#xff0c;精确调控基因的表达&#xf…

【翻译】Processing安卓模式的安装使用及打包发布(内含中文版截图)

原文链接在下面的每一章的最前面。 原文有三篇&#xff0c;译者不知道贴哪篇了&#xff0c;这篇干脆标了原创。。 译者声明&#xff1a;本文原文来自于GNU协议支持下的项目&#xff0c;具备开源二改授权&#xff0c;可翻译后公开。 文章目录 Install&#xff08;安装&#xff0…

通过docker-compose部署NGINX服务,并使该服务开机自启

要在通过docker-compose部署的NGINX服务实现开机自启&#xff0c;你需要确保Docker守护进程在系统启动时自动运行&#xff0c;并配置docker-compose.yml文件以在容器中运行NGINX服务。以下是步骤&#xff1a; 确保Docker守护进程开机启动&#xff1a; 在Ubuntu/Debian上&#x…

DuiLib示例代码研究1

DuiLib有一个示例,名为360Safe,跑起来如下,纯界面的; 下面大体看一下代码; 首先它是从CWindowWnd和INotifyUI继承了一个类C360SafeFrameWnd出来,CWindowWnd和INotifyUI这两是DuiLib的类; 初始化的时候看上去是创建了窗口右上角的四个按钮; 如果注释了这四句代码,…

在 MacOS 上虚拟化 x86Linux 的最佳方法(通过 Rosetta)

categories: [VM] tags: MacOS VM 写在前面 买了 ARM 的 mac, 就注定了要折腾一下虚拟机了… 之前写过一篇文章是通过 utm 虚拟化archlinux, 其实本质上还是调用了 qemu-system-x86_64, 所以速度并不快, 后来想着能不能借用 Rosetta 的优势即原生转译, 来虚拟化 Intel 的 Linu…

“极简壁纸“爬虫JS逆向·实战

文章目录 声明目标分析确定目标目标检索 代码补全完整代码 爬虫逻辑完整代码 运行结果 声明 本教程只用于交流学习&#xff0c;不可用于商业用途&#xff0c;不可对目标网站进行破坏性请求&#xff0c;请遵守相关法律法规。 目标分析 确定目标 获取图片下载链接 目标检索…

Vite+Vue3项目配置启动项目后自动打开浏览器

有时候&#xff0c;我们在启动前端项目时&#xff0c;输入了启动命令&#xff0c;但却需要我们手动点开控制台输出的URL链接 如果每次都要点这个连接&#xff0c;会十分繁琐 为了提高开发效率&#xff0c;减少不必要的操作&#xff0c;我们就来解决这个问题。 1.在文件资源管…

Linux进程信号(3)--信号的处理

目录 前置知识 捕捉信号 内核如何实现信号的捕捉 sigaction 信号的其他补充问题 可重入函数 volatile关键字 SIGCHILD信号 前置知识 什么是用户态&#xff0c;内核态呢&#xff1f; 这里我们再来看看进程的地址空间&#xff1a; 我们知道每一个进程都会有自己的地址空…

大数据Zookeeper--案例

文章目录 服务器动态上下线监听案例需求需求分析具体实现测试 Zookeeper分布式锁案例原生Zookeeper实现分布式锁Curator框架实现分布式锁 Zookeeper面试重点选举机制生产集群安装多少zk合适zk常用命令 服务器动态上下线监听案例 需求 某分布式系统中&#xff0c;主节点可以有…

unity 增加系统时间显示、FPS帧率、ms延迟

代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;using UnityEngine;public class Frame : MonoBehaviour {// 记录帧数private int _frame;// 上一次计算帧率的时间private float _lastTime;// 平…

Docker 一小时从入门到实战 —— Docker commands | Create your own image | vs VM ... 基本概念扫盲

Docker crash course 文章目录 Docker crash course1. What and Why of Docker?2.1 What2.2 What problem does it solve?2.2.1 before containers2.1.2 with containers 2. Docker vs Virtual Machines2.1 Difference2.2 Benefits 3. Install docker locally4. Images vs Co…

微信小程序(三十四)搜索框-带历史记录

注释很详细&#xff0c;直接上代码 新增内容&#xff1a; 1.搜索框基本模板 2.历史记录基本模板 3.细节处理 源码&#xff1a; index.wxml <!-- 1.点击搜索按钮a.非空判断b.历史记录&#xff08;去重&#xff09;c.清空搜索框d.去除前后多余空格2.删除搜索 3.无搜索记录不…

springboot158基于springboot的医院资源管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

HTTP相关问题

目录 1.从输入URL到页面展示到底发生了什么&#xff1f; 2.HTTP状态码有哪些&#xff1f; 2.1 2XX(成功状态码) 2.2 3XX(重定向状态码) 2.3 4XX(客户端错误状态码) 2.4 5XX(服务端错误状态码) 3.HTTP 请求头中常见的字段有哪些&#xff1f; 4.HTTP和HTTPS有什么区别&…

[C++] 如何使用Visual Studio 2022 + QT6创建桌面应用

安装Visual Studio 2022和C环境 [Visual Studio] 基础教程 - Window10下如何安装VS 2022社区版_visual studio 2022 社区版-CSDN博客 安装QT6开源版 下载开源版本QT Try Qt | 开发应用程序和嵌入式系统 | Qt Open Source Development | Open Source License | Qt 下载完成&…