Agner:AMD Ryzen 架构及指令输出、延迟测试结果
首页 > 观测 > 数码科技    作者:剧毒术士马文   2017年5月3日 16:23 星期三   热度:3142°   3条评论    
时间:2017-5-3 16:23   热度:3142° 

Anger是著名第三方X86_64处理器优化指南的作者。

The microarchitecture of Intel, AMD and VIA CPUs
An optimization guide for assembly programmers and compiler makers
By Agner Fog. Technical University of Denmark.




AMD的Ryzen处理器采用了全新设计的CPU微架构,属于第一代“Zen”架构处理器。不得不说新架构的设计相当成功,使得AMD在落后这么多年后再次能与Intel竞争。


Ryzen的micro-operation cache 微指令缓存容量为2048条micro-op或指令。对多数程序关键的最内层循环是足够的。很多人讨论Ryzen每周期到底能执行4条还是6条指令,因为AMD的文档也没有明说。不过根据我的测试显示,既不是4条也不是6条,而是5条。只要代码是从微指令缓存运行的,每周期就能执行5条指令,而Intel只能执行4条。无法放入微指令缓存的代码则通过传统的code cache代码缓存,每周期最大可执行4条指令。

然而从代码缓存提取指令的比率不是部分文档记载的32字节/周期,而是在16字节/周期左右。我目前看到的最多为17.3字节/周期【SMT?】。由于大多数向量化代码长度都在4字节以上,可能会有瓶颈。


1条比较指令和1条条件转移指令可以融合为一条微指令。所以在执行小循环的时候,每次循环是有可能达到6条指令/周期的。除小循环之外,1条执行转移的转移指令需要两个周期,不执行转移的每周期则可以执行2条。


256bit 向量指令(AVX指令)会被拆分为2条128bit的微指令。AVX指令在微指令缓存中只占1项。还有其他一些指令也会生成2条微指令。在解码器之后微指令队列的最大吞吐量为每周期6条微指令。这个队列出来的微指令流会分到10条管线:4条使用通用寄存器的整数操作管线(ALU),4条浮点/向量操作管线,以及2AGU。如果将整数和向量指令混合,就可能达到6条指令/周期的吞吐量




让我们比较一下Ryzen和Intel处理器的执行单元。Zen架构有4个128bit 浮点/向量单元,2ADD+2MUL。而Intel有2个256bit单元,既可以作ADD也可以作MUL。这意味着带最多128bit向量(AVX)的浮点代码在Zen上每周期最多可执行4条(2ADD+2MUL),而Intel只能执行2条。到了256bit向量(AVX2),AMD和Intel每周期都是2条。Intel在256bit融合乘加指令(FMA)上要强过AMD,因为Zen每周期只能执行1条,Intel可执行2条。在256bit内存写入上Intel也要强于AMD,因为Intel有1个256bit内存写入端口,AMD只有1个128bit。马上Intel处理器就将支持512bit向量,AMD可能要更长时间。


然而市场上绝大多数软件的更新速度要落后硬件好几年。如果软件只使用128bit向量,Ryzen的性能会相当不错,AMD每周期可执行6条微指令,而Intel只能做4条。不过每周期执行这么多指令就会带来问题:如果第二条指令依赖于第一条指令的结果,这两条指令就不可能同时执行。为了避免这类情况,处理器的高吞吐量就给程序员和编译器带来了更多压力。想达到最大吞吐量就必须同时执行大量独立指令。




所以我们有了同步多线程SMT。在同一个CPU核心上可以同时运行2个线程(Intel称之为HT超线程)。每个线程会得到一半的资源。如果CPU核心的容量高于单个线程可以利用的范围,运行2个线程就有道理。在Ryzen上的SMT带来的整体性能提升比Intel处理器高得多,因为Zen核心的吞吐量要更高,高于之前所有的AMD和Intel处理器(除了256bit向量)。


Ryzen的节能非常激进。未使用的单元被时钟门控,频率也根据负载和温度大幅变化。在我的测试中,磁盘读写为瓶颈时频率可以低至标称频率的8%,而运行连续的CPU密集型长代码时频率可以高至标称频率的114%。由于温度原因,这样的高频率在八核全开时不可能达到。




