为什么没有 2 字节浮点并且已经存在实现?

2024-05-11

假设我真的内存不足并且想要更小的范围(类似于short vs int)。着色器语言已经支持half对于半精度的浮点类型(不仅仅是来回转换使值在 -1 和 1 之间,即返回一个像这样的浮点数:shortComingIn / maxRangeOfShort)。是否已经存在 2 字节浮点数的实现?

我也有兴趣知道为什么没有 2 字节浮点的任何(历史?)原因。


TL;DR:16 位浮点数确实存在,并且有各种软件和硬件实现

目前有2种常见的标准16位浮点格式:IEEE-754 二进制16和谷歌的bfloat16。由于它们是标准化的,显然任何了解规范的人都可以编写实现。一些例子:

  • https://github.com/ramenhut/half https://github.com/ramenhut/half
  • https://github.com/minhhn2910/cuda-half2 https://github.com/minhhn2910/cuda-half2
  • https://github.com/tianshilei1992/half_ precision https://github.com/tianshilei1992/half_precision
  • https://github.com/acgessler/half_float https://github.com/acgessler/half_float

或者如果你不想使用它们,你也可以设计一个不同的16位浮点格式并实现它


一般不使用 2 字节浮点数,因为即使float 的精度不足以满足正常操作 and double应始终默认使用,除非您受到带宽或缓存大小的限制。浮点文字也是double在 C 和类 C 语言中使用时不带后缀。看

  • 为什么 double 优于 float? https://stackoverflow.com/q/22818382/995714
  • 我应该使用双精度还是浮点? https://stackoverflow.com/q/1074474/995714
  • 什么时候用float,什么时候用double https://softwareengineering.stackexchange.com/q/188721/98103

However 小于 32 位的浮点数确实存在 https://en.wikipedia.org/wiki/Minifloat。它们主要用于storage例如在图形中,每像素 96 位(每通道 32 位 * 3 个通道)太浪费了,并且将转换为正常的 32 位浮点数进行计算(某些特殊硬件上除外)。各种各样的10、11、14 位浮点类型 https://www.khronos.org/opengl/wiki/Small_Float_Formats存在于OpenGL中。许多 HDR 格式对每个通道使用 16 位浮点,而 Direct3D 9.0 以及 Radeon R300 和 R420 等一些 GPU 则采用 24 位浮点格式。还支持 24 位浮点数一些 8 位微控制器中的编译器 https://microchipdeveloper.com/c:understanding-floating-point-representations like PIC https://stackoverflow.com/q/26930117/995714其中 32 位浮点支持成本太高。 8 位或更窄的浮点类型用处不大,但由于其简单性,它们经常在计算机科学课程中教授。此外,还使用了一个小浮球ARM的指令编码 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489c/CJAEFGHE.html对于小浮点立即数。

The IEEE 754-2008 修订版 https://en.wikipedia.org/wiki/IEEE_754正式添加了 16 位浮点格式,A.K.Abinary16 or 半精度 https://en.wikipedia.org/wiki/Half-precision_floating-point_format,带有 5 位指数和 11 位尾数

一些编译器支持 IEEE-754 二进制 16,但主要用于转换或向量化操作,而不是计算(因为它们不够精确)。例如ARM的工具链有__fp16 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491f/CHDCJAEC.html可以在 2 种变体之间进行选择:IEEE 和替代,具体取决于您是否需要更多范围或 NaN/inf 表示。GCC https://gcc.gnu.org/onlinedocs/gcc/Half-Precision.html and Clang https://clang.llvm.org/docs/LanguageExtensions.html#half-precision-floating-point也支持__fp16以及标准化名称_Float16. See 如何在 x86_64 的 gcc 上启用 __fp16 类型 https://stackoverflow.com/q/45108628/995714

最近由于人工智能的兴起,另一种格式称为bfloat16 https://en.wikipedia.org/wiki/Bfloat16_floating-point_format (大脑浮点格式 https://en.wikichip.org/wiki/brain_floating-point_format)这是一个简单截断IEEE-754 二进制32 的前 16 位变得常见

减少尾数背后的动机源自谷歌的实验,该实验表明,只要仍然可以将接近于零的微小值表示为训练期间微小差异总和的一部分,就可以减少尾数。较小的尾数带来了许多其他优势,例如减少乘法器功率和物理硅面积。

  • float32: 242=576 (100%)
  • float16: 112=121 (21%)
  • bfloat16: 82=64 (11%)

许多编译器喜欢 and 现在还获得了支持 bfloat16 的能力

