Questions tagged «cpu-cache»

有限的快速内存,靠近CPU。高速缓存旨在减少访问内存的平均时间。


2
分代垃圾收集器本质上是缓存友好的吗?
典型的世代垃圾收集器将最近分配的数据保留在单独的内存区域中。在典型程序中,大量数据是短命的,因此,频繁收集年轻垃圾(较小的GC周期)而很少收集旧垃圾是内存开销和执行GC时间之间的良好折衷。 直觉上,随着主内存相对于高速缓存的等待时间比率的增加,与单区域垃圾收集器相比,世代垃圾收集器的好处应该增加,这是因为经常访问年轻区域中的数据并将它们全部保存在一个地方。实验结果是否证实了这种直觉?


5
如何计算不同缓存的标签,索引和偏移量位数?
特别: 1)具有4096个块/行的直接映射缓存,其中每个块具有8个32位字。假设一个32位地址,那么标记和索引字段需要多少位? 2)与1)相同的问题,但需要完全关联的缓存吗? 如果我错了,请纠正我,是吗? 标签位=地址位长度-索引指数-偏移指数? [由于2 ^ 3 = 8,偏移量= 3还是2 ^ 5 = 32是5?

3
并行随机读取似乎效果很好–为什么?
考虑以下非常简单的计算机程序: for i = 1 to n: y[i] = x[p[i]] 这里和y是字节的n个元素数组,而p是字的n个元素数组。在这里,n很大,例如n = 2 31(这样,只有很小一部分的数据适合任何类型的高速缓存)。XXxÿÿyññnpppññnññnn = 231ñ=231n = 2^{31} 假设由随机数组成,在1和n之间均匀分布。ppp1个1个1ññn 从现代硬件的角度来看,这意味着: 读取很便宜(顺序读取)p [ i ]p[一世]p[i] 读取非常昂贵(随机读取;几乎所有读取都是高速缓存未命中;我们将不得不从主内存中获取每个单独的字节)x [ p [ i ] ]X[p[一世]]x[p[i]] 写很便宜(顺序写)。ÿ[ 我]ÿ[一世]y[i] 这确实是我所观察到的。与仅执行顺序读取和写入的程序相比,该程序非常慢。大。 现在出现一个问题:该程序在现代多核平台上的并行度如何? 我的假设是该程序不能很好地并行化。毕竟,瓶颈是主要内存。单核已经在浪费大部分时间,只是在等待主存储器中的某些数据。 但是,当我开始尝试瓶颈是这种操作的某些算法时,这并不是我观察到的! 我只是用OpenMP并行for循环替换了朴素的for循环(本质上,它将范围拆分为较小的部分,并在不同的CPU内核上并行运行这些部分)。[ 1,n ][1个,ñ][1,n] 在低端计算机上,加速确实很小。但是在高端平台上,我惊讶地发现我获得了出色的近线性加速。一些具体示例(确切的时间安排可能会有所偏离,会有很多随机变化;这些只是快速的实验): 2 x 4核Xeon(总共8核):与单线程版本相比,速度提高了5-8倍。 2 x 6核Xeon(总共12核):与单线程版本相比,速度提高了8-14倍。 现在,这完全出乎意料。问题: 究竟为什么这种程序并行化如此好?硬件会发生什么?(我目前的猜测是沿着这些思路的:从不同线程进行的随机读取是“流水线式的”,得到这些答案的平均速率比单线程情况要高得多。) 是否有必要使用多个线程和多个内核来获得任何加速?如果确实在主内存和CPU之间的接口中发生了某种流水线操作,那么单线程应用程序是否不能让主内存知道很快将需要, …

1
内存一致性与缓存一致性
确实,顺序一致性是比缓存一致性更强的属性吗? 根据 索林,丹尼尔·J;希尔,马克D;Wood,David A:关于内存一致性和缓存一致性的入门,Morgan和Claypool,2011年 顺序一致性可以描述为(非正式): 顺序一致性内存模型指定系统必须执行所有线程的加载,并以尊重每个线程程序顺序的总顺序存储到所有内存位置。每次加载将按该总顺序获取最新存储的值。 换句话说,系统是顺序一致的,如果给定每个线程的内存事件(加载和存储),我们可以对所有这些事件进行排序,使得:1)对于每个线程,其事件的顺序得以保留; 2)全局顺序为串行(任何加载都返回存储的最新值)。 现在他们继续并描述连贯性: 的定义的一致性是类似于顺序一致性的定义是一致的系统必须出现来执行所有螺纹的加载和存储到单个存储器位置在共有以便方面每个线程的程序顺序。 换句话说,系统是一致的,如果给定每个位置的每个线程的内存事件,我们可以对该位置的事件进行排序,这样:1)对于每个线程,其事件在该位置的顺序被保留,以及2)对于每个线程位置订单是连续的。 最后,他们指出了区别: 此定义突出了一致性和一致性之间的重要区别:一致性是基于每个内存位置指定的,而一致性是针对所有内存位置指定的。 因此似乎不同之处在于,对于相干系统,我们需要每个位置的所有事件的总顺序(因此,特定位置的事件之间的顺序),而对于一致的系统,应该在所有事件上定义总顺序(因此在不同位置的事件之间也进行排序)? 这是否意味着一致性不如一致性那么严格?(这似乎很有趣!)是否存在连贯但不一致的痕迹?

