本帖最后由 chungexcy 于 2015-12-5 12:57 编辑
5日增加 i5 4570R L4 128MB 的四缓带宽测试。
测得L4在 4570r(主频3.0g,ring 2.7g)下,最大带宽为42.67GB。小于L4自身的50GB,ring限制了。(网上4770R ring 3.2g能达到50gb)。
=============================================
今天没事测了一下不同程序对内存 浮点带宽的测试。
测试硬件是5200u,2x8g 1600MHz CL11双通道内存。
关闭睿频,在2.2g,1.6g,0.8g下,分别试了一下单线程,双线程,四线程能用到多少内存带宽。
测试方法采用不同的矩阵乘法优化。
⒈ 起关键作用的内存大约为13M,大于三级缓存的两倍就够了。每项测试成绩相当于重复13M的读取和计算,共2560次的时间来换算。
⒉ 其中的绝大部分计算,就是读一次内存,做一次乘法,再做一次加法,不断重复而已、。不要看内存操作只占1/3,这样效率其实已经很低了,我这里只是为了测试内存故意这样做的。实际情况下,对内存操作一般小于这个比例很多。如果为了优化这个程序,性能还能翻7倍(让一缓都不成为瓶颈),不过这就不是测试内存了。
⒊ 我还用了不同的指令集来加速计算部分(乘法和加法),以及看看cpu的指令层面的并行能力和超线程能力。结论挺有趣的。
⒋ 虽然与这个测试无关,但提一下还可以通过控制数据量大小,测试不同的缓存性能。试过了和aida64的结果差不多。
一、单线程下的内存带宽。
这里试了无SIMD加速(Native),SSE,AVX,FMA。其中4路简单理解为:告诉CPU可以进行乱序并发。
1. 先说单线程下的内存带宽:
在Native下,带宽只有5.5g,而如果采用sse或者avx,就能大幅提高运行效率。当内存带宽不是瓶颈时,比如cpu低频状态,sse是native的4倍。带宽基本和频率成正比,因为现在还没到内存带宽上限。
2. 看一下测试结果:
2.2g
1.6g和0.8g
<->
说一下在Native和4路Native,瓶颈在cpu。
比如4路Native 的SIMD boost = 1.256,代表CPU一个周期内,做了0.628次的加法和0.628次的乘法,再加上没算进去的0.628次内存读取。这样算下来一个周期CPU就做了1.884次操作。这就是CPU所谓的超标量。
二、对比一下不同线程下的利用率。
由于我用的是双核四线程,我分别在2.2g,1.6g,0.8g下,测试了单线程,双线程,四线程。只保留了Native、4路Native、SSE、AVX的结果。每组连续4次,取中间两次为有效结果,因为我同时开有点时间差,就多加前后两次消去影响。(见后面)
结论如下
1. 先说一下带宽。
2.2g下,双线程最多用到了21.2g的带宽,和aida64基本一致,所以我认为我的测试没有问题。1.6g也有18.46G带宽。0.8g最大就只有10.4g了。4线程下,如果已经到了瓶颈,多余的线程反而会有所拖累。
2. 再说一下SIMD。
关于不同的优化的差距这一点。如果没有用上SIMD,内存是很难成为瓶颈的。用上了SIMD以后,CPU的执行时间大幅减少,而数据读取的需求基本不变,所以内存带宽一下就上来了,即使是单线程,也能用到16g,现在已经有点瓶颈了,如果CPU频率不是2.2这么低,甚至有可能一个线程就占满带宽,这样多线程根本不会带来太大提升。
3. 最后说一下超线程。
如果已经饱和,超线程是没作用的;如果CPU空闲很大,超线程提升非常可观。
单路Native 单线程:SIMD 0.665 -> IPC: 0.998
单路Native 超线程:SIMD 0.644 *2 -> IPC: 1.932
四路Native 单线程:SIMD 1.28 -> IPC: 1.92
四路Native 超线程:SIMD 0.644 *2 -> IPC: 1.933
三、最后只是再帖一下完整的测试数据,结论之前已经解读了。有兴趣的倒是可以一看。
单线程:
2.2
1.6
0.8
双线程
2.2g
1.6g
0.8g
四线程
2.2g
1.6g
0.8g
|