当前位置: 首页 > news >正文

[处理器芯片]-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)。

相关文章:

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

1 浮点运算单元FPU 超标量CPU中的浮点运算单元是专门处理浮点数运算的关键组件。浮点运算单元的设计涉及多个复杂的子模块和技术&#xff0c;以保证高效、准确地执行浮点数的加减法、乘法、除法、平方根等操作。 1&#xff09;浮点数术语 浮点数通常采用IEEE 754标准表示&…...

又有人叫嚣:AI取代前端,来给你几张图,看能不能憋死AI。

总有自媒体人&#xff0c;为了些许流量&#xff0c;在大放厥词&#xff0c;说截个图给AI&#xff0c;AI就能输出前端代码&#xff0c;这是啥都敢说&#xff0c;吹牛不上税。 我来给你几张贝格前端工场日常接的大数据项目相关的图&#xff0c;你让AI生成代码&#xff0c;取代前…...

ISCC2024个人挑战赛WP-WEB

&#xff08;非官方解&#xff0c;以下内容均互联网收集的信息和个人思路&#xff0c;仅供学习参考&#xff09; 还没想好名字的塔防游戏 GET /world.js HTTP/1.1 Host: 101.200.138.180:17345 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,i…...

Android 使用 adb 列出设备上所有危险权限

步骤1&#xff1a;确定 Android SDK 位置 打开 Android Studio 的设置&#xff0c;并来到 Languages & Frameworks › Android SDK 处&#xff1a; 这里可以看到 Android SDK 目录的位置&#xff1a; 例如&#xff1a;/Users/admin/Library/Android/sdk。 复制这个路径&am…...

Spring AOP源码分析

#### AOP&#xff08;面向切面编程&#xff09;作用及其优势 作用&#xff1a;在程序运行期间&#xff0c;在不修改源码的情况下对方法进行功能增强&#xff08;通知&#xff09; 优势&#xff1a;减少重复代码&#xff0c;提高代码复用性&#xff0c;提高代码可维护性&#xf…...

[LLM]从GPT-4o原理到下一代人机交互技术

一 定义 GPT-4o作为OpenAI推出的一款多模态大型语言模型&#xff0c;代表了这一交互技术的重要发展方向。 GPT-4o是OpenAI推出的最新旗舰级人工智能模型&#xff0c;它是GPT系列的一个重要升级&#xff0c;其中的"o"代表"Omni"&#xff0c;中文意思是“全…...

【Spring】AOP——通知(Advice)

1、通知&#xff08;Advice&#xff09; 1.1简介 在AOP中&#xff0c;通知&#xff08;Advice&#xff09;是切面&#xff08;Aspect&#xff09;中的一部分&#xff0c;用于定义在连接点&#xff08;Joinpoint&#xff09;处应该执行的操作。通知类型可以在AOP框架中配置和使…...

python中的一些基础概念

在python中整型数据可以和浮点型数据相加&#xff0c;在python中字符串数据可以进行相加&#xff0c; 在python中整型数据可以和布尔类型进行算术运算。此时True当做1&#xff0c;False当做0但是这样的操作是没有意义的&#xff0c; python中只有字符串类型没有字符类型&…...

8.Redis之hash类型

1.hash类型的基本介绍 哈希表[之前学过的所有数据结构中,最最重要的] 1.日常开发中,出场频率非常高. 2.面试中,非常重要的考点, Redis 自身已经是键值对结构了Redis 自身的键值对就是通过 哈希 的方式来组织的 把 key 这一层组织完成之后, 到了 value 这一层~~ value 的其中…...

Edge浏览器

微软 Edge 是由微软开发的网络浏览器&#xff0c;它是 Windows 10 操作系统的默认浏览器&#xff0c;取代了之前的 Internet Explorer。Edge 浏览器在设计上注重性能、安全性和易用性&#xff0c;同时也提供了许多实用的功能&#xff0c;如内置笔记、阅读视图、集成的语音助手等…...

springboot项目中图片上传之后需要重启工程才能看到图片?