1
TLB和数据缓存如何工作?
我正在尝试考试,但我意识到我对TLB和数据缓存的工作方式感到困惑。 我知道TLB本质上是最近使用的物理地址的缓存。但是,我正在看教科书中的一个图表(如下所示),但我不知道其中发生了什么。我猜它突然分裂了物理地址,并用它来索引缓存。但是为什么它分别显示缓存和数据?为什么字节偏移量只是浮动?我很确定缓存也应该存储数据。我认为它的唯一目的不是确定其内部是否有命中或失误。 我为我的无知事先表示歉意,但是这本书几乎没有涵盖TLB的内容(只不过是一页纸),并且在解释TLB和缓存之间的关系方面做得不好。

6
在一个间隔中找到两个数字的最大异或:我们能做得比二次更好吗?
lllrrrmax(i⊕j)max(i⊕j)\max{(i\oplus j)}l≤i,j≤rl≤i,j≤rl\le i,\,j\le r 天真的算法只检查所有可能的对。例如在红宝石中,我们有: def max_xor(l, r) max = 0 (l..r).each do |i| (i..r).each do |j| if (i ^ j > max) max = i ^ j end end end max end 我感觉到,我们可以做得比二次。是否有针对此问题的更好算法?

1
在实践中评估缓存遗忘性能的研究
Frigo等人介绍了忽略缓存的算法和数据结构是一个相当新的事物。在Cache-oblivious算法,1999年。普罗科普(Prokop)同年的论文也介绍了早期的想法。 Frigo等人的论文。目前的一些实验结果表明了该理论以及忽略高速缓存的算法和数据结构的潜力。许多可忽略缓存的数据结构都是基于静态搜索树的。存储和导航这些树的方法已经发展了很多,也许是Bender等人最著名的。以及Brodal等人的著作。Demaine给出了一个很好的概述。 至少由Ladner等人完成了研究缓存行为的实验工作。使用程序工具,2002年在“缓存感知和缓存遗忘的静态搜索树”的比较中取得成功。Ladner等。使用经典算法,忽略缓存的算法和了解缓存的算法,对解决二进制搜索问题的算法的缓存行为进行了基准测试。每种算法都使用隐式和显式导航方法进行基准测试。除此之外,Rønn,2003年的论文对相同的算法进行了非常详细的分析,并对Ladner等人的相同算法进行了更彻底的测试。 我的问题是 从那以后,在实践中是否有任何新的研究对基准缓存不了解算法的缓存行为进行基准测试?我对静态搜索树的性能特别感兴趣,但我也对其他任何忽略缓存的算法和数据结构感到满意。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.