是否有任何架构使用相同的寄存器空间来进行标量整数和浮点运算?

2024-01-21

我见过的大多数支持本机标量硬件 FP 支持的架构将它们推入完全独立的寄存器空间,与主寄​​存器集分开。

我见过的大多数支持本机标量硬件 FP 支持的架构将它们推入完全独立的寄存器空间,与主寄​​存器集分开。

  • X86 的传统 x87 FPU 使用带有寄存器的部分独立浮点“堆栈机”(读作:基本上是固定大小的 8 项环形缓冲区)st(0)通过st(7)为每个项目建立索引。这可能是最不同的流行的。它只能通过加载/存储到内存或通过将比较结果发送到 EFLAGS 来与其他寄存器交互。 (286)fnstsw ax http://felixcloutier.com/x86/FSTSW:FNSTSW.html和 i686fcomi http://felixcloutier.com/x86/FCOMI:FCOMIP:FUCOMI:FUCOMIP.html).
  • 支持 FPU 的 ARM 有一个独立的 FP 寄存器空间,其工作方式与其整数空间类似。主要区别是专门用于浮点的单独指令集,但即使是习惯用法也大多一致。
  • MIPS 介于两者之间浮点 https://www.doc.ic.ac.uk/lab/secondyear/spim/node20.html从技术上讲,是通过协处理器(至少明显地)完成的,并且它的使用规则略有不同(例如使用两个浮点寄存器而不是单个扩展寄存器进行双精度运算),但它们的工作方式与 ARM 非常相似。
  • X86 较新的 SSE 标量指令的操作方式与其矢量指令类似,使用类似的助记符和习惯用法。它可以自由地加载和存储到标准寄存器和内存,并且您可以使用 64 位内存引用作为许多标量操作的操作数,例如addsd xmm1, m64 https://www.felixcloutier.com/x86/ADDSD.html or subsd xmm1, m64 https://www.felixcloutier.com/x86/SUBSD.html,但您只能通过以下方式从寄存器加载和存储到寄存器movq xmm1, r/m64, movq r/m64, xmm1, 和朋友 https://www.felixcloutier.com/x86/MOVD:MOVQ.html。这与 ARM64 NEON 类似,尽管它与 ARM 的标准标量指令集略有不同。

相反,许多矢量化指令甚至不关心这种区别,只是区分标量和矢量。对于 x86、ARM 和 MIPS 这三个:

  • 它们将标量和向量寄存器空间分开。
  • 它们重用相同的寄存器空间进行矢量化整数和浮点运算。
  • 他们仍然可以访问适用的整数堆栈。
  • 标量操作只是从相关的寄存器空间(或者 x86 FP 常量的情况下的内存)中提取它们的标量。

但我想知道:是否有任何 CPU 架构可以重用相同的寄存器空间进行整数和浮点运算?

如果不是(由于兼容性之外的原因),什么会阻止硬件设计人员选择走这条路?


Motorola 88100 有一个用于浮点和整数值的寄存器文件(三十一个 32 位条目加上一个硬连线零寄存器)。对于 32 位寄存器和对双精度的支持,必须使用寄存器对来提供值,这极大地限制了寄存器中可以保存的双精度值的数量。

后续的 88110 添加了 32 个 80 位扩展寄存器,用于附加(和更大)浮点值。

参与 Motorola 88k 开发的 Mitch Alsup 开发了自己的加载存储 ISA(至少部分出于教学原因),如果我没记错的话,它使用统一的寄存器文件。

还应该注意的是,Power ISA(PowerPC 的后代)定义了“嵌入式浮点设施”,它使用 GPR 来表示浮点值。这降低了核心实现成本和上下文切换开销。

