为什么非正规浮点值处理起来较慢?

2023-11-23

通常情况下,消耗或产生非正规值的浮点值比其他情况慢,有时慢得多。

为什么会这样呢?如果是因为它们被软件捕获而不是直接在硬件中处理(据说在某些 CPU 上就是如此),那么为什么它们必须这样做呢?


对于 IEEE-754 浮点,遇到的大多数操作数都是标准化浮点数,并且处理器中的内部数据路径是为标准化操作数构建的。附加指数位可用于内部表示,以始终保持数据路径内的浮点操作数标准化。

因此,任何次正规输入都需要额外的工作,首先确定前导零的数量,然后左移有效数以进行标准化,同时调整指数。低于正常的结果需要将有效数右移适当的量,并且舍入可能需要推迟到发生这种情况之后。

如果纯粹用硬件解决,这种额外的工作通常需要额外的硬件和额外的流水线级:一个、甚至两个额外的时钟周期,每个时钟周期用于处理次正常输入和次正常输出。但典型 CPU 的性能对指令的延迟很敏感,并且需要花费大量精力来保持较低的延迟。 FADD、FMUL 或 FMA 指令的延迟通常在 3 到 6 个周期之间,具体取决于实现和频率目标。

比如说,增加 50% 的额外延迟潜在的因此,处理次正规操作数没有吸引力,更是如此,因为次正规操作数对于大多数用例来说很少见。因此,使用“使常见情况更快,使不常见情况功能化”的设计理念,有很大的动力将次正规操作数的处理从“快速路径”(纯硬件)推向“慢速路径”(组合)的existing硬件加软件)。

我参与了 x86 处理器浮点单元的设计,处理次正规的常见方法是在需要处理这些次正规时调用内部微代码级异常。这种非正常处理可能需要大约 100 个时钟周期。其中最昂贵的部分通常不是修复代码本身的执行,而是进出微代码异常处理程序。

我知道特定的用例,例如数字信号处理中的特定滤波器,其中遇到次正规的情况很常见。为了快速支持此类应用程序,许多浮点单元支持非标准清零模式,其中次正规编码被视为零。

请注意,有些面向吞吐量的处理器设计具有显着的延迟容忍度,特别是 GPU。我很熟悉 NVIDIA GPU,据我所知,它们可以在没有额外开销的情况下处理次正规操作数,并且在过去十几年左右的时间里一直这样做。据推测,这是以额外的管道阶段为代价的,但供应商没有记录这些处理器的许多微架构细节,因此很难确定。以下论文可能会提供一些不同硬件设计如何处理次正规操作数的一般见解,其中一些操作数的开销非常小:

E.M. 施瓦茨、M. 施莫克勒和 S.D. Trong,“具有非规范化数字的 FPU 实现。”IEEE 计算机汇刊,卷。 54,第 7 期,2005 年 7 月,第 825 - 836 页

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

