我正在尝试分析和优化算法,我想了解缓存对各种处理器的具体影响.对于最近的Intel x86处理器(例如Q9300),很难找到有关缓存结构的详细信息.特别是,发布处理器规范的大多数网站(包括Intel.com)都不包含对L1缓存的任何引用.这是因为L1缓存不存在还是由于某种原因被认为不重要?是否有关于消除L1缓存的文章或讨论?
[编辑]在运行各种测试和诊断程序(主要是在下面的答案中讨论的那些)后,我得出结论,我的Q9300似乎有一个32K L1数据缓存.我仍然没有找到一个明确的解释,为什么这些信息很难得到.我目前的工作理论是,L1缓存的细节现在被英特尔视为商业机密.
几乎不可能找到英特尔缓存的规格.当我去年教一个关于缓存的课程时,我问过英特尔内部的朋友(在编译器组中)他们找不到规格.
可是等等!!! 杰德,祝福他的灵魂,告诉我们在Linux系统上,你可以从内核中挤出大量信息:
grep . /sys/devices/system/cpu/cpu0/cache/index*/*
这将为您提供关联性,设置大小和一堆其他信息(但不是延迟).例如,我了解到虽然AMD宣传他们的128K L1缓存,但我的AMD机器有一个64K的分割I和D缓存.
由于Jed,现在两个建议现在已经过时了:
AMD发布了有关其缓存的更多信息,因此您至少可以获得有关现代缓存的一些信息.例如,去年的AMD L1缓存每个周期(峰值)传递了两个单词.
开源工具valgrind
中包含各种缓存模型,对于分析和理解缓存行为非常有用.它附带了一个非常好的可视化工具kcachegrind
,它是KDE SDK的一部分.
例如:在2008年第三季度,AMD K8/K10 CPU使用64字节高速缓存行,每个L1I/L1D分离高速缓存为64kB.L1D是双向关联的,与L2独占,延迟为3个周期.L2缓存是16路关联的,延迟大约是12个周期.
AMD Bulldozer系列CPU使用分离L1,每个群集具有16kiB 4路关联L1D(每个核心2个).
Intel CPU长期保持L1相同(从Pentium M到Haswell到Skylake,之后可能是很多代):每个I和D缓存分割32kB,L1D为8路关联.64字节高速缓存行,与DDR DRAM的突发传输大小相匹配.负载使用延迟约为4个周期.
另请参阅x86标记wiki以获取更多性能和微体系结构数据的链接.
本英特尔手册:英特尔®64和IA-32架构优化参考手册对缓存注意事项进行了大量讨论.
第46页,第2.2.5.1节" 英特尔 ®64 和IA-32架构优化参考手册"
甚至MicroSlop也意识到需要更多的工具来监控缓存的使用和性能,并且有一个GetLogicalProcessorInformation()函数的例子(......在创建过程中创建可笑的长函数名时开辟新的道路)我想我会编码起来.
更新I:Hazwell从Tock内部增加了2倍的缓存负载性能; Haswell的建筑
如果有任何疑问,最好尽可能地使用缓存,那么以前由Azul 提供的Cliff Click的演示应该可以消除任何疑问.用他的话来说,"记忆就是新盘!".
更新II:SkyLake显着改进了缓存性能规范.
您正在查看消费者规范,而不是开发人员规范. 这是您想要的文档.缓存大小因处理器系列子模型而异,因此它们通常不在IA-32开发手册中,但您可以在NewEgg等上轻松查找它们.
编辑:更具体地说:第3A卷(系统编程指南)的第10章,优化参考手册的第7章,以及TLB页面缓存手册中的某些内容,尽管我认为一个比你关心的更远离L1关于.
我做了一些调查.苏黎世联邦理工学院有一个小组建立了一个内存性能评估工具,它可能能够获得有关L1和L2缓存的至少(也可能是相关性)大小的信息.该程序通过实验尝试不同的读取模式并测量产生的吞吐量来工作.Bryant和O'Hallaron的流行教科书使用了简化版本.