cpu-cache相关内容

链表、数组和硬件内存缓存

虽然之前有人问过关于链表与数组的问题,但答案主要归结为我们大多数人在某个时候可能已经学到的东西: 列表擅长插入和删除 数组擅长随机访问 现在像 Bjarne Stroustrup 这样受人尊敬的人已经认为阵列实际上总是优于链接列表,因为它们更好地利用了现代硬件中实现的缓存架构.他还指出,数组的性能优势会随着它们的大小而增加. 虽然我基本理解他的论点并同意他的观点,但我想知道当数 ..

访问各种缓存和主内存的大概成本?

谁能告诉我访问 L1、L2 和 L3 缓存以及 Intel i7 处理器上的主内存的大概时间(以纳秒为单位)? 虽然这不是一个专门的编程问题,但了解这些速度细节对于一些低延迟编程挑战是必要的. 解决方案 这是 i7 和 Xeon 系列处理器的性能分析指南.我应该强调,这有你需要的东西,还有更多(例如,查看第 22 页的某些时间和周期). 此外,此页面有一些详细信息关于时钟周期等 ..
发布时间:2021-12-21 09:47:10 其他开发

关于内存,每个程序员都应该知道什么?

我想知道 Ulrich Drepper 2007 年的每个程序员应该了解的内存中有多少仍然有效的.我也找不到比 1.0 更新的版本或勘误表. (在 Ulrich Drepper 自己的网站上也有 PDF 格式:https://www.akkadia.org/drepper/cpumemory.pdf) 解决方案 据我所知,Drepper 的内容描述了有关内存的基本概念:CPU 缓存如 ..
发布时间:2021-12-20 15:35:37 其他开发

什么是参考位置?

我在理解参考位置时遇到问题.任何人都可以帮助我理解它的含义和是什么, 参考的空间局部性 参考的时间局部性 解决方案 如果您的计算机充满了超快内存,这无关紧要. 但不幸的是,情况并非如此,计算机内存看起来像这样1: +-----------+|中央处理器 | ..
发布时间:2021-12-20 11:42:41 其他开发

WBINVD 指令用法

我正在尝试使用 linux 上的 WBINV 指令来清除处理器的 L1 缓存. 以下程序可以编译,但是当我尝试运行它时会产生分段错误. int main() {asm ("wbinvd");返回 1;} 我正在使用 gcc 4.4.3 并在我的 x86 机器上运行 Linux 内核 2.6.32-33. 处理器信息:Intel(R) Core(TM)2 Duo CPU T5 ..
发布时间:2021-12-20 11:37:37 其他开发

CUDA 仅对一个变量禁用 L1 缓存

在 CUDA 2.0 设备上是否有任何方法可以仅为一个特定变量禁用 L1 缓存?我知道可以在编译时禁用 L1 缓存,为所有内存操作添加标志 -Xptxas -dlcm=cg 到 nvcc.但是,我只想为特定全局变量上的内存读取禁用缓存,以便所有其余的内存读取都通过 L1 缓存. 根据我在网上所做的搜索,可能的解决方案是通过 PTX 汇编代码. 解决方案 如上所述你可以使用内联 PTX ..
发布时间:2021-12-20 11:31:27 其他开发

冲突未命中和容量未命中有什么区别

由于缓存无法包含程序执行所需的所有块(程序工作集远大于缓存容量)而导致从缓存中丢弃块,因此发生容量缺失. 在集合关联或直接映射块放置策略的情况下会发生冲突未命中,当多个块映射到同一个集合或块帧时会发生冲突未命中;也称为碰撞未命中或干扰未命中. 它们实际上非常密切相关吗? 例如,如果所有的缓存行都填满了,我们有一个对内存 B 的读请求,为此我们必须驱逐内存 A. 那么,既然我 ..
发布时间:2021-12-20 11:28:11 其他开发

C++ 缓存感知编程

C++ 中有没有办法确定 CPU 的缓存大小?我有一个处理大量数据的算法,我想将这些数据分解成块,以便它们适合缓存.这可能吗?您能否就缓存大小进行编程(尤其是在多线程/多核数据处理方面)提供任何其他提示? 谢谢! 解决方案 根据“每个程序员都应该知道的memory",由 Ulrich Drepper 编写,您可以在 Linux 上执行以下操作: 一旦我们有了记忆的公式要求我们可 ..
发布时间:2021-12-20 11:28:02 C/C++开发

VIPT 到 PIPT 的转换如何在 L1->L2 驱逐上工作

这个场景出现在我的脑海中,看起来有点基础,但我会问. 所以在 L1 中有一个虚拟索引和物理标签,但是集合变满了所以它被驱逐了.L1 控制器如何从 L1 中的虚拟索引和物理标签中获取完整的物理地址,以便将线插入 L2?我想它可以在 TLB 中搜索组合,但这似乎很慢,而且它可能根本不在 TLB 中.也许来自原始 TLB 转换的完整物理地址存储在缓存线旁边的 L1 中? 这也引发了一个更广泛 ..
发布时间:2021-12-20 11:27:18 其他开发

直接映射缓存的地址字段中有多少位?

这是一个基于直接映射缓存的问题,所以我假设在这里问也可以. 这是我正在解决的问题: 问题:“一个高速工作站有 64 位字和 64 位地址,在字节级别进行地址解析.假设直接映射缓存有 8192 条 64 字节线,那么每条线有多少位?缓存的以下地址字段?1)字节 2)索引 3)标签?" 首先我定义了这个问题中的术语,并使用了另一个堆栈溢出直接映射缓存问题和我在 缓存 作为参考(如果我的任 ..
发布时间:2021-12-20 11:27:13 其他开发

