[处理器芯片]-6 超标量CPU实现之浮点运算

1 浮点运算单元FPU

超标量CPU中的浮点运算单元是专门处理浮点数运算的关键组件。浮点运算单元的设计涉及多个复杂的子模块和技术,以保证高效、准确地执行浮点数的加减法、乘法、除法、平方根等操作。

1)浮点数术语

浮点数通常采用IEEE 754标准表示,包括三部分:符号位、指数位和尾数位。

半精度浮点数:16位,FP16,包括1位符号位,5位指数位,10位尾数位。

单精度浮点数:32位,FP32,包括1位符号位,8位指数位,23位尾数位。

双精度浮点数:64位,FP64,包括1位符号位,11位指数位,52位尾数位。

FP8 是一种新的浮点数格式,主要用于机器学习加速器和一些低精度计算场景,两种变种:

E4M3(Exponent 4 bits, Mantissa 3 bits):包括1位符号位,4位指数位,3位尾数位。

E5M2(Exponent 5 bits, Mantissa 2 bits):包括1位符号位,5位指数位,2位尾数位。

BF16 (16位浮点数,Brain Floating Point, BP16),是一种为机器学习优化的16位浮点数格式,保留了单精度浮点数的指数范围,但减少了尾数的位数:包括1位符号位,8位指数位,7位尾数位。BF16 具有与单精度浮点数(FP32)相同的指数范围,因此可以表示同样大的数值范围,但精度较低,这使得 BF16 特别适合于训练深度神经网络,因为它可以减少内存带宽和存储需求,同时保持足够的数值范围。

2)浮点运算单元组成

加法器和减法器,乘法器,除法器,平方根计算单元,归约和规范化单元,异常处理单元

3)浮点加法和减法单元

浮点加减法需要处理对齐、加减运算和归约等步骤:

1)对齐:比较指数(对齐操作数,使其指数相同)、移位尾数(根据指数差调整尾数)。

2)加法/减法:计算尾数(执行加法或减法运算)

3)规范化结果:归约结果(规范化结果,使最高有效位位于合适位置)、舍入结果(根据IEEE 754标准,对结果进行舍入操作:向偶数舍入、向零舍入、向正无穷舍入、向负无穷舍入)。

逻辑实现

module FPAdder (

    input [31:0] a, b,  // 两个单精度浮点数

    output [31:0] result

);

    // 提取符号位、指数位和尾数位

    wire sign_a = a[31];

    wire [7:0] exp_a = a[30:23];

    wire [23:0] frac_a = {1'b1, a[22:0]};

    

    wire sign_b = b[31];

    wire [7:0] exp_b = b[30:23];

    wire [23:0] frac_b = {1'b1, b[22:0]};

    

    // 对齐指数和尾数

    wire [7:0] exp_diff = exp_a - exp_b;

    wire [23:0] aligned_frac_b = frac_b >> exp_diff;

    

    // 执行加法

    wire [24:0] frac_sum = frac_a + aligned_frac_b;

    

    // 规范化结果

    wire [7:0] result_exp = exp_a + 1;

    wire [23:0] result_frac = frac_sum[24] ? frac_sum[23:0] : frac_sum[22:0];

    

    assign result = {sign_a, result_exp, result_frac[22:0]};

endmodule

4)浮点乘法单元

浮点乘法包括指数相加和尾数相乘两个主要步骤:

1)指数相加:结果指数是两个操作数指数之和,减去一个偏置值。

2)尾数相乘:乘法操作需要高效的部分积生成和压缩机制。

3)规范化结果。

逻辑实现

