问题标签 [cpu-cache]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 设计代码以适应 CPU 缓存?
在编写模拟时,我的朋友说他喜欢尝试编写足够小的程序以放入缓存中。这有什么实际意义吗?我知道缓存比 RAM 和主内存快。是否可以指定您希望程序从缓存中运行或至少将变量加载到缓存中?我们正在编写模拟,因此任何性能/优化增益都是巨大的好处。
如果您知道任何解释 CPU 缓存的好链接,请向我指出那个方向。
c++ - C++ 缓存感知编程
C++ 中有没有办法确定 CPU 的缓存大小?我有一个处理大量数据的算法,我想将这些数据分解成块,以便它们适合缓存。这可能吗?您能否给我任何其他有关考虑缓存大小的编程提示(尤其是在多线程/多核数据处理方面)?
谢谢!
multithreading - CPU 寄存器和缓存一致性
当涉及到 MESI 等缓存一致性协议时,CPU 寄存器和 CPU 缓存之间有什么关系?如果某个值存储在 CPU 的缓存中,并且还存储在寄存器中,那么如果缓存行被标记为“脏”会发生什么?据我了解,即使缓存已更新(由于 MESI),也无法保证寄存器会更新其值。
验证此代码:
(假设编译器没有优化循环外“完成”的负载)据
我所知,第二个线程看不到“完成”的更新,因为它的值保存在寄存器中(CPU 2 的缓存是但是更新)。
放置内存屏障会强制“刷新”所有寄存器吗?寄存器与缓存的关系是什么?那么寄存器和内存屏障呢?
c# - 最好的 NHibernate 缓存 L2 提供商是什么?
我看到有很多。NCache、Velocity 等,但我还没有找到比较它们的表格。
考虑到以下标准,什么是最好的:
- 容易理解。
- 最近在维护。
- 是免费的或有足够好的免费版本。
- 作品。
caching - 使 CPU 的缓存失效
当我的程序执行具有获取语义的加载操作/具有释放语义的存储操作或可能是全栅栏时,它会使 CPU 的缓存无效。
我的问题是:缓存的哪一部分实际上是无效的?只有保存我使用的变量的缓存行获取/释放?或者整个缓存都失效了?(L1 + L2 + L3 .. 等等?)。当我使用获取/释放语义或使用全栅栏时,这个主题有什么不同吗?
performance - 现代 CPU 的每刻缓存带宽
现代 CPU 的缓存访问速度是多少?Intel P4,Core2,Corei7,AMD每个处理器时钟周期可以从内存读取或写入多少字节?
请用理论(ld/sd 单元的宽度及其以 uOPs/tick 为单位的吞吐量)和实际数字(甚至 memcpy 速度测试或 STREAM 基准测试)(如果有)来回答。
PS这是一个问题,与汇编程序中加载/存储指令的最大速率有关。可以有理论上的加载速率(所有指令每个 Tick 都是最宽的加载),但处理器只能给出其中的一部分,即实际的加载限制。
arm - 优化不同阵列的 ARM 缓存使用
我想在 ARM Cortex A8 处理器上移植一小段代码。L1 缓存和 L2 缓存都非常有限。我的程序中有 3 个数组。其中两个是顺序访问的(大小> 数组 A:6MB 和数组 B:3MB),第三个数组(大小> 数组 C:3MB)的访问模式是不可预测的。虽然计算不是很严格,但访问数组 C 时存在大量缓存未命中。我认为的一种解决方案是为数组 C 分配更多的缓存(L2)空间,为数组 A 和 B 分配更少的空间。但我不能找到任何方法来实现这一目标。我通过了 ARM 的预加载引擎,但找不到任何有用的东西。
c - 测量 L1 和 L2 缓存的大小和路序
如何以编程方式测量(不查询操作系统)L1 和 L2 缓存(数据缓存)的大小和关联顺序?
关于系统的假设:
- 它有 L1 和 L2 缓存(也可能是 L3,可能是缓存共享),
- 它可能有一个硬件预取单元(就像 P4+),
- 它有一个稳定的时钟源(tickcounter 或 gettimeofday 的良好 HPET)。
没有关于操作系统的假设(可以是 Linux、Windows 或其他),我们不能使用 POSIX 查询。
语言是 C,编译器优化可能被禁用。
java - Java 内存模型 (JSR-133) 是否暗示进入监视器会刷新 CPU 数据缓存?
Java内存模型有一些让我烦恼的东西(如果我什至正确理解了所有内容)。如果有两个线程 A 和 B,则不能保证 B 会看到 A 写入的值,除非 A 和 B 在同一个监视器上同步。
对于任何保证线程间缓存一致性的系统架构,都没有问题。但是如果架构在硬件上不支持缓存一致性,这实质上意味着每当一个线程进入一个监视器,之前所做的所有内存更改都必须提交到主内存,并且缓存必须失效。它必须是整个数据缓存,而不仅仅是几行,因为监视器没有信息它保护内存中的哪些变量。但这肯定会影响任何需要频繁同步的应用程序的性能(尤其是诸如具有短运行作业的作业队列之类的东西)。那么,Java 能否在没有硬件缓存一致性的架构上运行得相当好呢?如果不是,为什么内存模型不对可见性做出更强有力的保证?如果该语言需要监视器所保护的信息,那不是更有效吗?
正如我所看到的,内存模型为我们提供了两全其美的条件,即绝对需要同步,即使在硬件中保证了缓存一致性,另一方面,在不连贯的架构上性能不佳(完全缓存刷新)。那么它不应该更严格(需要由监视器保护的信息)还是更多地丢失并将潜在平台限制为缓存一致的架构?
就目前而言,这对我来说没有太大意义。有人可以弄清楚为什么选择这种特定的内存模型吗?
编辑:回想起来,我使用严格和失败是一个糟糕的选择。我用“严格”表示保证较少的情况,而“失败”表示相反的情况。为了避免混淆,最好用更强或更弱的保证来说话。
optimization - 这段代码是否填满了 CPU 缓存?
我有两种方法来编写相同的功能。
方法一:
方法二:
假设函数doAction(int action)
和函数template<int Action> doAction()
由大约 10 行代码组成,这些代码将在编译时内联。调用doAction(#)
等效doAction<#>()
于功能,但非模板化doAction(int value)
的速度比 慢一些template<int Value> doAction()
,因为在编译时已知参数值时可以在代码中进行一些很好的优化。
所以我的问题是,在模板化函数的情况下,是否所有数百万行代码都填充了 CPU L1 缓存(以及更多)(从而大大降低了性能),还是只有doAction<#>()
当前正在运行的循环内部的行得到缓存?