需求背景 最近在做一个用户自定义上传头像的小需求&#xff0c;用户上传头像然后需要立马回显。 需求是很常见的、正当的需求。如果不使用到对象存储这类服务&#xff0c;我们把用户头像的图片文件仅存在本地就可以了。我们在开发的过程中为了工程管理方便通常下意识会将图片…...

打卡信奥刷题(20)用Scratch图形化工具信奥B3756 [信息与未来 2021] 幸运数字

本题的基础是进制转换&#xff0c;关于2进制转换可以参考打卡信奥刷题&#xff08;19&#xff09;用Scratch图形化工具信奥B3972 [语言月赛 202405] 二进制 题解 知道了2进制&#xff0c;来实现5进制、7进制、9进制是一样的。 [信息与未来 2021] 幸运数字 题目描述 如果⼀个…...

Stream流模式通信及示例

Stream流模式通信是指在计算机网络中&#xff0c;数据作为连续的字节流传输而不是独立的数据包。它是一种面向连接的通信方式&#xff0c;常见于TCP&#xff08;传输控制协议&#xff09;。以下是Stream流模式通信的基本概念和一个简单的示例。 基本概念 面向连接&#xff1…...

从0开始学统计-t分布

1.t分布是如何被发现的&#xff1f; t分布最早由英国统计学家威廉塞弗顿&#xff08;William Sealy Gosset&#xff09;在1908年提出。塞弗顿是爱尔兰的一名酿酒厂的统计学家&#xff0c;他的工作需要对小样本数据进行分析。由于当时样本量较小&#xff08;通常小于30&#xf…...

Git总结超全版

最近想系统的回顾一下Git的使用&#xff0c;如果只想快速的集成git到idea&#xff0c;可以参考另一篇我的博客中的git部分 目录 版本管理工具简介Git安装与配置Git远程仓库配置 Git常用命令为常用命令配置别名(可选)Git忽略文件.gitignore一些概念*本地仓库操作删除仓库内容 *远…...

网络安全之安全协议浅谈

安全协议 安全协议概述安全协议分类IPSecIPSec安全协议IPSec架构IPSec封装模式AH协议ESP协议SET协议SET协议电子交易模型SET协议安全目标认证中心CA 安全协议概述 安全协议是信息交换安全的核心&#xff0c;它在网络不同层次上、针对不同应用&#xff0c;通过对各种密码学技术…...

华为云部署前端项目发生的事

今天刚买了一个云服务&#xff0c;想着部署一下前端项目&#xff1a; 使用的是 docker nginx 部署 部署方法&#xff0c;在以往的文章中有介绍&#xff0c;如有兴趣可以看看docker 部署&#xff1b; 结果发现部署成功之后&#xff0c;竟然无法访问&#xff0c;从命令来看&…...

需求:实现一个可以统计代码的运行时间

需求&#xff1a;有一个做加法计算的函数&#xff0c;要统计执行这个加法函数代码运行了多久 import timedef add(a, b):time.sleep(1)return a bst time.time() add(100, 200) et time.time() print("该函数运行时间为&#xff1a;", et - st) 学了闭包&#x…...

软考高级之redis中使用zset实现延迟队列,你答对了么?

实现延迟队列的思路 zset的特性&#xff0c;带有分数的排序&#xff0c;以时间戳作为分数进行排序 添加任务 zdd取出任务 zrangbyscore执行任务 zrem 定时任务 public static void main(String[] args) {Jedis jedis new Jedis("ip", 6379);TimerTask task new …...

CS 下载安装详解

目录 CS简介&#xff1a; CS下载地址&#xff1a; CS的安装&#xff1a; CS简介&#xff1a; CS为目前渗透中常用的一款工具&#xff0c;它的强大在于控制windows木马&#xff0c;CS主要控制windows木马。 CS下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/…...

高性能无人机飞控系统源码:基于Cesium+Vue3+Vite的三维可视化平台

温馨提示&#xff1a;文末有联系方式1. 基于CesiumVue3Vite的现代化前端架构 采用轻量高效的技术栈构建——CesiumJS提供高精度地理空间渲染能力&#xff0c;Vue3带来响应式数据绑定与组合式API优势&#xff0c;Vite作为极速构建工具显著提升开发与部署体验&#xff0c;确保平台…...