单独的寄存器文件的一个好处是,这样可以提供显式存储,以减少简单的有限超标量设计中的寄存器端口数量(例如,为每个文件提供三个读取端口将允许所有对一个 FP,甚至三源操作数 FMADD,以及与使用单个寄存器文件的五个读取端口来支持 FMADD 和另外一个双源操作相比,并行启动一个基于 GPR 的操作以及许多常见的基于 GPR 的操作对。另一个因素是容量是额外的并且宽度独立;这既有优点也有缺点。此外,通过将存储与操作耦合,可以以更直接的方式实现高度独特的协处理器。考虑到芯片尺寸的限制,这对于早期微处理器来说更为重要,但 UltraSPARC T1 共享一个具有八个内核的浮点单元,而 AMD 的 Bulldozer 共享一个具有两个整数“内核”的 FP/SIMD 单元。

统一的寄存器文件具有一些调用约定的优点;无论值的类型如何,都可以在同一寄存器中传递值。统一的寄存器文件还允许所有寄存器用于所有操作,从而减少不可用的资源。

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

是否有任何架构使用相同的寄存器空间来进行标量整数和浮点运算? 的相关文章

  • 英特尔的最后分支记录功能是英特尔处理器独有的吗?

    最后分支记录是指存储与最近执行的分支相关的源地址和目标地址的寄存器对 MSR 的集合 它们受英特尔酷睿 2 英特尔至强和英特尔凌动处理器系列的支持 http css csail mit edu 6 858 2012 readings ia3
  • 超标量和 VLIW

    我想问一些关于ILP的问题 超标量处理器是标量处理器和矢量处理器的混合体 那么我可以说矢量处理器的架构遵循超标量吗 同时处理多个指令不会使体系结构超标量 因为流水线 多处理器或多核体系结构也可以实现这一点 这意味着什么 我读过 超标量 CP
  • C 中使用 getrandom 实现随机浮点数

    我试图生成一个介于 0 和 1 之间的随机浮点数 无论是在 0 1 还是 0 1 对我来说都不重要 网上关于此的每个问题似乎都涉及rand 呼叫 播种time NULL 但我希望能够每秒多次调用我的程序 并每次都获得不同的随机数 这引导我找
  • 如何在Python中找到低精度浮点值的原始文本表示?

    我遇到了显示问题floatPython 中的值 从外部数据源加载 它们是 32 位浮点数 但这也适用于较低精度的浮点数 以防万一 这些值是由人类在 C C 中输入的 因此与任意计算值不同 与round数字很 可能not预期的 但不能被忽略
  • 标准数学函数在不同 CPU 上的再现性

    我正在做一个需要大量数学计算的项目 打开新的测试机后 我注意到很多测试都失败了 但同样重要的是要注意 测试在我的开发机器以及其他开发人员的某些机器上也失败了 经过跟踪值并与旧机器的值进行比较后 我发现一些功能 此时我只发现cosine ma
  • 如何准确判断 double 是否为整数? [复制]

    这个问题在这里已经有答案了 具体来说 在 Java 中 我如何确定double是一个整数 为了澄清 我想知道如何确定 double 实际上不包含任何分数或小数 我主要关心的是浮点数的性质 我想到的方法 以及我通过谷歌找到的方法 基本上遵循以
  • 为什么多次相加0.1仍然无损?

    我知道0 1十进制数不能用有限的二进制数精确表示 解释 http www exploringbinary com why 0 point 1 does not exist in floating point so double n 0 1会
  • x86:寄存器操作为内存内容和内存地址?

    寄存器 gt 内存地址 gt 内存内容 内存地址 gt 内存内容 上面的模型正确吗 而且 如果是的话 你能建议我是否认为正确吗 movl eax ebx gt 它将 eax 的内存地址移动到 ebx 这也会导致内容移动 movl eax e
  • 为什么这个函数在额外读取内存时运行速度如此之快?

    我目前正在尝试了解 x86 64 上某些循环的性能属性 特别是我的 Intel R Core TM i3 8145U CPU 2 10GHz 处理器 具体来说 在循环体内添加一条额外的指令来读取内存几乎可以使性能提高一倍 而细节并不是特别重
  • 如何检测跨平台浮点行为的差异

    我可以执行哪些检查来确定两个硬件平台的浮点行为有何差异 验证 IEEE 754 合规性或检查已知错误可能就足够了 以解释我观察到的输出差异 我通过 proc cpu 查看了 CPU 标志 两者都声称支持 SSE2 我在看 https www
  • Python:获取Windows操作系统版本和架构

    首先 我不认为这个问题是重复的 在Python中检测64位操作系统 windows https stackoverflow com questions 2208828 detect 64bit os windows in python因为恕
  • 限制纬度和经度值的模数

    我有代表纬度和经度的双精度数 我可以轻松地将经度限制为 180 0 180 0 具有以下功能 double limitLon double lon return fmod lon 180 0 360 0 180 0 这是有效的 因为一端是排
  • 如何将字符串转换为带有“tail”的浮点数?

    我在将字符串转换为浮点数时遇到问题 print gettype value id returns string var dump value id returns string 34 7140 length 7 float floatval
  • 我可以使用 AVX FMA 单元进行位精确的 52 位整数乘法吗?

    AXV2 doesn t have any integer multiplications with sources larger than 32 bit It does offer 32 x 32 gt 32 http www felix
  • 汇编PC相对寻址模式

    我正在研究数据路径 并一直在尝试理解分支指令 这就是我的理解 在 MIPS 中 每条指令都是 32 位 这是 4 个字节 所以下一条指令将是四个字节之外 举个例子 我说PC地址是128 我的第一个问题是理解这个128意味着什么 我目前的信念
  • 为什么 std::numeric_limits::min() 在使用不同函数流式传输到输出时行为不同?

    我有一个奇怪的行为 std numeric limits
  • 如何在 x86 ASM 中将整数转换为浮点值?

    我需要将一个整数 二进制补码 乘以一个浮点常数 这是我所拥有的 data pi dd 3 14 int dd 0ah code fld pi fmul ST 1 ST 我怎样才能转换int乘以浮点值pi 你需要fild操作说明 这是一个参考
  • 将浮点变量显示为十六进制整数会扰乱相邻整数

    我有这个简单的程序 include
  • iPhone 上的双精度与浮动

    我刚刚听说 iPhone 本身无法进行双倍操作 从而使它们比常规浮动慢得多 这是真的 证据 我对这个问题很感兴趣 因为我的程序需要高精度计算 而且我将不得不在速度上妥协 iPhone 可以在硬件中执行单精度和双精度算术 在 1176 原始
  • 各种 Unice 上 fesetflushtozero() 的等效项

    HP UX的libc有这个功能fesetflushtozero http h21007 www2 hp com portal download files unprot fp manpages fesetflushtozero 3M htm

随机推荐

  • getline() 函数在这里如何工作?

    不明白功能如何getline在这里工作 为什么换行符被排除在 for 循环之外以及为什么要在单独的块中测试换行符是否存在 include
  • 如何正确使用 LogonUser 从工作组客户端模拟域用户

    ASP NET 模拟 VMWare 上的域 https stackoverflow com questions 278132 asp net impersonate against a domain on vmware 这个问题就是我要问的
  • 创建线程之前的 Pthread 亲和性

    在创建线程之前 我需要设置亲和力 线程到核心 例如 第一个线程到第一个核心 就像是KMP AFFINITY in OpenMP 是否可以 编辑 我以这种方式尝试 但不起作用 void DoWork void args int nr int
  • 如何在 JSDoc 中描述解构对象参数

    如果我有一个将对象作为参数的 JavaScript 函数 我可以使用 JSDoc 描述该对象的预期属性 如下所示 param bar param bar baz number param bar qux number function fo
  • 没有MMU的内存保护

    我想知道如何在没有 MMU 支持的情况下保护内存 我尝试用谷歌搜索它 但没有看到任何有价值的论文或研究 那些处理它的人只处理错误 例如未初始化的指针 而不是由于软错误而导致的内存损坏 即由于硬件瞬态故障损坏了写入内存位置的指令 我想知道这一
  • 如何在 Spring hibernate 项目中忽略 json jackson 中的 "handler": {}, "hibernateLazyInitializer": {} ?

    我将 fastxml json 与对象映射器一起使用 下面是我的代码 ObjectMapper mapper new ObjectMapper mapper configure SerializationFeature FAIL ON EM
  • 获取 ORA-01033: ORACLE 初始化或关闭正在进行中

    昨天我在笔记本电脑上安装了 Oracle 12c 企业版 当我尝试通过 SQLPLUS 连接到数据库时 出现以下错误 C Users USER gt sqlplus SQL Plus Release 12 1 0 2 0 Productio
  • 错误 1329:无数据 - 提取、选择或处理零行 - 即使所有操作均正确

    在下面 即使所有操作都正确完成 我也会收到 错误 1329 无数据 提取 选择或处理零行 我的其他功能可以正常工作 几天前这个功能也可以正常工作 BEGIN DECLARE Id INT 10 DEFAULT 0 DECLARE Elm I
  • 检查 X509 证书吊销

    是否可以检查任何 X509 证书是否被吊销 实际上 我制作了一个 Java 应用程序 它只获取常规 https 链接并输出 X509 证书 我想在我的应用程序中添加一项服务来检查该证书是否已被吊销 是否有教程或简单的代码可以指导我做到这一点
  • Python Eve - 使用 objectid 的 where 子句

    我在 settings py 中定义了以下资源 builds item title builds schema sources type list schema type objectid data relation resource so
  • 使用 jersey-spring3 从 JerseyTest 容器中检索托管 bean

    这个问题是上一个问题的后续问题指定自定义应用程序上下文 https stackoverflow com questions 18278769 specify custom application context 我们正在将一些数据服务从使用
  • 启动“com.twitter.android.PostActivity”时出错

    我向 Twitter 调用了共享文本的意图 在不更改代码的情况下 一天又一天 此调用已停止工作 意图是 Intent share new Intent Intent ACTION VIEW share setClassName com tw
  • Azure 中的 REST API 日志

    是否有办法查看通过 REST API 完成的所有请求 我希望能够监视客户端 ID 完成的 REST API 调用 我想了解调用了哪些特定 API 如果可能的话 每个调用的请求 响应是什么样的 只是将其发布在这里以帮助将来的问题发布者 这是您
  • 将类切换绑定到窗口滚动事件

    当用户将浏览器窗口滚动到某个点以下时 我将切换 page div 的类 到目前为止我所做的工作正常 http jsfiddle net eTTZj 29 http jsfiddle net eTTZj 29 div div
  • 插入/删除触发器表上的慢连接

    我们有一个触发器 可以为表创建审计记录并连接inserted and deleted表以查看是否有任何列已更改 连接对于小型集合一直运行良好 但现在我要更新大约 100 万行 并且几天之内就不会完成 我尝试更新具有不同数量级的选定行数 很明
  • Android - 未找到活动异常

    我正在使用 startActivity 调用另一个 Activity 但收到 Activity Not Found Exception 这是我的代码 TextView textView TextView itemClicked String
  • 我想在服务器上 24/7 运行 Python 脚本 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在制作一个模拟虚拟货币股票市场的程序 我还没有尝试过任何东西 但我想要一个Python脚本能够24
  • 数据库时区问题

    我在尝试与数据库 MySQL 建立连接时收到此错误 java sql SQLException 服务器时区值 CEST 无法识别或代表多个时区 如果要利用时区支持 则必须配置服务器或 JDBC 驱动程序 通过 serverTimezone
  • 为什么我的 Mac (OS X 10.7.3) 有旧版本 (2.3) 的 Gnu Bison?

    我的 mac 上的 GNU Bison 版本是 2 3 但我知道 Bison 2 5 很久以前就发布了 这本书弗莱克斯和野牛使用2 5版本 我应该自己升级到2 5吗 有必要吗 2 3和2 5有什么区别 我在 MacOSX 10 9 5 上遇
  • 是否有任何架构使用相同的寄存器空间来进行标量整数和浮点运算?

    我见过的大多数支持本机标量硬件 FP 支持的架构将它们推入完全独立的寄存器空间 与主寄 存器集分开 我见过的大多数支持本机标量硬件 FP 支持的架构将它们推入完全独立的寄存器空间 与主寄 存器集分开 X86 的传统 x87 FPU 使用带有