Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >在程序集级别,64寄存器还是三个操作数指令中,哪一个更有用?

在程序集级别,64寄存器还是三个操作数指令中,哪一个更有用?
EN

Stack Overflow用户
提问于 2016-05-17 03:16:51
回答 2查看 364关注 0票数 6

这个问题是在为16位自制CPU编写C编译器的背景下提出的。

我有12位操作数用于ALU指令(如ADD、SUB等)。

我可以从16个寄存器中发出三个操作数,或者从64个寄存器中发出两个操作数。

例如:

代码语言:javascript
代码运行次数:0
复制
SUB A <- B - C  (registers r0-r15)

vs

代码语言:javascript
代码运行次数:0
复制
SUB A <- A - B  (registers r0-r63)

对于C编译器及其作者来说,有三个操作数指令的16个寄存器比有两个操作数指令的64个寄存器更有用吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-17 07:44:40

使用非破坏性3操作数指令的16寄存器可能更好。

但是,您还应该考虑使用这些指令位执行其他有趣的操作。对于自制软件,您可能不关心为将来的扩展保留任何内容,也不想添加大量额外的操作码(就像PPC那样)

ARM采用了一种有趣的方法,让每个指令有一个操作数通过桶形移位器,因此每条指令都是免费的“移位和任何”指令。即使在“拇指”模式下也支持这一点,其中最常见的指令只有16位。(ARM模式有传统的RISC 32位固定指令大小。它将其中的4个比特用于对每条指令进行预测执行。)

我记得我看到了一项关于在理论架构中将寄存器数量增加一倍的额外收益的研究,比如SPECint之类的。8->16可能是5%或10%,16->32只是一对夫妇,32->64甚至更小。

因此,16个整数寄存器在大多数情况下都是“足够”的,除非您经常使用int32_t,因为每个这样的值都需要两个16位寄存器。x86-64只有16个GP寄存器,而且大多数函数都可以将它们的状态保持在相当舒适的寄存器中。即使在进行函数调用的循环中,ABI中也有足够的调用保留寄存器,因此泄漏/重新加载通常不必发生在循环中。

3-操作数指令在代码大小和指令计数方面的增加将大于避免偶尔发生溢出/重新装载的情况。gcc的输出必须时刻保持mov,并使用lea作为一个非破坏性的加/移。

如果您想优化您的CPU软件流水线以隐藏内存加载延迟(它比完全无序的执行更简单。),更多的寄存器是很好的,尤其是。如果您没有注册重命名。但是,我不知道静态指令调度有多好的编译器。这不再是一个热门话题,因为所有高性能CPU都是无序的.(OTOH,很多人们实际使用的软件都运行在智能手机的有序ARM CPU上。)我没有经验试图让编译器对顺序CPU进行优化,所以IDK依赖于它是多么的可行。

如果您的CPU非常简单,在负载处于正常运行状态时,它不能做任何其他事情,那么这可能并不重要。(这真的是手摇,因为我对简单设计的实用性还不太了解。即使是“简单”的顺序现代CPU也是流水线的。)

64寄存器正在进入“太多”的领域,在那里保存/恢复它们需要大量代码。内存的数量可能仍然可以忽略不计,但由于无法循环寄存器,因此需要64个指令。

如果您正在从头开始设计ISA,将查看 Agner Fog的CRISC提案 和由此产生的讨论。您的目标非常不同(高性能/功率预算64位CPU与简单16位CPU),因此您的ISAs当然会有很大的不同。然而,讨论可能会让你想到你没有考虑过的事情,或者你想尝试的想法。

票数 4
EN

Stack Overflow用户

发布于 2016-05-17 07:17:19

关于寄存器的数量,一般来说,当只有16个通用寄存器可用时,大多数C都可以编译成高效的机器代码(比如AMD64)。然而,有几个寄存器专门用于函数参数和一些标记为易失性可能是有益的-这意味着它们可以在任何函数中使用,但可能被任何被调用的函数破坏。增加到32个寄存器可能是有益的,但如果你有64个普通16位CPU的通用寄存器,我怀疑会有很大的改善。无论如何,您必须将在C函数中使用的大多数寄存器的原始内容保存到堆栈中。限制一个函数同时只使用7个寄存器(而不是37个)对C编译器来说仍然更有效(堆栈),即使有更多的寄存器可用。

