- 论坛徽章:
- 11
|
本帖最后由 Ager 于 2012-08-29 04:54 编辑
superwujc 发表于 2012-08-28 22:29 ![]()
回复 9# Ager
再请教一下,怎样在系统中查看CPU的内存访问粒度?
呵呵,不敢当啦,我也就是稀里糊涂“扯”一通而已。
关于你的这个问题,其实对于x86家族有些扯不太清楚。以前的x86即从80386直到x86_64之前的CPU,乃地道的32bits的处理器,即从内部寄存器(或字长)角度看,它一次性access数据的宽度是32bits的,但是,又因为架构从80586开始支持的external databus的宽度是64bits,所以,它一次性access内存的宽度就翻番到了64bits —— 这种机制乃是依赖于80586处理器拥有两条内部流水线同时工作,即Superscalar机制(该机制的主要前提是RISC范式)。既然Intel公司都已经把CPU发展到了这一步,那么咱们用计算机的人,也不能当这档子事不存在,所以,统统认为是64bits的就没错。
至于如何在计算机上查看CPU的内存access粒度,有好几种方法 —— 不过,不是国内中文网站上普遍宣称的那一系列“getconf xxxBIT”、“uname -xxx”之类的方法,那些方法都是错的,有的是针对OS的,不是针对CPU的。
以下方法,仅供参考:
(1)从版主提到的Cache Line角度,可以用形如以下的命令- cat /sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size
复制代码 查看到Cache Line的长度,单位是Bytes。
如果我们知道Cache Line前缀Tag的宽度(哪位大虾请给个解法?),那么可以用公式:粒度宽度 = Tag的宽度+ lg(Cache Block的长度) + lg(Cache总数据量长度/Cache Block的长度) (注:式中“宽度者”单位均为bits;“长度者”单位均为Bytes;lg的底为2;且本公式也属于我的扯,希望有大虾验证或判否,呵呵……)
(2)直接查看CPU的状况,可以用在flags里,有许多项目可以作为最实在的参考标准,比如有“lm”(Long Mode)就说明必定是64bits的CPU。
如果你想进一步了解x86家族CPU的内存access的粒度(或原子性),那么,你得找一位老乞丐……
老乞丐一看到你为这事儿而来,说:“看你年纪轻轻,就对CPU和内存的事情这麽感兴趣,真是前途无量呀!……”
于是,他从破布口袋里掏出一本白皮书,书名曰《Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3 (3A, 3B & 3C): System Programming Guide》…… 哇,好长!书也狂厚,大约有2000页……
“看你这麽迫不及待的样子,那就直接看书中的8.1.1吧,在第325页……”
如果老乞丐问你要钱,那你别睬他,因为这本白皮书,在网上可以免费下载阅览:- wget http://download.intel.com/products/processor/manual/325384.pdf
复制代码 以上,经供参考,呵呵 —— :)
|
|