从第11章( 性能和可伸缩性 )和JCIP书籍的命名上下文切换部分: 当一个新的线程被切换时,它所需要的数据不太可能在本地处理器caching中,所以上下文切换会导致一连串的caching未命中,因此线程在第一次调度时会运行得更慢一些。 有人可以用一种容易理解的方式解释caching未命中的概念和其可能的相反( caching命中 )吗? 为什么上下文切换会导致很多caching未命中?
我testing了memcpy()的速度,注意到速度在i * 4KB下急剧下降。 结果如下:Y轴是速度(MB /秒),X轴是memcpy()的缓冲区大小,从1KB增加到2MB。 图2和图3详细描述了1KB-150KB和1KB-32KB的部分。 环境: CPU:Intel(R)Xeon(R)CPU E5620 @ 2.40GHz OS:2.6.35-22-generic#33-Ubuntu GCC编译器标志:-O3 -msse4 -DINTEL_SSE4 -Wall -std = c99 我想它必须与高速caching相关,但是我无法从以下高速caching不友好的情况中find原因: 为什么我的程序在循环8192个元素时变慢? 为什么转置512×512的matrix要比转置513×513的matrix慢得多? 由于这两种情况的性能下降是由不友好的循环引起的,这些循环将零散的字节读入高速caching,浪费了高速caching行的剩余空间。 这是我的代码: void memcpy_speed(unsigned long buf_size, unsigned long iters){ struct timeval start, end; unsigned char * pbuff_1; unsigned char * pbuff_2; pbuff_1 = malloc(buf_size); pbuff_2 = malloc(buf_size); gettimeofday(&start, NULL); for(int i = 0; […]
我正在试图分析和优化algorithm,我想了解caching对各种处理器的具体影响。 对于最近的英特尔x86处理器(例如Q9300),很难find有关caching结构的详细信息。 尤其是,大多数网站(包括Intel.com )的后处理器规格不包括对L1caching的任何引用。 这是因为L1caching不存在,或者是由于某些原因认为不重要的信息? 有没有关于消除L1caching的文章或讨论? 运行各种testing和诊断程序(大部分是在下面的答案中讨论的)后,我得出结论,我的Q9300似乎有一个32K L1数据caching。 我还没有find一个明确的解释,为什么这个信息是如此难以通过。 我目前的工作理论是,L1caching的细节现在被英特尔视为商业秘密。
有没有一种方法在C ++来确定CPU的caching大小? 我有一个algorithm处理大量的数据,我想把这些数据分解成块,使它们适合caching。 这可能吗? 你可以给我任何其他暗示编程高速caching(特别是在multithreading/多核数据处理方面)的提示吗? 谢谢!
这可能听起来像一个主观的问题,但我正在寻找的是具体的实例,你可能遇到过这个问题。 如何使代码,caching有效/caching友好(更多的caching命中,尽可能less的caching未命中)? 从这两个angular度来看,数据caching和程序caching(指令caching),即代码中与数据结构和代码结构有关的东西,应该注意使其caching有效。 是否有任何特定的数据结构必须使用/避免,还是有一种特定的方式来访问该结构的成员等…使代码caching有效。 是否有任何程序结构(如果,切换,中断,转到,…),代码stream(内部如果,如果内部等等…)应该遵循/避免在这件事情? 我期待着听到有关caching高效代码的个人经验。 它可以是任何编程语言(C,C ++,汇编,…),任何硬件目标(ARM,Intel,PowerPC,…),任何操作系统(Windows,Linux,S ymbian,…)等。 品种将有助于更好地深入理解它。
我有兴趣强制在Windows中刷新CPUcaching(出于基准testing的原因,我想仿效CPUcaching中没有数据开始),最好是基本的C实现或Win32调用。 有没有一种已知的方式来做这个系统调用,甚至像做一个大的memcpy一样鬼鬼祟祟? 英特尔i686平台(P4和以上也可以)。
任何人都可以给我大致的时间(以纳秒为单位)来访问L1,L2和L3caching,以及英特尔i7处理器上的主内存? 虽然这不是特别的编程问题,但知道这些速度细节对于一些低延迟编程挑战来说是必要的。 EDIT : 戴夫的第二个链接提供了以下数字: Core i7 Xeon 5500 Series Data Source Latency (approximate) [Pg. 22] local L1 CACHE hit, ~4 cycles ( 2.1 – 1.2 ns ) local L2 CACHE hit, ~10 cycles ( 5.3 – 3.0 ns ) local L3 CACHE hit, line unshared ~40 cycles ( 21.4 – 12.0 ns ) local […]
可能重复: 这两个循环中的哪一个在时间和缓存性能方面更有效率 下面是两个几乎相同的程序,只是我切换了i和j变量。 他们都跑了不同的时间。 有人能解释为什么发生这种情况 版本1 #include <stdio.h> #include <stdlib.h> main () { int i,j; static int x[4000][4000]; for (i = 0; i < 4000; i++) { for (j = 0; j < 4000; j++) { x[j][i] = i + j; } } } 版本2 #include <stdio.h> #include <stdlib.h> main () { int i,j; static […]