module FPMultiplier (

    input [31:0] a, b,  // 两个单精度浮点数

    output [31:0] result

);

    // 提取符号位、指数位和尾数位

    wire sign_a = a[31];

    wire [7:0] exp_a = a[30:23];

    wire [23:0] frac_a = {1'b1, a[22:0]};

    

    wire sign_b = b[31];

    wire [7:0] exp_b = b[30:23];

    wire [23:0] frac_b = {1'b1, b[22:0]};

    

    // 计算符号

    wire result_sign = sign_a ^ sign_b;

    

    // 计算指数

    wire [8:0] result_exp = exp_a + exp_b - 8'd127;

    

    // 尾数相乘

    wire [47:0] frac_mult = frac_a * frac_b;

    

    // 规范化结果

    wire [23:0] result_frac = frac_mult[47] ? frac_mult[46:24] : frac_mult[45:23];

    wire [7:0] final_exp = frac_mult[47] ? result_exp + 1 : result_exp;

    

    assign result = {result_sign, final_exp[7:0], result_frac[22:0]};

endmodule

5)浮点除法和平方根单元

浮点除法和平方根计算通常比加减法和乘法更复杂,可以采用多种算法实现,如牛顿-拉弗森法、非恢复性除法等。

浮点除法主要步骤如下:

符号计算:结果的符号是被除数和除数符号的异或。

指数相减:结果的指数是被除数指数减去除数指数再加上偏置值。

尾数除法:计算尾数的商。

规范化结果。

逻辑实现

module FPDivider(

    input [31:0] a, b,  // 两个单精度浮点数

    output [31:0] result

);

    // 提取符号位、指数位和尾数位

    wire sign_a = a[31];

    wire [7:0] exp_a = a[30:23];

    wire [23:0] frac_a = {1'b1, a[22:0]};  // 隐含1

    wire sign_b = b[31];

    wire [7:0] exp_b = b[30:23];

    wire [23:0] frac_b = {1'b1, b[22:0]};  // 隐含1

    // 计算符号

    wire result_sign = sign_a ^ sign_b;

    // 计算指数

    wire [8:0] result_exp = exp_a - exp_b + 8'd127;

    // 尾数相除

    wire [47:0] frac_div = (frac_a << 23) / frac_b;

    // 规范化结果

    wire [23:0] result_frac = frac_div[46] ? frac_div[46:24] : frac_div[45:23];

    wire [7:0] final_exp = frac_div[46] ? result_exp + 1 : result_exp;

    assign result = {result_sign, final_exp[7:0], result_frac[22:0]};

Endmodule

浮点开方主要步骤如下:

符号计算:平方根运算结果的符号为正。

指数计算:结果的指数是操作数指数的一半再加上偏置值。

尾数计算:计算尾数的平方根。

规范化结果。

逻辑实现

module FPSqrt(

    input [31:0] a,

    output [31:0] result

);

    wire [7:0] exp_a;

    wire [23:0] frac_a;

    wire [7:0] result_exp;

    wire [23:0] frac_result;

    wire [23:0] norm_frac_result;

    wire [7:0] norm_exp_result;

    

    // 各个阶段模块化实现

    FPSqrt_Preprocess preprocess (.a(a), .exp_a(exp_a), .frac_a(frac_a));

    FPSqrt_Exponent exponent (.exp_a(exp_a), .result_exp(result_exp));

    FPSqrt_Mantissa mantissa (.frac_a(frac_a), .frac_result(frac_result));

    FPSqrt_Normalize normalize (.frac_result(frac_result), .result_exp(result_exp),

                                .norm_frac_result(norm_frac_result), .norm_exp_result(norm_exp_result));

    FPSqrt_Round round (.norm_frac_result(norm_frac_result), .norm_exp_result(norm_exp_result),

                        .final_result(result));

endmodule

6)归约和规范化单元

归约和规范化用于确保结果符合标准的浮点数格式,包括对结果的尾数进行移位处理,以使结果尾数的最高有效位为1,并调整指数值。

7)异常处理单元

异常处理包括对各种浮点运算异常的检测和处理,例如:

溢出:结果超出可表示的范围。

下溢:结果小于可表示的最小值。

除零:除法操作中分母为零。

无效操作:如0/0或sqrt(-1)。

2 单指令多数据SIMD

SIMD(Single Instruction, Multiple Data)是一种并行计算架构,通过扩展处理器的指令集来操作多个数据元素,这些数据元素通常被存储在一个大的寄存器中,例如处理器可以使用一条指令同时对四个 32 位浮点数或八个 16 位整数进行运算。SIMD设计在现代超标量CPU中被广泛应用,特别是在多媒体处理、科学计算和其他需要处理大量数据的应用中。

1)常见的 SIMD 指令集

Intel MMX、SSE、AVX 和 AVX-512

ARM NEON

IBM AltiVec

AMD 3DNow!

2)SIMD 寄存器

SIMD 指令通常使用宽寄存器来存储多个数据元素。

MMX 寄存器:64 位宽,通常处理 8 个 8 位数据或 4 个 16 位数据。

SSE 寄存器:128 位宽,通常处理 4 个 32 位浮点数或 16 个 8 位整数。

AVX 寄存器:256 位宽,通常处理 8 个 32 位浮点数或 32 个 8 位整数。

AVX-512 寄存器:512 位宽,处理的数据量更大。

3)SIMD操作数

SIMD 指令的操作数通常表示为向量类型的数据。例如在 Intel 的 AVX 指令集中,ymm 寄存器表示 256 位寄存器,其中可以存储 8 个 32 位浮点数。

