问题标签 [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 投票
1 回答
1160 浏览

arm - ARM11对缓存有什么改进

据说在ARM11中,Cache是​​物理寻址的,解决了很多缓存别名问题,减少了上下文切换开销

如何理解物理地址?它如何帮助解决缓存别名问题并减少上下文切换开销?

0 投票
2 回答
1063 浏览

cpu-cache - 获取 2 种不同的 L1 icache 行大小

我在我的 PC 上使用 Ubuntu 12.04 和 intel i5 450。我使用了两种方法来获取一级指令缓存的缓存行大小。但结果不同。

有什么不对?太混乱了。

0 投票
2 回答
226 浏览

java - 在读取和写入方面的休眠性能

hibernate 在读写方面是如何工作的:

  1. 如果应用程序对 DB 进行更多写入,hibernate 是如何工作的?在这种情况下,我知道每次写入都必须刷新缓存,除此之外是任何性能开销(与 JDBC 相比)

  2. 如果应用程序只读取数据(非常少的写入/更新),休眠如何工作?在这种情况下,由于不需要刷新缓存,我们可以期望 hibernate 的性能与 JDBC 一样好(或更好)(如果调整得当)。

另外,想了解在 case2 中使用的最佳选项(除了 ORM)。

0 投票
1 回答
4336 浏览

cpu - Sandy-Bridge CPU 规格

我能够在这里和那里汇总有关 Sandy Bridge-E 架构的一些信息,但我并不完全确定所有参数,例如 L2 缓存的大小。任何人都可以确认他们都是正确的吗?我的主要来源是64-ia-32-architectures-optimization-manual.pdf

在此处输入图像描述

0 投票
3 回答
1901 浏览

java - 用于分析 Java 应用程序的 CPU 缓存性能的工具?

我对操作系统没有偏好;任何工具都可以,只要它允许我测量 Core 2 和 i7 架构上的缓存性能。

0 投票
2 回答
401 浏览

x86-64 - 预取写入是否会影响单核性能?

某些架构具有“预取写”指令,以在实际执行之前向 CPU 指示您将要写入内存位置。我知道在多核机器上,核心可以使用这作为提示,它现在应该尝试获取给定缓存行的所有权,以便以后可以更快地写入该位置。但是,AFAICT 仅在有两个内核可能竞争缓存线的情况下才有意义。对于仅由单个内核读取和写入的高速缓存行,预取写入是否有任何用处?

0 投票
3 回答
2081 浏览

performance - 关于超线程中 L1 缓存的自适应模式

我是一名最近在研究超线程的学生。我对这个特性有点困惑——L1 数据缓存上下文模式。

架构优化手册中,描述了 L1 缓存可以在两种模式下运行:

  • 一级缓存可以根据上下文 ID 位以两种模式运行:

    1. 共享模式:L1 数据缓存由两个逻辑处理器完全共享。

    2. 自适应模式:在自适应模式下,使用页目录的内存访问在共享 L1 数据缓存的逻辑处理器之间进行相同的映射。

但是,我很好奇缓存如何根据描述在自适应模式下进行分区。

0 投票
5 回答
5521 浏览

java - 如何在C和java中产生cpu缓存效果?

在 Ulrich Drepper 的论文What every developer should know about memory中,第 3 部分:CPU Caches,他展示了一个图表,显示了“工作集”大小和每个操作消耗的 cpu 周期之间的关系(在这种情况下,顺序读取)。图中有两个跳跃,分别表示 L1 缓存和 L2 缓存的大小。我编写了自己的程序来重现 c 中的效果。它只是简单地从头到尾顺序读取一个 int[] 数组,我尝试了不同大小的数组(从 1KB 到 1MB)。我将数据绘制成图表,没有跳跃,图表是一条直线。

我的问题是:

  1. 我的方法有问题吗?产生cpu缓存效果的正确方法是什么(查看跳转)。
  2. 我在想,如果是顺序读取,那么它应该是这样操作的:当读取第一个元素时,它是缓存未命中,并且在缓存行大小(64K)内,会有命中。在预取的帮助下,读取下一个缓存行的延迟将被隐藏。它将连续读取数据到 L1 缓存,即使工作集大小超过 L1 缓存大小,它也会驱逐最近最少使用的数据,并继续预取。所以大部分缓存未命中将被隐藏,从 L2 获取数据所消耗的时间将隐藏在读取活动的后面,这意味着它们是同时操作的。关联性(在我的例子中是 8 种方式)将隐藏从 L2 读取数据的延迟。那么,我的程序现象应该是正确的,我错过了什么吗?
  3. 是否有可能在java中获得相同的效果?

顺便说一句,我在linux中这样做。


编辑 1

感谢 Stephen C 的建议,这里有一些额外的信息:这是我的代码:

在 main() 函数中,我尝试了从 1KB 到 100MB 的数组大小,仍然相同,每个元素的平均耗时为 2 纳秒。我认为时间是L1d的访问时间。

我的缓存大小:

L1d == 32k

L2 == 256k

L3 == 6144k


编辑 2

我已将代码更改为使用链表。

最后,我将打印出 globalSum 以避免编译器优化。如您所见,它仍然是顺序读取,我什至尝试了高达 500MB 的数组大小,每个元素的平均时间约为 4 纳秒(可能是因为它必须访问数据'pad'和指针' n', 两次访问), 与 1KB 的数组大小相同。所以,我认为这是因为像预取这样的缓存优化很好地隐藏了延迟,对吗?我会尝试随机访问,稍后再放上结果。


编辑 3

我尝试了对链表的随机访问,结果如下: 随机访问一个链表

第一条红线是我的 L1 缓存大小,第二条是 L2。所以我们可以看到那里有一点跳跃。有时延迟仍然被很好地隐藏起来。

0 投票
3 回答
3506 浏览

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

CUDA 2.0 设备上是否有任何方法可以仅为一个特定变量禁用 L1 缓存?我知道可以在编译时禁用 L1 缓存,为所有内存操作添加-Xptxas -dlcm=cg标志nvcc。但是,我只想对特定全局变量的内存读取禁用缓存,以便所有其余的内存读取都通过 L1 缓存。

根据我在网络上进行的搜索,可能的解决方案是通过 PTX 汇编代码。

0 投票
1 回答
90 浏览

arm - 使用什么算法来确定数据是否可在 ARM Cortex-M0 中缓存(由 HPROT[3] 信号位显示)

如上所述,ARM Cortex-M0 的 HPROT[3] 信号告诉您总线上的数据是否可缓存。MC是怎么决定的?