为什么非正规浮点值处理起来较慢? 的相关文章

  • 在Python中获取浮点数的“位”? [复制]

    这个问题在这里已经有答案了 我正在寻找 Java 的 Python 等价物Float floatToBits 我找到了这个Python 获取和操作 作为整数 浮点数的位模式 https stackoverflow com questions
  • 浮点数的哈希函数

    我目前正在 C 中实现一个哈希表 并且正在尝试为浮点数创建一个哈希函数 我本来打算通过填充小数来将浮点数视为整数 但后来我意识到我可能会用大数字来溢出 有没有好的方法来散列浮点数 您不必直接给我该功能 但我想看到 理解不同的概念 Notes
  • 使用python从文件中读取浮点数

    我的输入文件的形式为 5 0 1000 0 100000000000000 0 115 2712 230 538 345 796 461 0408 1 053E 09 1 839E 09 1 632E 10 1 959E 12 4 109
  • 在不改变目标类型的情况下以最高精度序列化浮点数

    我需要反序列化原始二进制数据 BinaryFormatter 然后序列化为 JSON 用于编辑 然后再次将其序列化回二进制 显然 我输在了浮动上 原始浮点值0xF9FF4FC1 大端 大致 12 9999933 四舍五入为0xF6FF4FC
  • 为什么 C 给我的答案与我的计算器不同?

    我在这段代码中遇到了一个奇怪的问题 legibIndex 206 385 84 6 countSylb countWord 1 015 countWord countSent 这是给定文本文件的易读性指数的计算 由于这是一项家庭作业 我们被
  • SQL Server:使用数字文字进行计算

    我用浮点计算做了一些测试 以尽量减少精度损失 我偶然发现了一个现象 我想在这里展示并希望得到解释 当我写作时 print 1 0 1 0 60 0 结果是 60 0024000960 当我编写相同的公式并进行显式转换时float print
  • 当计算结果在 Linux 中产生非正规数时刷新为零

    我的 C 代码中的计算正在产生逐渐下溢 当发生这种情况时 程序将以 SIGFPE 终止 当计算产生逐渐下溢 非正常 时 如何将结果刷新为零 而不终止执行 我正在一台 redhat linux 机器上工作 谢谢 您还没有指定架构 我猜测它是一
  • 在 Perl 中使用 POSIX ceil() 出现意外结果

    我一生都无法弄清楚为什么以下会产生这样的结果 use POSIX my g 6 65 my t g 4 my r t g my n r g my c ceil n print c n n 我知道印记太棒了 抱歉 我已经为我的应用程序解决了这
  • 用几个 1 位 ALU 制作一个 4 位 ALU

    我正在尝试将几个 1 位 ALU 组合成一个 4 位 ALU 我对如何在 VHDL 中实际执行此操作感到困惑 这是我正在使用的 1 位 ALU 的代码 component alu1 define the 1 bit alu componen
  • 浮点转换和性能

    我知道在浮点数和整数之间进行转换时可能会出现错误 但是性能如何 请忽略准确性问题 一般来说 如果我对不同算术类型的操作数 即不同的浮点类型 例如 float and double 和浮点 整数类型组合 例如float and int 是否存
  • 在 Go 中获取机器 epsilon 的最简单方法

    在 Go 中获取机器 epsilon 的最简单方法是什么 浮点数的其他方面 例如精度 最小指数 最大指数 摆动等 又如何呢 我意识到有一个 math const 包 其中包含不同浮点类型的最大值和最小值 http golang org sr
  • 为什么浮点数有符号零?

    为什么双打有 0也 0 其背景和意义是什么 0 通常 被视为0 当一个negative浮点数非常接近零 可以考虑0 要明确的是 我指的是算术下溢 http en wikipedia org wiki Arithmetic underflow
  • PHP 中检查数字是否为浮点型

    这实在是太奇怪了 我有这段代码 rewardAmt amt if is float rewardAmt print r is float die else print r is not float die amt 的值为 0 01 但它正在
  • 当我打开在 Xcode 4 中创建的 Google 地图项目时,Xcode 5 会警告我的架构设置

    我刚刚更新到新发布的 Xcode 5 我正在开发一个使用 Google 地图 iOS SDK 的 iOS 应用程序 当我在 Xcode 4 中开发时 我改变了我的Architectures在我的项目设置中进行设置 按照 Google 的步骤
  • CPU是如何做减法的?

    我有一些基本的疑问 但每次我坐下来尝试面试问题时 这些问题和我的疑问就会出现 假设 A 5 B 2 假设A和B都是4字节 那么CPU是怎么做的呢 A B添加 我知道 A 的符号位 MSB 为 0 表示正值 B 的符号位为 1 表示负整数 现
  • 测试由于浮点限制而导致的舍入误差

    我最近了解到浮点的主要限制之一 事实上 某些数字无法以二进制正确表示 因此可能给出的答案对于您的目的来说不够准确 知道round 2 675 2 and round 2 665 2 两者相等2 67我尝试编写一些代码来给出具有此属性的数字列
  • 在 Linux 上将 libquadmath 与 C++ 链接

    我有一个示例代码 include
  • 从 str 转换为 float 时保持尾随 0

    将带有尾随零的数字从字符串转换为浮点数时遇到以下问题 a 1 100 string a str a float a float string a float a 1 1 有没有办法将 str 转换为 float 同时保留末尾的尾随 0 首先
  • 为什么没有 2 字节浮点并且已经存在实现?

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

    我经常需要在地板或天花板上安装CGFloat to an int 用于计算数组索引 我永远看到的问题floorf theCGFloat or ceilf theCGFloat 是浮点不准确可能会带来麻烦 那如果我的CGFloat is 2