4)SIMD 指令操作

算术运算:加法、减法、乘法、除法等

逻辑运算:与、或、非、异或等

移位运算:左移、右移、算术右移等

比较运算:大于、小于、等于等

数据搬移:加载、存储、混合、打包和解包数据

5)SIMD执行步骤

指令获取和解码:处理器从内存中获取 SIMD 指令,并将其解码为内部操作码和操作数。

数据加载:将操作数从内存加载到 SIMD 寄存器中。

并行计算:在多个数据元素上并行执行指令。

结果存储:将计算结果从 SIMD 寄存器存储回内存或其他寄存器中。

SIMD 加法器示例(并行处理四个 32 位整数)

module SIMDAdder (

    input [127:0] A, // 四个 32 位整数输入 A

    input [127:0] B, // 四个 32 位整数输入 B

    output [127:0] Sum // 四个 32 位整数输出 Sum

);

    assign Sum[31:0]   = A[31:0]   + B[31:0];   // 第一个整数加法

    assign Sum[63:32]  = A[63:32]  + B[63:32];  // 第二个整数加法

    assign Sum[95:64]  = A[95:64]  + B[95:64];  // 第三个整数加法

    assign Sum[127:96] = A[127:96] + B[127:96]; // 第四个整数加法

endmodule

6)SIMD 优化技术

数据对齐:确保数据在内存中的对齐,以便于 SIMD 加载和存储操作。

数据预取:提前加载数据以减少等待时间,提高指令执行效率。

向量化:将标量代码转换为向量代码,使其能够利用 SIMD 指令集。

循环展开:减少循环控制开销,通过展开循环体使更多操作在同一条指令中执行。

指令调度:优化指令顺序,以最大限度地减少依赖关系和等待时间。

7)SIMD 的应用

多媒体处理:图像处理、音频处理、视频编码和解码。

科学计算:矩阵运算、向量运算、快速傅里叶变换(FFT)。

数据分析:大数据处理、机器学习、神经网络。

加密和解密:数据加密标准(AES)、安全哈希算法(SHA)。

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

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

相关文章

显示IPS技术

显示器的IPS&#xff08;In-Plane Switching&#xff0c;平面转换&#xff09;技术是一种先进的液晶面板技术&#xff0c;由日立公司在2001年推出。该技术优化了液晶分子的排列方式&#xff0c;采取水平排列&#xff0c;使得分子结构在遇到外界压力时仍能保持稳定&#xff0c;不…

第 33 次CCF认证

1. 词频统计 题目描述 样例输入 代码 #include <bits/stdc.h>using namespace std;int main() {int n,m;cin>>n>>m;vector<int> ans1(m,0),ans2(m,0);while (n --) {int t;cin>>t;vector<int> vis(m1,0);for (int i 1;i < t;i ) {i…

python去除html中<div>等

用beautifulsoup并不能将全部的去除得到剩余的txt&#xff0c;特别在兴趣段找关键字的时候。 使用re模块可以实现这个功能。 for a in a_d:em_name str(a.find(em))pattern re.compile(r<[^>]>, re.S)result pattern.sub(, em_name)result result.strip(\n)name_…

Spring Boot 中的HTTP请求方式详解:优缺点与代码示例

在Spring Boot中&#xff0c;有多种方式可以发起HTTP请求。主要的工具包括RestTemplate、WebClient和增强的AsyncRestTemplate。本文将详细介绍每种请求方式及其优缺点&#xff0c;并给出代码示例。 1. RestTemplate RestTemplate 是 Spring 提供的一个用于同步 HTTP 请求的客…

vxe-table v4 ~ v4.6 升级到 v4.7+ 版本

vxe-table v4 ~ v4.6 升级到 v4.7 版本 更新日志 vxe-table 4.7 分离了 vxe-table 表格和 vxe-pc-ui 组件库 变动如下 全局安装 // ... import VxeUITable from vxe-table import vxe-table/lib/style.css // ...createApp(App).use(VxeUITable).mount(#app)修改后 // ...i…

数据结构(五)

数据结构&#xff08;五&#xff09; 常见的排序算法内部排序交换插入选择归并基数 外部排序基于归并的 常见的排序算法 内部排序 交换 冒泡&#xff1a;每一次运行总会将最小的或者最大的放到前面&#xff0c;如果需要交换&#xff0c;一直在交换 快速排序*&#xff1a;经过…

【java程序设计期末复习】chapter5 子类的继承

