作者jk21234 ( 1569 11 /47)
站内PC_Shopping
标题Re: [转录][闲聊]内存定址速度,好像大家都不关心?
时间Sat Mar 19 21:58:51 2011
讲到软体对记忆体系统的最佳化就是来钓我的..........
※ 引述《RisingForce (DD)》之铭言:
: ※ [本文转录自 C_and_CPP 看板 #1DX4728p ]
: 作者: DrStein (啤酒肚) 看板: C_and_CPP
: 标题: [闲聊]内存定址速度,好像大家都不关心?
: 时间: Sat Mar 19 13:40:15 2011
不是不关心,而是内存(RAM)到缓存(cache)的速度,
啊...实际上就等於记忆体控制器如何去存取DRAM的速度.
对程式设计者来说黑箱的因素太大.最佳化比较单纯的
RAM种类如SRAM,1T-SRAM,RAMBUS DRAM(不算太单纯但比SDRAM好)
不是主记忆体的主流,而自JEDEC SDRAM以降的体系(包含到目前的DDR2/DDR3)
由於是持续演进的,它的存取规则与cycle的关系虽然可以预期在哪个范围,
可是很难计算出怎麽样的位址间隔对它是最佳化的存取顺序.
再说就算固定变成成同一个记忆体控制器上好了(意思是,同一颗北桥晶片或者是
同一颗cpu...),记忆体组态不同,使用者插1GBx2双通道,1GBx2但是单通道,2GBx2,
2GB+1GB,512MBx4等等.这些不同的实体组态会导致记忆体控制器的Bank Open/Close
的policy都不同,最佳化的存取顺序也不同.组态只要变化就不同,根本就不能设计
只针对记忆体控制器的效能而非针对cache最佳化的code.....
介绍RAM的文件很多,不过介绍到记忆体控制器如何运作基本的文件我也只看过一篇
An introduction to SDRAM and memory controllers (Benny Akesson),
另外手边若有Computer Architecture:A Quantitiative Approch第二版的,也有介绍
如何应用Bank Interleave去最佳化.三版四版的有没有拿掉我不确定....
不然若要详细知道这问题,从基本功开始练起,可以参阅近期有本书:Memory Systems:
Cache,DRAM and Disks看建立基本观念後能不能想出一些做法.
基本上我是认为除非组态已经很确定了例如嵌入式系统,否则针对记忆体控制器的
最佳化实在是没有投入的效益.....一般程式设计者能知道(假如有)scratchpad memory
如何应用,preload指令,改变资料排列的顺序或者是大小以适应cache等的做法
(同样CAAQA第二版也有详细介绍...新版不太记得)就已经很够用了.
另外文中提到硬体上的分级是有可能的,因为不同记忆体控制器的实做规则不同
的确会影响很大的效能,比如Sis当年抢先推出首款双通道DDR-400的655Max,
不过它的记忆体存取效能还输给Intel E7205装双通道DDR-266...不过目前
记忆体控制器都内建在cpu中了,所以能做分级变成cpu层级的问题而不是晶片组.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.37.182.84
1F:推 Radeon:太深奥...理解不能!! 03/19 22:01
2F:→ jk21234:我很懒 这篇只有关键字 没有基础观念... 03/19 22:01
3F:→ EndlessYearn:看不懂... 隔行如隔山... 03/19 22:03
※ jk21234:转录至看板 C_and_CPP 03/19 22:04
4F:推 Sousake:出现了!! 推推 03/19 22:04
5F:推 pomelo168168:看文这篇我大脑快当机了...先去睡觉( ̄ー ̄;) 03/19 22:04
还是简化这个问题好了,我们把记忆体容量直接展开成一个二维的东西.
1 2 3 .......
N+1 N+2 N+3 .......
2N+1 2N+2 2N+3 .......
请问我连续存取三笔资料,若是存取1,2,3这顺序有甚麽好处?若是存取
1,N+1,2N+1有甚麽好处?当我接连做多次存取,应该采用1,2,3的顺序或者是
1,N+1,2N+1 ? 还有,写软体的时候我怎麽知道N是多少?基本问题可以这几个
做例子...
6F:→ suzukihiro:我只看得懂最後的实际例子 03/19 22:05
※ 编辑: jk21234 来自: 114.37.182.84 (03/19 22:12)
7F:推 montyui:专业推 但我看不懂XD 03/19 22:17
8F:推 smkingpk:快推 不然别人会以为我们看不懂(迷 : 实际上就看不懂..) 03/19 22:18
9F:→ jk21234:这问题我不懂 但之前研究的结果是不用弄懂 03/19 22:20
10F:→ jk21234:把时间花在针对cache最佳化就好..... 03/19 22:20
11F:→ jk21234:甚麽时候写程式的人要管这问题.我推断: 1.PS3/360正式发 03/19 22:21
12F:→ jk21234:售的游戏的开发者 2.nVidia/ATI/Sis/VIA/Intel的RD 03/19 22:22
13F:→ jk21234:3.写出来的程式需要Top500等级的电脑来执行的人 03/19 22:22
14F:推 nvidia:还有data width的问题 03/19 22:27
15F:推 RolfP:楼下你略懂吗? 03/19 22:27
16F:→ nvidia:不过很多人连这个都不知道就当程式RD了 很惨很惨 03/19 22:27
17F:→ ricky7899:头到尾指有一篇测试文 就做这一堆延伸好没意义 03/19 22:27
18F:→ ricky7899:更别说测试一定准? 03/19 22:28
19F:→ ricky7899:有测试过的应该多少都知道 记忆体测试是最不准的吧 03/19 22:29
OK,你的疑问就是你需要的答案,记忆体相关的benchmark不准,
主因是记忆体控制器的排程规则对软体撰写者而言就是很黑箱,无从
最佳化起才导致的结果.A软体写出来的和B软体能得到的不同.或者是
由於其它变因不一样,同样程式不同环境下的Bank conflict的次数过高等等..
还有可能是我讲解的方式的问题,我完全不是拿单一测试来延伸推论,
而是从现成的资料(就算书单-CAAQA二版跟Memory System不看,也应该去看
文章有提的Benny Akesson的pdf,也没有多少页,看完才质疑不迟)来推
还有这件事情有点像,某个人想要改车,问的不是改引擎或者是改轮胎等,
而是问如何先把车壳打磨到最低的风阻让它更快....
而我的解答:
1.计算这东西太复杂了..而且最後的效益又很难证明比你先改引擎跟轮胎好
2.大概要设计高阶赛车再来烦恼这问题,否则就很没效益.
大概是这样的回答方式...
20F:→ StarHero:能不能举一个应用面的例子呢 03/19 22:31
嗯 如何压榨出各种记忆体控制器读写的最大效率的应用...
有啦,有一个实际例子,Sissoft Sandra的记忆体测试就是有特别针对不同记忆体
控制器最佳化...不过这没有实际太大的意义.
另外很少需要这方面的应用(除非你是嵌入式系统,PS3/360,或者已经最佳化
到极限)的原因也是很简单,如果一个程式依赖压榨记忆体系统最大的速度,表示
在这个程式上cache几乎不产生效果.那麽不是有很特殊的原因...就是需要如preload
等技巧辅助.
21F:推 three456:好强 推 03/19 22:35
22F:推 ting35:推专业~~看无 Orz 03/19 22:35
23F:推 kkkkkkq:快取最佳化 这里的快取是指CPU上的快取 还是还有其他? 03/19 22:49
cpu上的cache为主,因为效率差太多了,假设说我的程式原本一秒要做一百万次记忆体
存取,而其中70%是cache hit,使用3 cycle,而剩下30%是cache miss,使用20个cycle,
光改写软体假设提升cache hit达到90%,那麽就会加速很多,而这个过程就是对cache的最
佳化.....
举例而言....
1.对cache block size的最佳化
cache一次会读入一个block大小.这个大小可能在8~64byte之间,而同一个block中的
其他资料就不用再重新读入一次,
假设cache block是32 byte,程式有一个自订的结构S,有{w,x,y,z,t} 5个int元素,
共有100000组资料使用结构S的阵列储存,而且程式一开始就要读入阵列中每个W值...
那麽,由於每读取两个W平均超过一个会cache miss,平均cache hit的比例会接近
(32-20)/32=12/32=3/8=37.5%,
但如果把W值另外储存成一个连续的阵列.那麽平均cache hit的比例就是(32-4)/32=
28/32=87.5%.大约比前者快了两倍多....
2.对cache size的最佳化
常用在超大矩阵的运算尤其乘法.由於矩阵乘法要循序读入矩阵的每个ROW,拿去乘完
另外一个矩阵的column.再来同样全部读入一次并乘上下一个column...依此类推.
假设矩阵比cpu cache的尺寸大,那麽当ROW X被第二次读入的时候,cache内早就
被他後面的ROW塞满,原有的ROW X被舍弃掉....因此又会cache miss而重新读取一次.
这样几乎100%都是cache miss.
那麽只能把这个大型矩阵的乘法拆成小型的,让每个子乘法程序所要读取的资料
都小於cache size,那麽cache hit的比率就会很高 而不是几乎等於0.
3.preload
假定知道程式的某个读取记忆体动作一定会cache miss,而cache miss後
从记忆体内读出的cycle时间又差不多已知,那麽就可以在这行的前面N个cycle
的地方先插入preload指令,而执行到原本要读取的那一行的时候就刚好读进cache.
可以以cache hit的效率读取到.
preload也可能别称latency hidden,同样技巧其实现实生活中也会出现一样的例子.
假定我坐捷运从车头上车,但是我确定等等下车要在台北车站的车尾部分的电扶梯
离开,所以我就在车子行驶中先由车头走到车尾,省掉下车後才走的时间....这就是
标准的latency hidden的行为(走的距离并无缩短,但是时间减少了....)
24F:推 maniaque:SIS 在记忆体效率这一块很弱呀......... 03/19 22:49
25F:→ maniaque:从P3 时代就很弱了(SIS630T约是I810E2 的...六成吧..) 03/19 22:50
26F:→ maniaque:跑 memtest86+ 时,看到那种水准真的"软了" 03/19 22:51
27F:推 batschris:推专业 03/19 23:01
28F:推 ReDmango:干简化过後我的大脑还是好痛阿XDDDDDDDDDDDDDDDDDDDDDDDD 03/19 23:04
29F:推 lsslss:未看内文 jk神就要先推一下 03/19 23:14
30F:推 yoyodawning:推 03/19 23:17
31F:推 ricky7899:原来我推错篇文章了 刚那推文是该推上一篇的 03/19 23:22
32F:→ ricky7899:这篇 哪有我说话的余地阿~~~ 太专业了只能推阿 03/19 23:22
33F:推 PhenomII950:有神快拜!!! 03/19 23:34
34F:推 wch6858: 03/19 23:42
35F:推 StarHero:有点懂了 推专业~ 03/19 23:43
36F:推 check:专业 03/19 23:50
37F:推 softwind:可是原原po的问题是 why controller没变化 不是sw最佳化 03/19 23:54
memory controller有变化,以往在北桥晶片组的时候会比较明显.
不同家晶片组,同一家晶片组的高低阶(如Intel i875有PAT,i865没有...)
就会差很多.
但一来这东西太少资料,二来很少软体可以看出差异.所以就被隐藏了.
因原文在c and cpp版面发表所以想法会比较偏向软体面的介绍...
38F:推 tonyhsie:所以就是row-major跟column-major的选择吗? 03/19 23:56
39F:推 ebolalala:隔了两个小时再看一遍还是不懂 内文变更多了~~~~~ 03/20 00:01
40F:推 pkmu8426:了解重点为何了 不过专有名词统统看无Q Q 03/20 00:13
41F:推 check:因为比起controller,不如把prediction做好更重要 03/20 00:20
42F:→ check:另外编译器好像也会针对不同处理器,安排变数/指令储存位置 03/20 00:21
43F:→ check:让它读写更有效率 03/20 00:21
44F:推 polomaster27:推楼上,讲到prediction又可以扯到很多 03/20 00:32
45F:→ Shockedtopee:非人类,太难懂... 03/20 00:36
46F:推 korsg:真强者...看的头都晕了,果然理论跟实际有很大差距xd 03/20 01:57
47F:推 leubaga: 03/20 01:57
48F:推 maplemeowcat:jk神又出来了快推一个 03/20 03:41
49F:推 CHOCOLA1983:啊哈哈哈我看不懂 ( ̄▽ ̄) 03/20 09:28
50F:推 superLM:只看得懂改车的例子XD 03/20 09:42
51F:推 ArSaBuLu:推专业 只看得懂改车的例子+1 03/20 11:20
52F:→ dslite:有讲跟没讲一样 03/20 11:31
53F:推 hgtt:推 JK神 03/20 12:17
54F:→ hgtt:我也只看懂改车例子 03/20 12:18
55F:→ PlayStation3:浅显易懂。 03/20 12:50
※ 编辑: jk21234 来自: 114.37.182.84 (03/20 16:35)
56F:推 check:没错!latency hidden在CUDA等平行运算是相当重要的问题 03/20 18:07
57F:推 leojdh:controller的最佳化有时还牵涉IP授权问题, 很多不是做不到. 03/20 20:24
58F:→ leojdh:再来OS对SW那些要做怎样的cache最佳化也是一大问题. 03/20 20:25
59F:→ leojdh:所以跑分虽然可以参考, 但不能尽信, 差太多要找出原因. 03/20 20:26