机器学习-fp16相乘

2023-11-09

1位符号位+5位指数位+10位尾数位,共16位,内存占2个字节
在这里插入图片描述
具体fp16表示法可以参照:机器学习-fp16表示
运算步骤

  1. 检查操作数中是否有0、Inf、NaN
    NaN * a = Nan;
    Inf * 0 = Nan;
    (-Inf) * 0 = Nan;
    Inf * (+/-)a = (+/-)Inf;
    -Inf * (+/-)a = (-/+)Inf;
    0 * a = 0;
  2. 计算指数
    两指数直接相加:exp1 - bias + exp2 - bias = exp1 + exp2 - 2 * bias
  3. 计算尾数,并判断是否产生进位
    两尾数直接相乘
  4. Round to nearest even舍入处理
    舍入到最接近且可以表示的值,当存在两个数一样接近时,取偶数值。(如2.4舍入为2,2.6舍入为3;2.5舍入为2,1.5舍入为2。)
    当存在两个数一样接近时取偶数值是因为由于其他舍入方式均令结果单方向偏移,导致在运算时出现较大的统计偏差。而采用这种偏移则50%的机会偏移两端方向,从而减少偏差。
  5. 最终结果溢出判断
    由于规格化可能导致阶码发生溢出,如果没有溢出,则直接返回结果;如果发生向上溢出,则返回Inf;如果发生向下溢出,则返回0
//判断是否为无效数:阶码全1,尾数非全0,则为无效数
int isNan(int data)
{	
	int exp = ((data & 0x7fff) >> 10) & 0x1f;
	int mant = data & 0x3ff;

	return ((exp == 0x1f) && (mant != 0)) ? 1 : 0;
}

//判断是否为正负无穷:阶码全1,尾数全0,则为无穷大,符号位为0,则为正无穷,符号位为1,则为负无穷
int isInf(int data)
{
	int exp = ((data & 0x7fff) >> 10) & 0x1f;
	int mant = data & 0x3ff;

	return ((exp == 0x1f) && (mant == 0)) ? 1 : 0;
}

//判断是否为0:阶码全0,尾数全0,则为0,符号位为0,则为正零,符号位为1,则为负零
int isZero(int data)
{
	int exp = ((data & 0x7fff) >> 10) & 0x1f;
	int mant = data & 0x3ff;

	return ((exp == 0) && (mant == 0)) ? 1 : 0;
}

