POPPUR爱换

 找回密码
 注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

搜索
查看: 20526|回复: 190
打印 上一主题 下一主题

Arm vs X86的论文

[复制链接]
头像被屏蔽
跳转到指定楼层
1#
发表于 2013-3-10 13:31 来自手机 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
192#
发表于 2013-3-19 11:13 | 只看该作者
koppie 发表于 2013-3-18 22:05
回到寄存器数量,你知道在Sandy Bridge之前的Intel处理器里面,是完完全全没有物理寄存器的么?ISA是硬件 ...

我是普通的程序员,我更喜欢在实地测试中学习,我只关心结果,无论怎么测试,结果就是x86的寄存器并不敏感,无论你用任何理论上的事情,也改变不了结果,除非你能作证明这个的反例,x86并没有因为寄存器少性能大幅度下降,这个不是什么瓶颈问题。

如果理论部分存在问题,我确实同意这一点,我比较赞同huangpobu的代码,基本上说明了问题,我承认在某些情况下,arm的多寄存器对于循环拆解是有好处的,肯定会有性能提升的,我的例子是证明了现在主流的intel cpu对于寄存器数量并不敏感。

编译部分我还是比较清楚的,包含arm的指令编码都比较熟悉,毕竟从486时代开始玩asm的。
回复 支持 反对

使用道具 举报

191#
发表于 2013-3-19 01:18 | 只看该作者
话说cortex-A9到底几发射啊。。。

量化上说是2发射,我看ARM的PPT里面是4发射,LZ贴的论文里面也指出A9并不像流行观念认为的那样是2发射,说是4发射。。。。
回复 支持 反对

使用道具 举报

190#
发表于 2013-3-18 22:05 | 只看该作者
largewc 发表于 2013-3-18 12:56
能明确说一下具体的哪些吗,我抽空看吧,你说一下我针对性看看吧。

要是说寄存器数量的问题,我不想争 ...

回到寄存器数量,你知道在Sandy Bridge之前的Intel处理器里面,是完完全全没有物理寄存器的么?ISA是硬件和软件的interface,为了长期的兼容性,十年二十年也不会有太大变化。底层的微架构实现却有前差万别,而真正理解性能是必须要了解底层的架构和编译原理的,太想当然了就会得出完全相反的结论。还有寄存器重命名的目的是为了name dependence,跟你理解的是很不一样的

重点看看Interface那本书的第四章和Quantitative的Appendix C和第三章

回复 支持 反对

使用道具 举报

189#
发表于 2013-3-18 12:59 | 只看该作者
Prescott 发表于 2013-3-18 12:45
另外我介绍一下这篇文章的一个结论吧,他们使用跨平台的GCC编译器,编译结果显示x86的平均指令长度的确比 ...

编译器肯定选择短指令啊,问题是谁说复杂指令就长啊……

难道rep指令会比一个for循环更长?肯定不可能的,复杂指令只会缩短代码。复杂指令的典型结果就是汇编级别代码量大幅度下降了。
回复 支持 反对

使用道具 举报

188#
发表于 2013-3-18 12:56 | 只看该作者
koppie 发表于 2013-3-18 12:38
说实话,你的认识误区不小啊,不是几段话能讲明白的。
那我建议你还是花大力气看看这本书的
David Patter ...

能明确说一下具体的哪些吗,我抽空看吧,你说一下我针对性看看吧。

要是说寄存器数量的问题,我不想争论了,反正我无论怎么测试的结果,就是这玩意对性能的影响不是关键点,他会影响到性能,但是不是性能瓶颈点。

你说64bit这个问题,我回去测试一下,64bit可能更快,我测试一下能快多少吧。
回复 支持 反对

使用道具 举报

187#
发表于 2013-3-18 12:45 | 只看该作者
huangpobu 发表于 2013-3-17 14:03
很同意性能没有过剩。我刚刚在Mathematica上跑一个最短路径算法都卡的半死,内存都爆了。

另外我介绍一 ...

另外我介绍一下这篇文章的一个结论吧,他们使用跨平台的GCC编译器,编译结果显示x86的平均指令长度的确比ARM短,因此他们认为编译器倾向于使用X86里面的简单指令。
=================================
这个结论我不能完全同意。应该说x86里边使用频度高的指令比较短(短于ARM定长的32bit)。而不是编译器故意去选择短的指令。
回复 支持 反对

使用道具 举报