这在很大程度上取决于您将要使用的C 呼叫约定。哪些寄存器将用于将值从调用方传递给被调用方,哪些寄存器被认为是易失性的,从堆栈推到/弹出的成本是多少,等等。通过使用寄存器窗口来管理您的寄存器和跨函数调用的堆栈使用情况,您可能会赢得更多。例如,Sun Sparc有一个完全为“本地”寄存器的寄存器窗口,与调用方共享的8个寄存器和将与任何被调用函数共享的8个寄存器。(此外,还可以处理8个全球登记册。)这样您就不用担心推到堆栈了,每次函数调用总是有一个16个寄存器的单独推送来改变执行指针,每次返回都会有一个16个寄存器弹出。英特尔ia64有一些类似的东西,但具有可配置的寄存器窗口大小。

但是,当保存中间结果非常重要(需要经常保存A)时,SUB C,A,B只比SUB A,B有一点优势,注册副本的简单寄存器非常昂贵。在大多数情况下,这似乎不太可能。

你会使用单独的浮点或固定点寄存器吗?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37274571

复制
相关文章
JSON序列化 反序列化 自定义属性字段
FastJson中的注解@JSONField,一般作用在get/set方法上面,常用的使用场景有下面三个: 修改和json字符串的字段映射【name】 格式化数据【format】 过滤掉不需要序列化的字段【serialize】
Qwe7
2022/04/02
1.1K0
Logstash为什么那么慢?—— json序列化
今天跟峡谷金桥聊天,询问起Logstash的性能,金桥提示说Logstash中json的序列化是浪费性能的一方面。于是便有了下面的测试: 第一步,造数据 首先需要造一份数据,数据可以通过logstash的generator来造。 input{ generator{} } output{ file{ path => "E:/test.log" } } 生成的数据格式如下: {"message":"Hello world!","@version":"1","@tim
用户1154259
2018/01/17
1.3K0
Logstash为什么那么慢?—— json序列化
在MVC中使用Json.Net序列化和反序列化Json对象
在.Net的MVC开发中,经常会使用到Json对象,于是,系统提供了JsonResult这个对象,其本质是调用.Net系统自带的Json序列化类JavaScriptSerializer对数据对象进行序列化。但是这个系统自带的Json序列化对象方法没有Json.Net好用,于是打算有些时候用Json.Net替代默认的实现。
深蓝studyzy
2022/06/16
1.2K0
Json序列化在golang中的应用
golang对json序列化和反序列化的操作实在是难受,所以说用习惯了高级语言特性,再转到这些偏原生的写法上就会很难受。
happlyfox
2021/03/25
2.2K0
spring/jackson:实现对保存JSON字符串的字段自动序列化和反序列化
对于spring-web项目,在数据库设计时,当我们想增加一个字段时,并不希望修改表结构,希望设计一个专用的扩展字段,将增加的扩展字段以一个JSON字符串形式保存在这个专用字段中。 spring对JSON的序列化和反序列化是依赖jackson来完成的。 数据发送给前端的时候,我们希望jackson在序列化一个数据库记录对象时以JSON的形式返回这个JSON扩展字段的内容,而不是一个String, 同时前端也能以一个JSON的形式定义这个JSON扩展字段,服务端在收到请求jackson在反序列化时能自动将这个JSON字段反序列化为String.这样省去了手工写代码转换的过程才是最方便的。 举例说明一下吧,以下是一个数据库记录对象,props字段为一个JSON扩展字段可以存储任意字段数据
10km
2022/09/07
1.8K0
在eclipse中没有server(需在选项中设置)
①在软件eclipse下的Help->InstallNew Software->中,在Work with中点击Add,如下,加入
全栈程序员站长
2022/07/25
3.9K0
在eclipse中没有server(需在选项中设置)
Flask 学习-37.Flask-RESTful 序列化输出fields 字段设置
前言 前面一篇使用Flask-RESTful 已经实现查询对象的序列化输出成json,这篇继续讲下一些特殊字段的处理 模型 user 表结构设计 from . import db from passlib.hash import sha256_crypt from datetime import datetime class Users(db.Model): __tablename__ = 'user' # 数据库表名 id = db.Column(db.Integer, primary
上海-悠悠
2022/09/06
9590
Flask 学习-37.Flask-RESTful 序列化输出fields 字段设置
jackson 序列化忽略未知字段: How to Ignore Unknown Properties While Parsing JSON in Java
使用 Jackson API 在Java中解析JSON时的一个常见问题是,当JSON包含未知属性时,即Java类没有与所有JSON属性对应的所有字段时,解析失败。
一个会写诗的程序员
2021/07/23
3.8K0
Golang -- Json序列化
在使用Go Struct的Json Marshal的时候,通过Json To Go Struct工具可以生成结构体,但是当在结构体中只对部分属性赋值的时候,Marshal后的字符串与预期不符,如下所示:
None_Ling
2021/11/24
7650
Python json序列化
Python内置的json模块提供了非常完善的对象到JSON格式的转换。废话不多说,我们先看看如何把Python对象变成一个JSON:
py3study
2020/01/16
2.2K0
Python序列化-json
Python 序列化是将 Python 对象转换为可以存储或传输的格式,如 JSON 或二进制格式。
玖叁叁
2023/04/18
7070
在 .NET 对象和 JSON 互相序列化的时候,枚举类型如何设置成字符串序列化,而不是整型?
默认情况下,Newtonsoft.Json 库序列化和反序列化 JSON 到 .NET 类型的时候,对于枚举值,使用的是整数。然而,在公开 JSON 格式的 API 时,整数会让 API 不易于理解,也不利于扩展和兼容。
walterlv
2023/10/22
7590
MySQL中的json字段
MySQL5.7.8中引入了json字段,这种类型的字段使用的频率比较低,但是在实际操作中,有些业务仍然在用,我们以此为例,介绍下json字段的操作方法:
AsiaYe
2019/12/23
9.1K0
Requests库(二十)为什么请求的json字段传入dict格式才正确而不是json格式
Requests库(十三)利用钉钉机器人打造一个钉钉群定时推送今日头条24小时热闻
雷子
2021/03/15
9550
Retrofit 在 JSON 反序列化的时候提示 UnrecognizedPropertyException 异常
这是因为 retrofit 在反序列化的时候,如果没有找到对应的对象名,将会报错。
HoneyMoose
2023/04/25
5170
Retrofit 在 JSON 反序列化的时候提示 UnrecognizedPropertyException 异常
[C#]JSON反序列化对象--解析JSON文本
This sample deserializes JSON to an object.
科控物联
2022/06/13
1.2K0
[C#]JSON反序列化对象--解析JSON文本
​MySql之json_extract函数处理json字段
在db中存储json格式的数据,相信大家都或多或少的使用过,那么在查询这个json结构中的数据时,有什么好的方法么?取出String之后再代码中进行解析?
一灰灰blog
2022/05/30
13.8K0
python序列化:json,pickl
什么是序列化,把程序中的对象或者变量,从内存中转换为可存储或可传输的过程称为序列化。在 Python 中,这个过程称为 pickling,在其他语言中也被称为 serialization,marshalling,flattening 等。程序中的对象(或者变量)在序列化之后,就可以直接存放到存储设备上,或者直接发送到网络上进行传输。
py3study
2020/01/14
9350
Springboot2.0 + Kotlin自定义json序列化不返回null字段的方法
两种方式: 第一种,在配置文件里加入如下配置: spring: jackson: default-property-inclusion: non_null 第二种:在mvc配置文件里加入如下配置: override fun extendMessageConverters(converters: MutableList<HttpMessageConverter<*>>) { converters.forEach { if (it is MappingJackson2HttpMessa
飞奔去旅行
2019/06/13
1.9K0
JSON序列化接口,JsonSerializable
php中操作json的函数有json_encode(),json_decode()
宣言言言
2019/12/18
1.7K0

相似问题

忽略JSON反序列化过程中的字段

21

(反)创建模型时自动序列化包含JSON的字段

21

在json序列化过程中自动忽略实体的@瞬态字段

20

自定义Json (反)序列化?

10

(反)将类序列化到JSON或从JSON序列化

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档