有关 bfloat16 的更多信息:

  • bfloat16 - 硬件数值定义 https://software.intel.com/en-us/download/bfloat16-hardware-numerics-definition
  • 将 bfloat16 与 TensorFlow 模型结合使用 https://cloud.google.com/tpu/docs/bfloat16
  • 什么是 tf.bfloat16“截断的 16 位浮点”? https://stackoverflow.com/q/44873802/995714

如果 bfloat16 不够用,还会出现一种新的 19 位类型,称为张量浮点数 https://blogs.nvidia.com/blog/2020/05/14/tensorfloat-32-precision-format/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么没有 2 字节浮点并且已经存在实现? 的相关文章

  • 使用链表进行堆排序

    我想知道是否有人曾经使用链表进行堆排序 如果他们可以提供代码 我已经能够使用数组进行堆排序 但尝试在链表中进行排序似乎不切实际 而且在你知道的地方很痛苦 我必须为我正在做的项目实现链接列表 任何帮助将不胜感激 我也用C 答案是 你不想在链表
  • C# SmtpClient编程中如何设置带有中文的附件文件名?

    我的代码如下 ContentType ct new ContentType ct MediaType MediaTypeNames Application Octet ct Name 这是一个很长的中文文件名希望能用它在附件名中 Doc A
  • 静态构造函数和 BeforeFieldInit?

    如果类型没有静态构造函数 则将执行字段初始值设定项 就在使用该类型之前 或者在某个时间点突发奇想 运行时 为什么这段代码 void Main start Dump Test EchoAndReturn Hello end Dump clas
  • 是否可以使用 http url 作为 DirectShow .Net 中源过滤器的源位置?

    我正在使用 DirectShow Net 库创建一个过滤器图 该过滤器图通过使用 http 地址和 WM Asf Writer 来流式传输视频 然后 在网页上 我可以使用对象元素在 Windows Media Player 对象中呈现视频源
  • 捕获 .aspx 和 .ascx 页面中的异常

    问题说明了一切 请看以下示例代码 ul li li ul
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • 条件类型定义

    如果我有一小段这样的代码 template
  • 我们可以通过指针来改变const定义的对象的值吗?

    include
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • 如何在C#中控制datagridview光标移动

    我希望 datagridview 光标向右移动到下一列 而不是在向单元格输入数据后移动到下一行 我试图通过 dataGridView1 KeyDown 事件捕获键来控制光标 但这并不能阻止光标在将数据输入到单元格后移动到下一行 提前感谢你的
  • 在 C# 的 WebAPI 中的 ApiController 上使用“传输编码:分块”提供数据

    我需要服务分块传输使用编码数据API控制器 因为我无权访问HttpContext or the Http请求 我有点不知道在哪里写入响应以及在哪里刷新它 设置如下 public class MyController ApiControlle
  • 如何获取带有某个属性注释的所有属性?

    我刚刚从 Roslyn 开始 我想找到所有用属性名称 OneToOne 注释的属性 我启动了 SyntaxVisualizer 并能够获取对该节点的引用 但我想知道是否有更简单的方法来实现此目的 这就是我所拥有的 var prop docu
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr

