我正在尝试分析和优化算法,我想了解缓存对各种处理器的具体影响.对于最近的Intel x86处理器(例如Q9300),很难找到有关缓存结构的详细信息.特别是,发布处理器规范的大多数网站(包括Intel.com)都不包含对L1缓存的任何引用.这是因为L1缓存不存在还是由于某种原因被认为不重要?是否有关于消除L1缓存的文章或讨论?
[编辑]在运行各种测试和诊断程序(主要是在下面的答案中讨论的那些)后,我得出结论,我的Q9300似乎有一个32K L1数据缓存.我仍然没有找到一个明确的解释,为什么这些信息很难得到.我目前的工作理论是,L1缓存的细节现在被英特尔视为商业机密.
我正在用C编写一个小程序,我想测量它的性能.
我想知道它在处理器中运行了多少时间以及它有多少缓存命中+未命中.有关上下文切换和内存使用的信息也很好.
该程序执行时间不到一秒.
我喜欢/ proc/[pid]/stat的信息,但我不知道如何在程序死亡/被杀之后看到它.
有任何想法吗?
编辑:我认为Valgrind增加了很多开销.这就是为什么我想要一个简单的工具,比如/ proc/[pid]/stat,它总是在那里.
performance measurement context-switch cpu-cache memcache-stats
我感兴趣的是在Windows中强制CPU缓存刷新(出于基准测试的原因,我想模拟从CPU缓存中没有数据开始),最好是基本的C实现或Win32调用.
是否有一种已知的方法可以通过系统调用来执行此操作,甚至可以像执行大型操作一样偷偷摸摸地执行此操作memcpy
?
英特尔i686平台(P4及以上版本也可以).
关于多核CPU或多处理器系统中使用的高速缓存存储器,我有几个问题.(虽然与编程没有直接关系,但是当一个人为多核处理器/多处理器系统编写软件时会产生很多反响,因此在这里问!)
在多处理器系统或多核处理器(Intel Quad Core,Core two Duo等......)中,每个cpu核心/处理器都有自己的缓存(数据和程序缓存)吗?
一个处理器/核心可以访问彼此的高速缓存,因为如果允许它们访问彼此的高速缓存,那么我认为可能存在较少的高速缓存未命中,如果特定处理器高速缓存没有一些数据但是其他一些处理器的缓存可能有它,从而避免从内存读入第一个处理器的缓存?这个假设是否有效且真实?
允许任何处理器访问其他处理器的高速缓冲存储器会有任何问题吗?
我对空间和时间局部的含义有点困惑.我希望通过一个数组示例来看它,这将有助于我更好地理解它.
在这样的例子中:A [0] [1],A [0] [2],A [0] [3] ......等
这是否证明了时间局部性?我看到同一行被多次访问但是在不同的偏移处...这是否意味着访问了不同的地址?
另外,我说的是这样的例子:A [1],A [2],A [3] ......等等
展示空间位置?
希望对实时代码中时空局部性如何工作的一些澄清将有助于我更好地理解它们.
另一周,我写了一个小线程类和一个单向消息管道,以允许线程之间的通信(每个线程两个管道,显然,用于双向通信).在我的Athlon 64 X2上一切正常,但我想知道如果两个线程都在查看相同的变量并且每个核心上的此变量的本地缓存值不同步,我是否会遇到任何问题.
我知道volatile关键字会强制变量从内存中刷新,但多核x86处理器是否有办法强制所有内核的缓存同步?这是我需要担心的事情,还是易失性和正确使用轻量级锁定机制(我使用_InterlockedExchange设置我的易失性管道变量)处理我想为多核x86 CPU编写"无锁"代码的所有情况?
我已经知道并使用了Critical Sections,Mutexes,Events等等.我主要想知道是否有x86内在函数,我不知道哪种力量或可用于强制缓存一致性.
在大多数处理器中,为什么L1缓存的大小小于L2缓存的大小?
容量未命中是因为从缓存中丢弃块,因为缓存不能包含程序执行所需的所有块(程序工作集远大于缓存容量).
在组关联或直接映射块放置策略的情况下发生冲突未命中,当几个块被映射到同一组或块帧时发生冲突未命中; 也称为碰撞未命中或干扰未命中.
它们实际上是密切相关的吗?
例如,如果所有缓存行都已填满,并且我们对内存B有一个读取请求,我们必须驱逐内存A.
因为我们没有足够的空间,所以它应该被视为容量缺失吗?后来如果我们想要访问内存A,并且因为之前被驱逐,它被认为是冲突未命中.
我理解正确吗?谢谢
我记得假设在我的架构类中L1缓存命中是1个周期(即与寄存器访问时间相同),但在现代x86处理器上实际上是这样吗?
L1缓存命中多少个周期?它与寄存器访问相比如何?
performance x86 cpu-architecture micro-optimization cpu-cache