186#
发表于 2013-3-18 12:38 | 只看该作者
本帖最后由 koppie 于 2013-3-18 12:40 编辑
largewc 发表于 2013-3-18 12:26
arm isa也算比较熟悉了,mips不熟悉。

我承认对硬件实现确实不熟悉,毕竟不是做这个的。
说实话,你的认识误区不小啊,不是几段话能讲明白的。
那我建议你还是花大力气看看这本书的
David Patterson:
computer organization and design: the hardware/software interface
搞性能优化,或者ISA层面的东西,是绝对要了解底层架构的
我保准你看完这本书就有颠覆性的认识了,绝对值得。另外一本computer architecture: a quantitative approach深一些。不过也可以看,最新版的要先看附录ABC
回复 支持 反对

使用道具 举报

185#
发表于 2013-3-18 12:26 | 只看该作者
koppie 发表于 2013-3-18 12:21
我觉得你对x86 ISA很了解,但是却不太懂什么是pipeline什么是ILP,硬件上是如何实现的,有些东西跟想象的 ...

arm isa也算比较熟悉了,mips不熟悉。

我承认对硬件实现确实不熟悉,毕竟不是做这个的。

我只从自己的角度看待这个事情吧,对pipeline和ILP都是自己的角度的理解,有问题一起讨论一下吧。

不战斗了,多讨论才能提升不是吗。
回复 支持 反对

使用道具 举报

184#
发表于 2013-3-18 12:21 | 只看该作者
largewc 发表于 2013-3-17 11:19
我觉得,局部性才能测试出绝对情况的,就是专门测试大量某些特定的指令。

x86做了足够的优化,早期移 ...

我觉得你对x86 ISA很了解,但是却不太懂什么是pipeline什么是ILP,硬件上是如何实现的,有些东西跟想象的是完全不一样的。

另外,64bit编译器编译的程序比32bit快,因为x86-64扩展里面有8个寄存器在IA32下是不可用的
回复 支持 反对

使用道具 举报

183#
发表于 2013-3-18 11:38 来自手机 | 只看该作者
PS5 发表于 2013-3-17 15:50
GPU是几发射的?

GPU以前的一个流处理器是一次发射一个线程的指令,但是这个指令是SIMD指令,所以和CPU的单发射还是不同的,何况还有很多流处理器。

Fermi开始引入了能够一次发射两个线程的改进流处理器,全GPU有16个这样的处理器,所以相当于一次发射32线程了
回复 支持 反对

使用道具 举报

182#
发表于 2013-3-18 11:15 来自手机 | 只看该作者
本帖最后由 huangpobu 于 2013-3-18 11:52 编辑
largewc 发表于 2013-3-17 14:15
应该不会,x86指令短跟简单指令完全没关系。

具体说一下吧,比如说arm

等等我回去贴一下论文里面的数据吧
回复 支持 反对

使用道具 举报

181#
发表于 2013-3-18 02:09 | 只看该作者
huangpobu 发表于 2013-3-15 09:43
ILP Wall啊

能发掘的指令级并行性越来越少,而且多发射的开销是随着发射宽度的提高而指数级增长的,90 ...

谢谢大虾指教,我原来一直错误的以为发射宽度和晶体管面积是线性关系。
回复 支持 反对

使用道具 举报

180#
发表于 2013-3-18 02:07 | 只看该作者
koppie 发表于 2013-3-15 10:04
指令级并行ILP是有上限的,有些依赖关系是不可能完全消除的。六发射至少多一倍资源和功耗,但是性能却提高 ...

谢谢大虾指教!
回复 支持 反对

使用道具 举报

179#
发表于 2013-3-17 19:29 来自手机 | 只看该作者
largewc 发表于 2013-3-17 16:29
这货相当于单发射的……甚至频率都不用太高,它只要并行数量足够多就够了。

频率虽然不高
但是核心多啊
回复 支持 反对

使用道具 举报

178#
发表于 2013-3-17 16:29 | 只看该作者
PS5 发表于 2013-3-17 15:50
GPU是几发射的?

这货相当于单发射的……甚至频率都不用太高,它只要并行数量足够多就够了。
回复 支持 反对

使用道具 举报

177#
发表于 2013-3-17 15:50 来自手机 | 只看该作者
GPU是几发射的?
回复 支持 反对

使用道具 举报

176#
发表于 2013-3-17 14:15 | 只看该作者
本帖最后由 largewc 于 2013-3-17 14:24 编辑
huangpobu 发表于 2013-3-17 14:03
很同意性能没有过剩。我刚刚在Mathematica上跑一个最短路径算法都卡的半死,内存都爆了。