不断变化的主频对于我的性能测试是一个大问题,因为不可能测量出精确且可重复得出的计算耗时。先用连续的CPU密集型代码预热处理器会带来一点帮助,但得到的频率依然不够精确。时间戳计数器TSC用来测量少量代码的运行时间,它在Zen上却是根据标称频率测量的。Ryzen有另一个计数器,称为Actual Performance Frequency Clock Counter (APERF) ,类似于Intel处理器的Core Clock Counter。不幸的是APERF计数器只在内核模式才能读取,而TSC在用户模式就可通过测试程序读取。我不得不用如下方式计算实际频率:运行完一次测试立即用驱动读取TSC和APERF的计数。用这种方法获得的TSC和APERF计数被用来校正测试中读得的TSC计数。这个方法很尴尬,结果却很精确(除了频率大幅变化的测试)。


AMD处理拓展指令集的方式与Intel不同。AMD一直在不断增加新指令,如果没多少人用就把它们移除;Intel则一直在保持对旧指令的支持。AMD在推土机上引入了FMA4和XOP指令,还有打桩机上一些并非特别有用的TBM指令。现在他们把这些都移除了,XOP和TBM在Ryzen上不再受支持。FMA4官方宣称不支持,但我发现FMA4实际上在Ryzen上工作正常(即便CPUID指令也显示不支持FMA4)。



【官方GDC文档】





via:http://agner.org/optimize/blog/read.php?i=838

本站编译,转载请注明出处。




附:从手册中节选的部分内容



浮点执行管线


QQ截图20170503010454.png

QQ截图20170503010504.png


AVX指令

QQ截图20170503010532.png


Zen内核

QQ截图20170503010342.png



Ryzen的瓶颈



QQ截图20170503173006.png

QQ截图20170503173016.png




以及Agner对Ryzen的指令吞吐量、延迟等做的全面测试表格:



QQ截图20170503171956.png

QQ截图20170503172047.png

QQ截图20170503172114.png

QQ截图20170503172144.png

QQ截图20170503172204.png

QQ截图20170503172226.png

QQ截图20170503172243.png

QQ截图20170503172305.png

QQ截图20170503172321.png

QQ截图20170503172335.png

QQ截图20170503172348.png

QQ截图20170503172408.png

QQ截图20170503172420.png

QQ截图20170503172434.png

QQ截图20170503172449.png

QQ截图20170503172500.png


二维码加载中...
本文作者:剧毒术士马文      文章标题: Agner:AMD Ryzen 架构及指令输出、延迟测试结果
本文地址:http://mykancolle.com/?post=1805
声明:若无注明,本文皆为“MoePC”原创,转载请保留文章出处。

WRITTEN BY

avatar
轮子妈Google Chrome 48.0.2564.116Windows 72017-06-21 19:16
Agner的CPUID mask教程是我最喜欢的部分。
可以把牙膏厂CPU伪装成农企的。
ayuGoogle Chrome 40.0.2214.89Linux2017-06-21 18:26
这篇技术文是我最喜欢的,反复看了好几遍了。
剧毒术士马文Google Chrome 59.0.3071.104Windows 102017-06-21 19:07
@ayu:到原作者的博客里看,还有更多
比如Knights Landing、Bulldozer、SandyBridge之类
指出的Bulldozer的缺点正是后来Steamroller、Excavator改进的地方

返回顶部    首页     管理   注册   
版权声明       pw:mykancolle.com或moepc.net (有时需加www.) 若被菊爆请留言补档
内容来源于网络,并不代表本站赞同其观点和对其真实性负责。
如涉及作品内容、版权和其它问题,请在30日内与本站联系,我们将在第一时间删除内容。
本站资源仅为个人学习测试使用,请在下载后24小时内删除,不得用于商业用途,否则后果自负,请支持正版!
illust:A-Channel/生徒会の一存 Foreign visitors, GoogleTranslate will help   sitemap