问题标签 [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.

0 投票
9 回答
19769 浏览

c++ - 我可以在多核 x86 CPU 上强制缓存一致性吗?

另一周,我写了一个小线程类和一个单向消息管道来允许线程之间的通信(显然,每个线程有两个管道,用于双向通信)。在我的 Athlon 64 X2 上一切正常,但我想知道如果两个线程都在查看同一个变量并且每个内核上该变量的本地缓存值不同步,我是否会遇到任何问题。

我知道volatile关键字会强制变量从内存中刷新,但是多核 x86 处理器有没有办法强制所有内核的缓存同步?这是我需要担心的事情吗,或者轻量级锁定机制的volatile和正确使用(我使用 _InterlockedExchange 设置我的 volatile 管道变量)会处理我想为多核 x86 CPU 编写“无锁”代码的所有情况?

我已经知道并使用了关键部分、互斥体、事件等。我主要想知道是否有 x86 内在函数我不知道哪种力或可用于强制缓存一致性。

0 投票
2 回答
500 浏览

hardware - L2 高速缓存

2*512 KB L2 缓存和 1 MB L2 缓存有什么区别?

0 投票
5 回答
1068 浏览

optimization - 流式传输的有效内存带宽使用

我有一个流过 250 MB 数据的应用程序,对数据块(每个只有 2 个 32 位字)应用一个简单而快速的神经网络阈值函数。基于(非常简单的)计算的结果,该块不可预测地被推入 64 个 bin 之一。所以它是一个大流输入和 64 个较短(可变长度)的流输出。

使用不同的检测功能重复多次。

计算受内存带宽限制。我可以这么说,因为即使我使用计算量更大的判别函数,速度也没有变化。

构建新流的写入以优化我的内存带宽的最佳方法是什么?我特别认为了解缓存使用和缓存行大小可能在其中发挥重要作用。想象一下最坏的情况,我有 64 个输出流,运气不好,许多都映射到同一个缓存行。然后,当我将接下来的 64 位数据写入流时,CPU 必须将过时的缓存行刷新到主内存,并加载到正确的缓存行中。每个都使用 64 字节的带宽......所以我的带宽受限应用程序可能会浪费 95% 的内存带宽(不过,在这个假设的最坏情况下)。

甚至很难衡量效果,因此围绕它设计的方法更加模糊。还是我什至在追逐一个幽灵瓶颈,以某种方式硬件优化得比我好?

如果这有什么不同,我正在使用 Core II x86 处理器。

编辑:这是一些示例代码。它流过一个数组并将其元素复制到伪随机挑选的各种输出数组。使用不同数量的目标箱运行相同的程序会产生不同的运行时间,即使完成了相同数量的计算和内存读取和写入:

2 个输出流:13 秒
8 个输出流:13 秒
32 个输出流:19 秒
128 个输出流:29 秒
512 个输出流:47 秒

使用 512 与 2 个输出流之间的差异是 4 倍,(可能??)由缓存行驱逐开销引起。

0 投票
7 回答
31023 浏览

performance - Intel x86 处理器的 L1 内存缓存记录在哪里?

我正在尝试分析和优化算法,我想了解缓存对各种处理器的具体影响。对于最近的 Intel x86 处理器(例如 Q9300),很难找到有关高速缓存结构的详细信息。特别是,大多数发布处理器规格的网站(包括Intel.com)不包含对 L1 缓存的任何引用。这是因为 L1 缓存不存在还是由于某种原因这些信息被认为不重要?有没有关于消除 L1 缓存的文章或讨论?

[编辑] 在运行各种测试和诊断程序(主要是在下面的答案中讨论的那些)之后,我得出结论,我的 Q9300 似乎有一个 32K L1 数据缓存。我仍然没有找到一个明确的解释来解释为什么这些信息如此难以获得。我目前的工作理论是,L1 缓存的细节现在被英特尔视为商业机密。

0 投票
15 回答
70145 浏览

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

这听起来像是一个主观问题,但我正在寻找的是特定的实例,您可能遇到过与此相关的情况。

  1. 如何使代码,缓存有效/缓存友好(更多的缓存命中,尽可能少的缓存未命中)?从这两个角度来看,数据缓存和程序缓存(指令缓存),即一个人的代码中与数据结构和代码结构相关的东西,应该由一个人来处理以使其缓存有效。

  2. 是否有任何特定的数据结构必须使用/避免,或者是否有一种特定的方式来访问该结构的成员等......以使代码缓存有效。

  3. 是否有任何程序构造(if、for、switch、break、goto、...)、代码流(for 在 if、if 在 for 中等...)在这件事上应该遵循/避免?

我期待听到与制作缓存高效代码相关的个人经验。它可以是任何编程语言(C、C++、Assembly...)、任何硬件目标(ARM、Intel、PowerPC...)、任何操作系统(Windows、Linux、S ymbian...)等。 .

多样性将有助于更好地深入理解它。

0 投票
3 回答
25808 浏览

performance - 多核 Intel CPU 中的高速缓存如何共享?

我有几个关于多核 CPU 或多处理器系统中使用的高速缓存存储器的问题。(虽然与编程没有直接关系,但在为多核处理器/多处理器系统编写软件时会产生很多影响,因此在这里问!)

  1. 在多处理器系统或多核处理器(英特尔四核、酷睿二双核等)中,每个 cpu 核心/处理器是否有自己的高速缓存(数据和程序高速缓存)?

  2. 一个处理器/核心是否可以访问彼此的缓存,因为如果允许它们访问彼此的缓存,那么我相信可能会有更少的缓存未命中,在这种情况下,如果该特定处理器缓存没有一些数据但其他一些数据处理器的缓存可能有它,从而避免从内存读取到第一个处理器的缓存?这个假设是否有效和真实?

  3. 允许任何处理器访问其他处理器的高速缓存内存会有什么问题吗?

0 投票
2 回答
561 浏览

cpu-cache - Shark L2 缓存分析不会采样

我正在尝试使用 Shark 来检查 L2 缓存未命中,但它不起作用。所有其他 Shark 采样模式都可以正常工作。

0 投票
4 回答
6334 浏览

caching - 读取 CPU 缓存内容

有什么方法可以读取 CPU 缓存内容吗?架构适用于 ARM。

我正在使一系列地址无效,然后想确定它是否无效。虽然我可以在有和没有无效和检查无效的情况下读写地址范围,但我想知道是否可以读取缓存内容

谢谢!!

0 投票
12 回答
8734 浏览

c++ - 是否可以将某些数据锁定在 CPU 缓存中?

我有一个问题....我在while循环中将数据写入数组。关键是我经常这样做。看来,这种写作现在是代码中的瓶颈。所以我认为这是由写入内存引起的。这个数组并不是很大(比如 300 个元素)。问题是可以这样做:仅在while循环完成后将其存储在缓存中并在内存中更新?

[编辑 - 复制自 Alex 添加的答案]


首先我要感谢大家的回答。确实,不输入代码有点愚蠢。所以我决定现在就去做。

就是这样。如果有人有任何想法,那就太好了。再一次非常感谢你。

真诚的亚历克斯

0 投票
4 回答
36718 浏览

c - 如何在 x86 Windows 中进行 CPU 缓存刷新?

我有兴趣在 Windows 中强制刷新 CPU 缓存(出于基准测试的原因,我想从 CPU 缓存中没有数据开始进行模拟),最好是基本的 C 实现或 Win32 调用。

有没有一种已知的方法可以通过系统调用甚至像说一个大的那样偷偷摸摸地做到这一点memcpy

Intel i686 平台(P4 及以上也可以)。