立即注册
查看: 2634|回复: 3

[龙芯原创] 龙芯3A4000/3B4000处理器向量指令软件开发手册

已绑定手机
发表于 2020-7-1 11:24:23 | 显示全部楼层 |阅读模式 来自 广东省深圳市
1 向量指令功能介绍
龙芯 3A4000/3B4000 处理器中实现了单指令多数据流(Single Instruction Multiple Data,简称 SIMD)功能的指令,亦称之为向量指令。龙芯 3A4000/3B4000 处理器中所实现的向量指令集在功能上兼容 MIPS 指令集的 SIMD 扩展指令集(简称 MSA)。因此,本手册中将只对向量指令的功能做概要介绍,详细的指令功能定义请参阅 MIPS 公司发布的文档《MIPS® Architecture for Programmers IV-j: The MIPS64® SIMD Architecture Module》(Document Number: MD00868, Revision 1.12)。

1.1 向量指令功能概述
龙芯 3A4000/3B4000 处理器所实现的向量指令集包含数百条指令,功能涉及运算、转移和访存。整个向量指令集仍然采用 RISC 指令集的设计理念,因此只有向量访存指令才会将内存作为操作数,其余所有向量指令的操作数都来自于寄存器。除部分向量指令还会操作通用寄存器(GR)外,向量指令的操作数主要存放在向量寄存器中。

1.1.1 向量寄存器
向量寄存器有 32 个。汇编编程时记作$w0 ~ $w31。
向量寄存器的数据位宽为 128 位。从软件的视角来看,每个向量寄存器中存放的数据是一个 128 位的位向量,第 0 位位于向量寄存器最右边,第 127 位位于向量寄存器的最左边。
向量指令操作向量寄存器时,总是以 128 位为一个基本寻址单位。也就是说,不存在将每个 128 位的高、低 64 位,或是 4 个 32 位分开来独立寻址的情况。
每个向量寄存器的低半部分与同号的浮点寄存器是重合的。也就是说,当执行某条浮点指令更新了浮点寄存器 fn(n=0..31),那么$wn 的[63:0]位被更新为相同值,但是请注意,此时$wn 的[127:64]的值是不确定的。
使用向量指令时,浮点寄存器必须呈现为 32 个 64 位宽的状态,即 CP0.Status.FR=1。这也意味着在 o32 ABI 下是无法使用向量指令的。我们推荐编程人员使用 n64 ABI。
龙芯 3A4000/3B4000 处理器的向量指令集不实现向量寄存器分块(Vector Registers Partitioning)机制,即 MSAIR.WRP=0。

1.1.2 向量数据类型
向量指令所操作的向量的元素以位宽作为划分依据,分为:比特、字节(8 比特)、半字(16 比特)、字(32 比特)、双字(64 比特)。各类元素构成的向量存放在向量寄存器中时,都是从向量寄存器的低位向高位依次摆放。

如果指令是将数据作为整数(integer)进行操作的,那么又可进一步细分为:有符号字节(对应 C 语言中的 char)、无符号字节(对应 C 语言中的 unsigned char)、有符号半字(对应 C 语言中的 short)、无符号半字(对应 C 语言中的 unsigned short)、有符号字(对应 C 语言中的 int)、无符号字(对应 C 语言中的 unsigned int)、有符号双字(对应 C 语言中的 long long)、无符号双字(对应 C 语言中的 unsigned long long)。
如果指令是将数据作为定点数(fixed-point)进行操作的,那么包括:Q15 和 Q31 两种格式的定点数。有关 Q15 和 Q31 定点数的具体定义请见本文档附录 A 定点数格式定义。
如果指令是将数据作为浮点数(floating-point)进行操作的,那么包括:半精度浮点数、单精度浮点数和双精度浮点数。其中半精度浮点数仅在浮点类型转换指令中使用,没有直接对半精度浮点数进行加、减、乘等运算的指令。

1.1.3 向量浮点运算
龙芯 3A4000/3B4000 处理器中的向量浮点运算都遵循 IEEE 754TM-2008 标准。
龙芯 3A4000/3B4000 处理器中的向量浮点运算支持非规格化数(Subnormal)的处理,即向量浮点运算的源操作数或目的操作数出现非规格化数的时候,由硬件直接处理,不会触发标志为 E(Unimplemented Operation)的向量浮点例外。
龙芯 3A4000/3B4000 处理器中的向量浮点运算不支持 Flush to Zero 机制。即无论 MSACSR.FS 置为何值,硬件都按照 MSACSR.FS=0 的定义来处理。

1.1.4 向量访存
尾端
所有龙芯处理器均只支持小尾端寻址模式。因此一个向量操作数存放在内存中时,其中的各个元素是从内存地址的低位向内存地址的高位依次摆放。
地址对齐
龙芯 3A4000/3B4000 中的向量访存指令的没有地址对齐的要求,即向量访存指令执行时不会仅因为地址最低 4 位不为全 0 而触发地址错例外。不过,当向量访存指令的地址对齐时,其执行性能会优于地址不对齐的情况。
需要注意的是,当一条地址不对齐的向量访存指令的访问跨越了页(或者段)的边界,而所跨两侧的 Cache 属性或是访问权限不同时,将触发地址错例外(ADEL、ADES)。
原子性
对于单个线程来说,在绝大多数情况下,无论地址是否对齐,单条向量访存指令的访存总是原子的。其原子性的一个典型效果是,例外(含中断)事件要么在一个向量访存指令产生完整的执行效果之前发生,要么在其产生完整的执行效果之后发生,不会出现向量访存指令已经且只完成了部分执行效果的时候发生例外事件。单线程原子性另一个典型效果是,一个向量访存指令的访存动作只可能全部完成在一个栅障(barrier)之前或之后,不会出现一个地址不对齐的向量访存指令的不同部分的访存动作分布在一个栅障的前后两侧。
之所以说向量访存指令对于单个线程的原子性是“绝大多数情况”而不是“所有情况”,是因为存在一些极为少见的情况会破坏这种原子性。譬如,一个跨 Cache 行的向量 store 指令在访问第二个 Cache 行的时候发生了 ECC 校验错例外。
在多线程多核执行场景下,除非向量访存指令的地址是对齐的,否则不保证该指令的访存操作被同一个共享一致域上的所有观察者(observer)观察为原子的。不过,由于龙芯 3A4000/3B4000 处理器实现的是弱一致性访存模型,同时向量访存指令不会用来构建栅障,所以一个正确的程序自然会通过插入栅障来确保地址不对齐的向量访存指令的访存操作被所有观察者观察为原子的。


文件下载,请回复
游客,如果您要查看本帖隐藏内容请回复



  • 一牛网商城 一牛网直播
已绑定手机
发表于 2020-10-19 16:47:03 | 显示全部楼层 来自 广东省深圳市
国产百兆,千兆以太网PHY芯片——裕太微代理,联系拿样品测试    梅先生
已绑定手机
发表于 2021-4-19 16:21:47 | 显示全部楼层 来自 广东省深圳市
下载学习,感谢分享
发表于 2021-8-1 14:14:01 | 显示全部楼层 来自 广东省深圳市
UUUUUUUUUUUUUU
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

合作/建议

TEL: 19168984579

工作时间:
周一到周五 9:00-11:30 13:30-19:30
  • 扫一扫关注公众号
  • 扫一扫打开小程序
Copyright © 2013-2024 一牛网 版权所有 All Rights Reserved. 帮助中心|隐私声明|联系我们|手机版|粤ICP备13053961号|营业执照|EDI证
在本版发帖搜索
微信客服扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表