回写与直写缓存?

我的理解是这两种方法的主要区别在于“直写"方法数据立即通过缓存写入主存储器,而在“回写"中数据是在“稍后"写入的. 我们仍然需要在“稍后"等待内存那么“直写"有什么好处? 解决方案 直写到主存的好处是它简化了计算机系统的设计.通过直写,主存储器始终具有该行的最新副本.所以当读取完成时,主存总是可以回复请求的数据. 如果使用回写,有时最新数据在处理器缓存中,有时在主内存中.如果数 ..
发布时间:2021-12-20 11:19:36 其他开发

虚拟索引物理标记缓存同义词

我无法完全理解 VIPT 缓存中的同义词或别名的概念. 考虑将地址拆分为:- 这里,假设我们有 2 个页面,其中不同的 VA 映射到相同的物理地址(或帧号). VA 的 pageno 部分(位 13-39)被转换为 PA 的 PFN(位 12-35)并且两者的 PFN 保持相同VA 映射到相同的物理帧. 现在两个 VA 的 pageoffset 部分(位 0-13)与它们想 ..
发布时间:2021-12-20 11:18:37 其他开发

VIPT Cache:TLB 与 Cache 之间的连接缓存?

我只是想澄清这个概念,并且可以找到足够详细的答案,这些答案可以对硬件中的一切实际运作方式有所了解.请提供任何相关详细信息. 在 VIPT 缓存的情况下,内存请求并行发送到 TLB 和缓存. 从 TLB 中我们得到了被翻译的物理地址.从缓存索引中,我们得到一个标签列表(例如,来自属于一个集合的所有缓存行). 然后将翻译后的 TLB 地址与标签列表进行匹配以找到候选者. 我的问 ..
发布时间:2021-12-20 11:02:53 其他开发

如何编写最能利用 CPU 缓存来提高性能的代码?

这听起来像是一个主观问题,但我正在寻找的是具体实例,您可能遇到过与此相关的情况. 如何使代码、缓存有效/缓存友好(更多缓存命中,尽可能少的缓存未命中)?从两个角度来看,数据缓存&程序缓存(指令缓存),即代码中与数据结构和代码构造相关的哪些内容应该注意以使其缓存有效. 是否有任何必须使用/避免的特定数据结构,或者是否有访问该结构成员的特定方式等...以使代码缓存有效. 是否有任何程 ..
发布时间:2021-12-20 11:01:20 其他开发

系统上的缓存大小估计?

我从这个链接 (https://gist.github.com/jiewmeng 得到了这个程序/3787223.我一直在网上搜索以获得更好地了解处理器缓存(L1 和 L2)的想法.我希望能够编写一个程序,使我能够猜测 L1 的大小和我的新笔记本电脑上的 L2 缓存.(仅用于学习目的.我知道我可以查看规格.) #include #include #include #define KB 1024# ..
发布时间:2021-12-20 11:01:06 其他开发

L1 和 L2 缓存的行大小

从之前在此论坛上的问题,我了解到在大多数内存系统中,L1 缓存是 L2 缓存的子集,这意味着从 L2 中删除的任何条目也会从 L1 中删除. 所以现在我的问题是如何为 L2 缓存中的条目确定 L1 缓存中的相应条目.L2 条目中存储的唯一信息是标签信息.根据这个标签信息,如果我重新创建 addr,如果 L1 和 L2 缓存的行大小不同,它可能会跨越 L1 缓存中的多行. 该架构是否真的 ..
发布时间:2021-12-20 10:57:58 其他开发

为什么大部分处理器的L1缓存比L2缓存小?

为什么大部分处理器的L1缓存比L2缓存小? 解决方案 造成这种情况的原因各不相同. 系统中存在 L2 以加速出现 L1 缓存未命中的情况.如果 L1 的大小等于或大于 L2 的大小,则 L2 无法容纳比 L1 更多的缓存行,并且无法处理 L1 缓存未命中.从设计/成本的角度来看,L1 缓存与处理器绑定并且比 L2 更快.缓存的整个想法是,您可以通过添加比最慢的硬件性能更高(且成本更高 ..
发布时间:2021-12-20 10:51:51 其他开发

用于迭代二维数组的嵌套循环的哪种排序更有效

以下哪种嵌套循环的顺序迭代二维数组在时间(缓存性能)方面更有效?为什么? int a[100][100];for(i=0; i 或 for(i=0; i 解决方案 第一种方法稍微好一些,因为分配给的单元格彼此相邻. 第一种方法: [ ][ ][ ][ ][ ] ....^第一个作业^第二个作业[ ][ ][ ][ ][ ] ....^101 次作业 第二种方法: [ ][ ] ..
发布时间:2021-12-08 11:49:34 其他开发

clflush 通过 C 函数使缓存行无效

我正在尝试使用 clflush 手动逐出缓存行以确定缓存和行大小.我没有找到有关如何使用该指令的任何指南.我所看到的只是一些为此目的使用更高级别函数的代码. 有一个内核函数 void clflush_cache_range(void *vaddr, unsigned int size),但我仍然不知道在我的代码中包含什么以及如何使用它.我不知道该函数中的 size 是多少. 更重要的是 ..
发布时间:2021-12-08 11:35:18 其他开发