随机推荐

  • 从共享库获取枚举定义

    我正在使用 ctypes 访问用 C 编写的共享库 共享库的 C 源代码包含一个枚举 例如 enum invalid 0 type1 1 type2 2 type enum 在Python方面 我打算只为各种枚举值定义整数常量 例如 INV
  • 将 JSON 字符串列拆分为多列

    我正在寻找一个通用的解决方案来从 JSON 字符串列中提取所有 json 字段作为列 df spark read load path df show 路径 中文件的文件格式是 parquet 样本数据 id json data 1 name
  • 如何制作像 IDE 那样的可停靠表单,而不会使可停靠表单的冻结速度非常缓慢?

    我该如何做 IDE 方法或最终制作基本的停靠方法 而不需要非常缓慢地冻结可停靠窗体的移动 当我在 Delphi 中搜索可停靠表单并发现Zibadian 在程序员天堂上的帖子 首先 Delphi IDE 中的窗口不是 MDI 窗体 而是 SD
  • 如何从对象标签中获取html元素?

    我正在使用对象标签在 html 页面中加载 html 片段 我的代码看起来是这样的 正如预期的那样 页面加载后 一些元素会添加到对象标记之间 我想获取这些元素 但我似乎无法访问它们 我尝试过以下方法 object html object c
  • 如何使用 C# 判断一个数是偶数还是奇数?

    我知道已经有一种方法可以使用模数 判断一个数是偶数还是奇数的最快方法是什么 不过我想知道是否有类似的 C 函数数学偶数 or Math Odd 使用模数是唯一的方法吗 这可能算作弊 但如果你使用 BigInteger 它有一个IsEven
  • vim 如何搜索 URL

    你会如何在 vim 中搜索以下字符串 http my url com a b c 我已经尝试过 就像 非常没有魔法 Vhttp my url com a b c 但它给了我 E492 not an editor command Vhttp
  • 是否有 API 可以检索 Facebook 最近的活动?

    我知道有一个 Graph api url 用于获取最近的墙提要 https graph facebook com me feed access token 但如何获取最近的活动 有什么办法吗 FQL 不是图形 API 也可以工作 我真的不在
  • 如何删除跨度顶部/底部的空白区域? [复制]

    这个问题在这里已经有答案了 This is jsfiddle 我想删除文本顶部和底部的空白区域 我尝试使用行高 但这不是我需要的 我怎样才能做到呢 谢谢 span font size 24px font weight 600 font fa
  • 将 RData 文件转换为脚本文件

    有没有一种直接的方法可以将 RData 文件的功能转换为普通代码文件 R 查看 dump 例如 newEnv lt new env load myFunctions Rdata newEnv dump c lsf str newEnv fi
  • NuGet 无法加载源的服务索引身份验证失败

    从今天开始 由于某种原因 我无法通过 Visual Studio 连接到 NuGet 包管理器 nuget org Unable to load the service index for source https api nuget or
  • 识别并解决 javax.el.PropertyNotFoundException: Target Unreachable

    当尝试像这样在 EL 中引用托管 bean 时 bean entity property 有时一个javax el PropertyNotFoundException Target Unreachable通常在要设置 bean 属性或要调用
  • Android 浏览器中某些按键没有按键事件

    下面的代码在 Chrome Firefox iPhone 甚至 Android 上的第三方浏览器中都能完美运行 但是 当在本机浏览器中运行时 瑞典语键盘上的特殊字符 如 和 的按键事件根本不会被触发 该示例应该只允许用户一次输入一个字符 工
  • Python、SQLite 和线程

    我正在开发一个应用程序 该应用程序将通过 HTTP 从多个位置收集数据 在本地缓存数据 然后通过 HTTP 提供数据 所以我正在看以下内容 我的应用程序将首先创建几个线程 这些线程将按指定的时间间隔收集数据并将该数据本地缓存到 SQLite
  • C# 中读取大端数据的有效方法

    我使用以下代码来读取 BigEndian 信息BinaryReader但我不确定这是否是有效的方法 还有更好的解决办法吗 这是我的代码 some code to initialize the stream value set the len
  • Excel COM add 在启动期间未加载,必须手动添加

    Excel COM 插件在启动期间未加载 每次我都必须手动添加它 检查后文件 gt 选项 gt 加载项 gt 管理 gt COM 加载项 我看到 加载项 处于 已卸载 状态 不知道如何让它在启动时自动加载 这就是为我解决问题的方法 Step
  • 保存枕头图像时如何正确设置 DPI?

    我正在尝试使用Python以编程方式创建图像枕头库但我遇到图像内文本的图像质量问题 我想将生成的图像保存为 PNG 因此我在保存时设置 DPIthis 但我是否保存dpi 72 72 or dpi 600 600 它在视觉上看起来是一样的
  • asp.net c# SqlDataSource超时问题

    我试图将 SqlDataSource 的超时时间延长到 30 秒以上 似乎是默认值 我正在尝试运行一个必须运行 100 000 条记录的存储过程 在繁忙期间它会超时 我在 2003 服务器上使用 ASP NET 4 0 和 IIS 6 0
  • C++ Vector at/[] 运算符速度

    为了给函数提供修改向量的选项 我不能这样做 curr myvec at i doThis curr doThat curr doStuffWith curr 但我必须这样做 doThis myvec at i doThat myvec at
  • 如何重置nodejs流?

    如何重置nodejs流 如何在nodejs中再次读取流 提前致谢 var fs require fs var lineReader require line reader proxy txt only 3 lines var readStr
  • 为什么非正规浮点值处理起来较慢?

    通常情况下 消耗或产生非正规值的浮点值比其他情况慢 有时慢得多 为什么会这样呢 如果是因为它们被软件捕获而不是直接在硬件中处理 据说在某些 CPU 上就是如此 那么为什么它们必须这样做呢 对于 IEEE 754 浮点 遇到的大多数操作数都是