另外我介绍一 ...


应该不会,x86指令短跟简单指令完全没关系。

具体说一下吧,比如说arm

ldr r0,r3,0xXX,无论这个xx是多少,这个指令都是32bit。如果xx超过一个长度,也可能会被变成两条或者三条到四条指令,之前我说过,不用thumb-2,mov 32bit最长需要三条指令。所以这个指令总长度在32bit-128bit之间。

对于x86,mov,[ebp+xx],跟据xx的长度不同,这个指令可能是两个字节,可能是三个字节,可能是四个字皆,可能是6个字节,也就是16bit-48bit之间。

比如更多的add eax,[ebp+xx],用x86则更短,单条指令16-48bit就ok了,arm需要增加额外的32bit


上面那个例子,编译器在x86上一定结果是add eax,[ebp+xx],而不是mov ebx,[ebp+xx],add eax,abx这种类似arm代码框架的结果的。

x86指令短是肯定的,因为动长指令和更丰富的指令集,如果x86也改用简单指令,其实编译结果会变长的,而不是变短。

浮点为啥x86长,是因为x86的浮点是不能操作寄存器的,只能通过图灵机的压栈出栈操作,这玩意很浪费指令长度,不过考虑到浮点的运算周期很长,所以压栈退栈对于性能的影响并不高,所以没有整数那么敏感。

具体就是x86的浮点没有 mul aaa,bbb这种操作,而是 push bbb; push aaa; mul;这种,而浮点也不能压缩,肯定至少要浪费4字节,所以动长没有意义,最后指令比arm更长是很有可能的。
回复 支持 反对

使用道具 举报

175#
发表于 2013-3-17 14:03 | 只看该作者
largewc 发表于 2013-3-17 11:19
我觉得,局部性才能测试出绝对情况的,就是专门测试大量某些特定的指令。

x86做了足够的优化,早期移 ...

很同意性能没有过剩。我刚刚在Mathematica上跑一个最短路径算法都卡的半死,内存都爆了。

另外我介绍一下这篇文章的一个结论吧,他们使用跨平台的GCC编译器,编译结果显示x86的平均指令长度的确比ARM短,因此他们认为编译器倾向于使用X86里面的简单指令。

在浮点测试里面,编译器才开始使用一些复杂的特殊指令,导致指令长度抬高。
回复 支持 反对

使用道具 举报

174#
发表于 2013-3-17 11:19 | 只看该作者
本帖最后由 largewc 于 2013-3-17 11:30 编辑
huangpobu 发表于 2013-3-16 23:21
我是半路出家的渣渣呀,一点儿都不精通汇编 :)

我觉得我们可以合力做一些更加深入的测试,因为我之前 ...


我觉得,局部性才能测试出绝对情况的,就是专门测试大量某些特定的指令。

x86做了足够的优化,早期移位跟乘法差距很大的,但是后期的cpu,应该做了特殊处理了。

做x86优化,典型的一个发展就是,很多以前p2需要优化的地方,到了core,都不需要了,比如说乱序,比如说移位,比如说最近的内存改为寄存器操作。

x86就是一个为了性能,可以对任何情况可以优化的设计,它为了性能可以无限堆积晶体管……。



我非常讨厌说x86时risc化的过程,显然并不完全如此,现在的编译器,显然在x86上,是cisc指令化优化得更好了,而不是更差了,没有编译器有把编译结果risc的趋势。我的观点还是,除去x86本身寄存器只有9个,比arm少7个这个先天缺点,x86是包含了所有简单指令的,arm的所有指令集对于x86只是一个子集而已,x86是完全可以risc化的,显然从编译器的结果来看,最终仍然是cisc的,因为cisc指令仍然对性能有巨大的贡献。


我同意这个文章的一个结论,就是x86就是为性能优化的一种方案,它对功耗没有那么敏感,个人用计算机,历史证明,对性能更加敏感,所以x86胜出了。现在pc陷入停滞,很大的问题就是构架无法提升,性能已经无法再大规模提升了,对于整个软件业,陷入停滞了。

性能根本没有过剩,单核性能如果能继续提升,对于整个软件业的价值仍然是巨大的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

广告投放或合作|网站地图|处罚通告|

GMT+8, 2025-2-3 01:33

Powered by Discuz! X3.4

© 2001-2017 POPPUR.

快速回复 返回顶部 返回列表