随机推荐

  • NHibernate 忽略长度属性

    运行 SQL Profiler 后 我意识到 NHibernate 正在将字符串映射到nvarchar 4000 我通过指定修复了它type AnsiString and length 在 hbm 文件中 现在正在生成varchar 800
  • .gitlab-ci.yml yaml 内的数组变量

    我想在 gitlab ci cd yml 文件的变量中使用数组 如下所示 variables myarrray abc dcef script echo myarray 0 myarray 1 但 Lint 告诉我该文件不正确 variab
  • 如何使用 Angular4 进行 Codeigniter 视图?

    首先 我的 PHP Codeigniter 项目当前在服务器上运行 然后我在服务器上安装了最新的 Angular4 CLI Typescript 但我不知道如何与Codeigniter项目集成 如何像 AngularJS 一样在 Codei
  • 更改滚动时的 div 不透明度

    我怎样才能做到当你向下滚动页面时 下一个 DIV 会在前一个 DIV 之上淡出 我设置了这个小提琴来更好地说明它 http jsfiddle net meEf4 176 http jsfiddle net meEf4 176 例如 如果您位
  • 如何知道 Azure 函数是否正在插槽中运行

    函数可以知道它是否在槽中运行吗 我想阻止某个函数在 暂存 槽中执行 Updated 根据布鲁斯的回答 再次感谢朋友 我写了那篇博文http www frankysnotes com 2017 09 how to know when azur
  • 使用 tabLayout 时如何更改所选选项卡的文本样式?

    我想让选定选项卡的文本变为粗体 我怎样才能通过 xml 或 java 代码来做到这一点 无论哪种更容易 我稍微更改了上面建议的答案 它对我来说非常有用 不需要额外的 xml 文件 希望它会有所帮助 for int i 0 i lt tabL
  • Swift iOS 9.2 中的每日本地通知

    尝试快速发送每日本地通知 然而 由于某种原因 它只是每分钟发送一次 我希望第一个通知在应用程序打开后 30 分钟发送 然后每天重复此通知 在 swift fie 中我有以下代码 每日通知代码 同时在应用程序委托中添加部分 让 Date NS
  • 如何将 JTable 中的数据导出到 CSV

    我只是在启动一些代码从 JTable 中提取值时遇到问题 以便最终可以将它们作为 CSV 文件在 Excel 上查看 目前我有一个使用以下代码创建的 JTable package com alpha import javax swing i
  • 将 MIME 编码的附件发布到 Ariba Supply Network 时出现问题

    我在尝试使用 VB NET 和 WebRequest 对象发布一些 cXML 文本和附件时遇到问题 我相信我正在格式化我希望正确发布的数据文本 因为它与 Ariba 提供的示例相匹配 我不确定的是我是否正确使用 WebRequest 对象来
  • 启用远程访问neo4j 4.2社区版

    由于在家工作 我需要一种方法来监视远程 neo4j 实例 最好通过 Web 浏览器实例 在过去 例如在3 0中 它可以通过以下方式轻松实现修改单个配置行 https neo4j com developer kb how do i enabl
  • 如何动态更改JList中所选项目的背景颜色

    如何动态更改 JList 中选择的项目的背景颜色 像下面这样的东西应该有助于作为起点 public class SelectedListCellRenderer extends DefaultListCellRenderer Overrid
  • 如何为 Jsoup 添加代理支持?

    我是 Java 初学者 我的第一个任务是解析大约 10 000 个 URL 并从中提取一些信息 为此我正在使用Jsoup并且运行良好 但现在我想为其添加代理支持 代理也有用户名和密码 您可以轻松设置代理 System setProperty
  • 从 MVC 视图中的模型访问 displayName 属性

    如果我的模型有 DisplayName First Name public string firstName get set 然后我可以用 LabelFor 在视图中打印它 Html LabelFor model gt model acc
  • Rails 4 - 将地址保存为数据库中的一列

    我是 Rails 新手 正在开发一个简单的应用程序 我的 ERD 中有一个名为 Client 的模型 并且希望保存每个客户的地址 我最初的想法是将地址保存为单独的字段 即 rails g model Client address first
  • 提交表单后重定向是一个好习惯吗?

    我最近开始在提交网站上的某些表单 主要与购物车应用程序相关 后进行 header 重定向 到同一页面 以便用户不会通过刷新页面来执行意想不到的操作或者 后退 或 前进 并刷新页面 这是可以接受的做法吗 这是标准做法 称为redirect a
  • 我有*很多*源文件要添加到 git 存储库,如何使其快速

    我在看here https git scm com docs git fast import寻找更快地将批量文件导入 git 存储库的灵感 但不确定是不是这样 基本上情况是 我有超过 1 亿个文件想要提交到 git 存储库 我已将它们分解为
  • sqlalchemy 的 row_to_json 语法

    我想弄清楚如何将 Postgres 9 2 row to json 与 SqlAlchemy 一起使用 但是我无法想出任何有效的语法 details foo row q select Foo where Foo bar id Bar id
  • Android 进度不相应地工作

    我是 Android 和 Java 新手 我一直在从事我的任务 即图像下载器 我必须下载带有进度条的图像并将其显示在网格中 我创建了两个类 1 URL图像适配器 2 缓存活动 一切正常 但在我单击下载按钮之前下载就开始了 当我单击下载按钮时
  • 在 Grails 中使用 AOP 不适用于服务

    我使用 Grails 2 2 3 并在 grails app conf spring resources groovy 中键入以下代码 beans xmlns aop http www springframework org schema
  • 为什么没有 2 字节浮点并且已经存在实现?

    假设我真的内存不足并且想要更小的范围 类似于short vs int 着色器语言已经支持half对于半精度的浮点类型 不仅仅是来回转换使值在 1 和 1 之间 即返回一个像这样的浮点数 shortComingIn maxRangeOfSho