终极卡牌批量生成工具:让桌游设计效率提升300%的完整指南

终极卡牌批量生成工具&#xff1a;让桌游设计效率提升300%的完整指南 【免费下载链接】CardEditor 一款专为桌游设计师开发的批处理数值填入卡牌生成器/A card batch generator specially developed for board game designers 项目地址: https://gitcode.com/gh_mirrors/ca/C…...

小程序在企业数字化转型中的作用是什么?

小程序在企业数字化转型中的作用是什么&#xff1f;一、核心结论小程序在企业数字化转型中的核心作用&#xff0c;不是简单的“线上工具”&#xff0c;而是连接用户、业务与数据的轻量化入口。它通过降低使用门槛与缩短业务路径&#xff0c;使企业能够更高效地完成获客、转化与…...

多动症早期识别是什么?运动干预在儿童注意力缺陷中的作用是什么?

多动症早期识别如何影响儿童学习过程 多动症早期识别对儿童学习过程有着至关重要的影响。早期识别能够及时发现孩子在注意力集中方面的困难&#xff0c;并帮助教育工作者和家长采取有效应对措施。根据研究&#xff0c;注意力不集中可能导致学习成绩下降&#xff0c;影响孩子的自…...

前后端分离架构的实践指南:如何高效实现与优化

1. 前后端分离架构的核心价值 十年前我刚入行时&#xff0c;主流还是用JSP、PHP这类服务端渲染技术。记得有次修改登录页面的按钮颜色&#xff0c;我需要同时改动Java代码里的样式表和JSP模板文件&#xff0c;还要协调后端同事一起联调。这种开发体验让我深刻体会到前后端耦合的…...

终极指南:在UE5中构建专业级角色动画系统

终极指南&#xff1a;在UE5中构建专业级角色动画系统 【免费下载链接】ALS-Community Replicated and optimized community version of Advanced Locomotion System V4 for Unreal Engine 5.4 with additional features & bug fixes 项目地址: https://gitcode.com/gh_mi…...

第5篇 | SOA实践启示录:从信号到服务,AUTOSAR的架构跃迁

2025年底&#xff0c;L2级辅助驾驶渗透率已接近60%&#xff0c;汽车正从“功能堆叠”走向“服务化”。AUTOSAR Adaptive平台是这场变革的技术底座。 SOME/IP服务接口详解 SOME/IP将服务接口分为三类&#xff1a; Method&#xff1a;请求-响应式操作&#xff08;如SetTargetTe…...

2026智慧农业行业趋势白皮书

白皮书立足 “十四五” 农业发展成果&#xff0c;前瞻 “十五五” 农业现代化方向&#xff0c;围绕种植业领域&#xff0c;系统分析我国农业现状、农业 4.0 核心内涵、关键技术、应用场景及未来趋势&#xff0c;明确智慧农业是农业高质量发展的核心路径。关注公众号&#xff1a…...

从Velodyne VLP-16实战出发:手把手教你配置Cartographer实现真实场景3D建图(附避坑参数详解)

从Velodyne VLP-16到高精度3D建图&#xff1a;Cartographer实战进阶指南 当激光雷达点云在屏幕上第一次正确拼接成连贯的走廊轮廓时&#xff0c;那种成就感难以言表。但在此之前&#xff0c;你可能已经经历了无数次rviz黑屏、TF报错和参数调试的煎熬。本文将带你跨越从Cartogr…...

性能优化实战:Vue3 + Cesium加载天地图时,如何解决图层闪烁、内存暴增问题?

Vue3 Cesium天地图性能优化实战&#xff1a;解决图层闪烁与内存泄漏难题 当Vue3遇上Cesium和天地图&#xff0c;这个技术组合能构建出令人惊艳的三维地理应用。但当你真正投入生产环境时&#xff0c;图层闪烁、内存暴增这些"高级"问题就会找上门来。今天我们就来解剖…...