子类的继承 继承是一种由已有的类创建新类的机制。利用继承&#xff0c;我们可以先创建一个共有属性的一般类&#xff0c;根据该一般类再创建具有特殊属性的新类&#xff0c;新类继承一般类的状态和行为&#xff0c;并根据需要增加它自己的新的状态和行为。由继承而得到的类称…

Git分支的操作详解(查看、新增、切换、合并、删除)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

2024最新前端面试八股文【基础篇293题】

⼀、HTML、HTTP、web综合问题 1 前端需要注意哪些SEO 2 <img> 的 title 和 alt 有什么区别 3 HTTP的⼏种请求⽅法⽤途 4 从浏览器地址栏输⼊url到显示⻚⾯的步骤 5 如何进⾏⽹站性能优化 6 HTTP状态码及其含义 7 语义化的理解 8 介绍⼀下你对浏览器内核的理解 9 …

【操作系统】发展与分类(手工操作、批处理、分时操作、实时操作)

2.操作系统发展与分类 思维导图 手工操作阶段&#xff08;此阶段无操作系统&#xff09; 需要人工干预 缺点&#xff1a; 1.用户独占全机&#xff0c;资源利用率低&#xff1b; 2.CPU等待手工操作&#xff0c;CPU利用不充分。 批处理阶段&#xff08;操作系统开始出现&#x…

链表-线性表的链式表示

链表-线性表的链式表示 #mermaid-svg-ozpXrKnNCyYdqHvN {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ozpXrKnNCyYdqHvN .error-icon{fill:#552222;}#mermaid-svg-ozpXrKnNCyYdqHvN .error-text{fill:#552222;stro…

express 设定路径别名

在使用ts情况下 pnpm i -D tsconfig-paths配置tsconfig.json {// 引入 tsconfig-paths/register// 注意 ts-node 的层级与 compilerOptions 相同"ts-node": {"require": ["tsconfig-paths/register"]},"compilerOptions": {// ...//…

width: auto 和 width: 100% 的区别

width: auto Vs. width: 100% 关于 width 属性 CSS 中的 width 属性用于设置元素的宽度。默认情况下&#xff0c;width 设置的是内容区&#xff08;content area&#xff09;的宽度。如果元素有样式 box-sizing: border-box&#xff0c;则 width 设置的是边框区&#xff08;bo…

正运动控制器:视觉纠偏和找孔

一、用户主界面CCD参数设置 通过主界面CCD参数设置&#xff0c;学习如何操作计算相机中心与电批中心的偏移量&#xff0c;以及相机标定的功能。 1、相机中心与电批中心的偏移量计算 1.1、在用户主界面点击CCD参数按钮&#xff0c;进入CCD设置界面。 主界面 CCD参数设置界面 1…

制作电子画册速成攻略,快来试试

​当今社会&#xff0c;数字媒体日益普及&#xff0c;电子画册作为一种崭新的展示方式&#xff0c;受到了越来越多人的青睐。它不仅形式新颖&#xff0c;互动性强&#xff0c;而且制作起来也并不复杂。想知道如何快速掌握制作电子画册的技巧吗&#xff1f;我来教你吧。 接下来&…

二叉树的广义表反序列化

前言 个人小记 一、代码 #include<stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define MAX_NODE 10 #define MAX_LEN 100 #define key(n)(n)?(n->key):(-1) typedef struct Node {int key;struct Node* lchild,*rchil…

Leetcode 3159. Find Occurrences of an Element in an Array

Leetcode 3159. Find Occurrences of an Element in an Array 1. 解题思路2. 代码实现 题目链接&#xff1a;3159. Find Occurrences of an Element in an Array 1. 解题思路 这一题的话我们只需要首先统计一下array当中目标元素x出现在第几次的位置&#xff0c;构造一个has…

推荐13款常用的Vscode插件,提高前端日常开发效率

1. Live Server Live Server 插件是一个用于前端开发的扩展&#xff0c;它的主要作用是提供一个本地开发服务器&#xff0c;以便实时预览和调试网页应用程序。其最大特点在于热重载&#xff0c;即开发者可实时预览代码效果。 因为Live Server 允许开发者在浏览器中实时预览您正…

软件测试面试题(五)

一&#xff1a;如何选择用户测试的工作产品&#xff1f;、 答&#xff1a;在用户有需求得到签字确认以后&#xff0c;我们选择用户测试的工作产品。我们几乎所有的项目都进行了测试&#xff0c;我们是在项目立项公告中得知需要对工作产品进行测试。 二&#xff1a;测试环境描述…