int* fp16_Mul(int* data1, int* data2)
{
	unsigned int mant1, mant2, mantNew;	//data1尾数,data2尾数,相乘之后的尾数
	unsigned int mantToExp;				//尾数累加有进位
	int sign1, sign2, signNew;			//data1符号位,data2符号位,乘积符号位
	int exp1, exp2, expNew;				//data1阶码,data2阶码,乘积阶码
	
	int tenBit = 0, elevenBit = 0, lastBit = 0;
	int fp16Res;

	sign1 = (data1 >> 15) & 0x01;
	sign2 = (data2 >> 15) & 0x01;
	exp1 = ((data1 & 0x7fff) >> 10) & 0x1f;
	exp2 = ((data2 & 0x7fff) >> 10) & 0x1f;
	mant1 = data1 & 0x3ff;
	mant2 = data2 & 0x3ff;
	
	signNew = sign1 ^ sign2;

	//1. 检查操作数中是否有0、Inf、NaN
	if(isNan(data1) || isNan(data2)){
		return 0x7c01;					//NAN和任何数相乘为NAN
	}	
	if(isInf(data1)){
		if(isZero(data2)){				//(+/-)Inf * 0 = NAN
			return 0x7c01;
		}
		else if(signNew == 1){			//Inf * a
			return 0xfc00;				//-Inf
		}
		else if(signNew == 0){
			return 0x7c00;				//+Inf
		}
	}
	if(isInf(data2)){
		if(isZero(data1)){				//(+/-)Inf * 0 = NAN
			return 0x7c01;
		}
		else if(signNew == 1){			//Inf * a
			return 0xfc00;				//-Inf
		}
		else if(signNew == 0){
			return 0x7c00;				//+Inf
		}
	}
	if(isZero(data1) || isZero(data2))
		return 0;
			
	//2.计算expNew
	expNew = (exp1 - 15) + (exp2 - 15) + 15;
	
	//3.计算mantNew
	mant1 = mant1 | 0x400;	
	mant2 = mant2 | 0x400;
	mantNew = mant1 * mant2;
	
	//判断是否产生进位
	if(mantNew & 0x200000){				//11位乘11位最多产生22位
		expNew++;						//阶码+1
		lastBit = mantNew & 0x01;		//最后一位是否为1
		mantNew >>= 1;					//尾数右移
	}
	//最后21位小数舍去后10位,保留前11位(其中包括1位前导数1)
	//4.Round to nearest even,因为浮点数无法精确表示所有数值,所以要进行舍入处理。
	tenBit = (mantNew >> 10) & 0x01;	//第10位尾数是否为1(从左往右数)
	elevenBit= (mantNew >> 9) & 0x01;	//第11位尾数是否为1
	lastBit= (mantNew & 0x1ff) || lastBit; //11位之后也就是后9位是否存在1
	/*舍入(以保留2位小数为例帮助理解下部分舍入代码,
	两种情况入:a). 0.0011或0.00100001,舍入到最近的数,都得0.01;b). 0.0110两边一样近,向偶数舍入得0.1。
	两种情况舍:a). 0.010001舍入到最近的数,得0.01;b). 0.0010两边一样近,向偶数舍入得0.00)
	*/
	if(elevenBit && (tenBit || lastBit)){
		mantNew += 0x400;				//舍入,有效的前11位尾数,+1				
	}
	if(mantNew & 0x200000){				//舍入之后产生进位
		expNew++;
		mantNew >>= 1;
	}
	mantNew >= 10;						//舍去21位的后10位
	//溢出判断
	if(expNew >= 31){					//上溢出
		if(signNew == 1){
			return 0xfc00;				//返回负无穷
		}
		else{
			return 0x7c00;				//返回正无穷
		}
	}
	if(expNew <= 0)						//下溢出
	{
		return 0;
	}

	fp16Res = (((signNew & 0x01) << 15) | ((expNew & 0x1f) << 10) | (mantNew & 0x3ff));
	return fp16Res;	

/*
输入
data1:254 (0x5bf0, 0101 1011 1111 0000, 1.111111 * 2^(22-15));
data2:7.6836 (0x47af, 0100 0111 1010 1111, 1.11 1010 1111 * 2^(17-15));

输出:
fp16Res:261.75(0x5c17, 0101 1100 0001 0111, 1.00 0001 0111 * 2^(23-15));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习-fp16相乘 的相关文章

  • 部署 MVC4 项目时出错:找不到文件或程序集

    过去 我只需使用 Visual Studio 2012 发布到 AWS 菜单项即可部署我的 MVC4 网站 到 AWS Elastic Beanstalk 现在 程序可以在本地编译并运行 但无法部署 从消息来看 它似乎正在寻找不在当前部署的
  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向

随机推荐

  • uniapp的onPullDownRefresh失效 不执行

    需要在 pages json 里 找到的当前页面的pages节点 并在 style 选项中开启 enablePullDownRefresh path pages install uploadImg style navigationBarTi
  • 数据分析-数据集划分-交叉验证

    目录 交叉验证 k折交叉验证 k fold cross validation 分层k折交叉验证 stratified cross validation Sklearn的实现 k折交叉分类器 分层k折交叉分类器 打乱数据集后再划分 模型验证
  • angular 代理http到https

    api target https www XXXX com changeOrigin true public target https www XXXX com changeOrigin true
  • uniapp switch按钮的使用

    switch使用官方文档 https uniapp dcloud io component switch 想要改变switch按钮的大小
  • Cloudera CDH 5.1版本的Hive与LDAP-2.4.44集成

    文章目录 0 没集成之前测试 1 安装LDAP 2 4 44 2 增加组织 3 添加用户 4 CDH配置LDAP 5 beeline测试1 5 beeline测试2 0 没集成之前测试 可以看到没有输入用户密码可以登录 1 安装LDAP 2
  • OpenGL学习笔记(十)-几何着色器-实例化

    参考网址 LearnOpenGL 中文版 4 7 几何着色器 4 7 1 基本概念 1 顶点和片段着色器之间有一个可选的几何着色器 几何着色器的输入是一个图元 如点或三角形 的一组顶点 顶点发送到下一着色器之前可对它们随意变换 将顶点变换为
  • 【Web Crawler】Python 的 urllib.request 用于 HTTP 请求

    如果您需要使用 Python 发出 HTTP 请求 那么您可能会发现自己被引导至 brilliantrequests库 尽管它是一个很棒的库 但您可能已经注意到它并不是 Python 的内置部分 如果您出于某种原因更喜欢限制依赖项并坚持使用
  • qt 中lineEdit->setText()输出double

    在qt中需要将获取到的double 值在ui界面上显示出来 便于观察 但是lineEdit控件的setText 要求的参数是string 所以我们先要进行转化 将double 转化为string QString QString number
  • 计算方法实验(二):龙贝格积分法

    Romberg积分法数学原理 利用复化梯形求积公式 复化辛普生求积公式 复化柯特斯求积公式的误差估计式计算积分 a b f x
  • 有效的数独

    LeetCode 之 有效的数独 判断一个 9x9 的数独是否有效 只需要根据以下规则 验证已经填入的数字是否有效即可 数字 1 9 在每一行只能出现一次 数字 1 9 在每一列只能出现一次 数字 1 9 在每一个以粗实线分隔的 3x3 宫
  • python机器学习-乳腺癌细胞挖掘(基于真实美国临床数据)

    随着人们生活水平提高 大家不仅关注如何生活 而且关注如何生活得更好 在这个背景下 精准治疗和预测诊断成为当今热门话题 据权威医学资料统计 全球大约每13分钟就有一人死于乳腺癌 乳腺癌已成为威胁当代人健康的主要疾病之一 并且随着发病率的增加
  • Error mounting /dev/sr0 at /media/ VBox

    重新安装Linux映像 sudo apt get install reinstall linux image uname r
  • IBM WAS简介

    IBM WAS简介 IBM WAS 的全称是 IBM WebSphere Application Server 和 Weblogic 一样 是 当前主流的 App Server 应用服务器 之一 App Server 是运行 Java 企
  • DataWhale集成学习(下)——Task14 案例分析1幸福感预测

    目 录 背景介绍 数据信息 评价指标 案例 背景介绍 数据来源于国家官方的 中国综合社会调查 CGSS 文件中的调查结果中的数据 数据来源可靠可依赖 用139维的信息来预测其对幸福感的影响 数据信息 139维 8000余组 幸福感预测值为1
  • 【indemind双目惯性相机调试】sudo后找不到命令问题,环境变量问题

    问题1 报错 kanhao100 ubuntu x86 roslaunch imsee ros wrapper start launch RLException start launch is neither a launch file i
  • 深度学习_调参经验

    面对一个图像分类问题 可以有以下步骤 1 建立一个简单的CNN模型 一方面能够快速地run一个模型 以了解这个任务的难度 卷积层1 卷积核大小3 3 卷积核移动步长1 卷积核个数64 池化大小2 2 池化步长2 池化类型为最大池化 激活函数
  • leetCode热题46-51 解题代码,调试代码和思路

    前言 本文属于特定的六道题目题解和调试代码 正所谓磨刀不误砍柴功 下面我做这几篇文档对于涉及的题型或者数据结构的分析都很有帮助 贴出来仅供参考 1 69 x 的平方根 Easy 2022 12 28 101 2 22 括号生成 Medium
  • JSP核心标签库

    1 一般标签 在JSTL中 一般标签主要用在输出 设置变量值和错误处理等 这些是JSTL中使用最多的标签 1 计算一个表达式的值 然后把计算的结果输出到当前的JspWriter对象 调用的结果和Servlet中out println 语句效
  • linux 删除指定文件夹包含指定字符串的文件会把所有子文件夹包含的都删除

    需求就是在linux服务器上面删除 指定文件夹里面所有包含 delete 内容的文件 并且所有此文件夹里面的子文件夹查出来也要删除掉 使用以下脚本可以进行实现 grep r l delete data xargs rm rf 脚本说明 gr
  • 机器学习-fp16相乘

    1位符号位 5位指数位 10位尾数位 共16位 内存占2个字节 具体fp16表示法可以参照 机器学习 fp16表示 运算步骤 检查操作数中是否有0 Inf NaN NaN a Nan Inf 0 Nan Inf 0 Nan Inf a In