|
本帖最后由 itany 于 2012-9-15 12:02 编辑
在矢量方面,看Haswell的执行资源,可以知道,在0、5发射口上可以执行(浮点)矢量指令。这个从Conroe开始就是如此了。相对于通过增加ALU提高整数性能,在浮点方面,Intel选择增加SIMD指令的操作数数量来提高浮点预算的吞吐量。在Sandy Bridge,Intel引进了AVX指令,操作数256位,可以包含4个双精度浮点数(DP flops),加上每周期两条指令,形成每周期8DP的运算能力。在Haswell,通过引进加乘(FMA)操作,使得每个指令能运行一次加法和一次乘法,运算能力再次加倍到16DP。
这个是理论性能。从实际来看,从SSE到AVX,增加的是操作数数量,既然能通过循环展开等优化到2个操作数的SIMD,当然也很容易优化到4个操作数乃至Xeon PHY的8个操作数指令。然而加乘操作需要对加法和乘法进行配平和合并。在算法加法比乘法多得多,或者乘法比加法多得多的情况下,是难以大量使用加乘的;同样的,在加法和乘法无法集中交叉进行的算法里边,也是难以实现的。因而,实际的性能提升,会比引入AVX小。
随着矢量单元宽度的扩展,对于数据吞吐量也提出了新的要求。Nehalem有的L1缓存有一个16字节的读取口和一个16字节的会写口;在Sandy Bridge增加为两个16字节的读取口和一个16字节的回写口。和两个AGU相匹配,在执行AVX的内存读写的时候,可以将两个读取口拼成一个32字节的口,这样每周期能完成该一个读取,两个周期完成一个回写。显然这个带宽,对于需要密集内存访问的情况是一个瓶颈。在Haswell里边,将带宽加倍,做成两个32字节的读取口和一个32字节的回写口,这样一个周期可以完成两个AVX读取和一个回写操作。值得注意的是,由于Sandy Bridge是加了一个口,所以对于算术指令也增加了每周期一个读取;而对于Haswell来说,加宽带宽对算术指令没有影响。
同时增大的还有L2缓存的贷带宽,从32字节增加到64字节。
Haswell还消除了L1缓存的缓存组(bank,翻译成“组”不知道是不是靠谱)冲突。缓存是划分成组的,每组有专门的读写电路。在单个线程访问的时候不存在问题,但是当两个线程或者更多同时访问一个组的时候,由于无法同时提供服务,就会出现阻塞。按照我个人的理解:在GPU里边出现类似的问题要通过编程作者和编译器来解决,但是在CPU里边,缓存是硬件控制的,完全可能会把不同线程访问的内存地址映射到一个组里边,还是需要硬件来解决。Haswell的缓存算法应该进行了相应的改进。对超线程会有一定的帮助。
缓存的访问和更替的基本单位都是行。随着AVX指令的操作数拉长,跨越缓存行的情况可能会增加。显然,在未优化的情况下,会需要两倍的操作,会影响性能。Haswell对此进行了优化。
为了支撑CPU核心的吞吐量增长,不属于CPU核心,而属于整个CPU的L3缓存性能也有一定的提高。在Haswell中,数据访问和其他访问进行了分离,采用不同的流水线进行处理。对于不同核心共享的系统资源,如系统代理(System Agent,就是原来的北桥),改善了信用管理机制,使得系统代理的负载能够在不同的核心之间更好的分配。提高了系统内存写入的吞吐量,增加了内存写入队列的深度,可以更好的进行调度。
总体而言,从吞吐量而言,Haswell的核心相对于Sandy Bridge增加了一倍,而CPU整体的存储带宽也有所增加。而从延迟来看,AVX乘法的延迟是5个周期,加法是3个周期,而FMA的延迟是5个周期。意味着使用FMA能将延迟降低40%,对提高性能也有好处。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|