问题标签 [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.
tlb - 英特尔处理器可以延迟 TLB 失效吗?
这参考了 InteI 的软件开发人员手册(订单号:325384-039US 2011 年 5 月),第 4.10.4.4 节“延迟无效”描述了 TLB 条目无效的潜在延迟,这可能在访问其分页结构条目的内存时导致不可预测的结果已经变了。
手册说……“在某些情况下,所需的失效可能会延迟。软件开发人员应该明白,在修改分页结构条目和执行第 4.10.4.2 节中推荐的失效指令之间,处理器可以使用转换基于分页结构条目的旧值或新值。以下项目描述了延迟失效的一些潜在后果: 如果修改分页结构条目以将 R/W 标志从 0 更改为 1,对由该条目控制其翻译的线性地址的写访问可能会也可能不会导致页面错误异常。 ”
让我们假设一个简单的情况,其中针对线性地址修改了页面结构条目(r/w 标志从 0 翻转到 1),然后立即调用相应的 TBL 无效指令。我的问题是——作为 TLB 延迟失效的结果,即使在调用 TLB 失效后,对相关线性地址的写访问也不会出错(页面错误)?
还是说“延迟失效”只能在页面结构发生变化的线性地址的“失效”指令没有发出时才会导致不可预知的结果?
java - 在 CyclicBarrier 或 CountDownLatch 上缓存刷新,就像使用同步关键字时一样
是否有某种方法可以确保 java 刷新在 CyclicBarrier 或 CountDownLatch 允许我们在不使用 synchronized 关键字的情况下继续(如 synchronized 关键字一样)之前完成的写入缓存?
caching - 什么是参考地点?
我在理解参考位置时遇到问题。谁能帮助我理解它的含义和含义,
- 参考空间位置
- 参考的时间局部性
linux-kernel - 缓存禁用后的 mcr 指令
将 arm 视为平台,将 Linux 视为使用的操作系统。
考虑通过在内核配置中启用 CONFIG_CPU_DCACHE_DISABLE 来禁用缓存。此选项基本上禁用 L1 缓存。禁用L1缓存显然会禁用L2缓存?
在此之后,任何 mcr 指令都不会对缓存产生任何影响。这意味着任何 dma_cache_maint() 操作都相当于 NULL?
链接:http://lxr.linux.no/#linux+v2.6.35/arch/arm/kernel/head.S#L166
hibernate - Hibernate 通过 List Direct 中的主键查找 L2 缓存
我有一个带有简单长主键的实体。我做了一个查询,例如:从表中选择 primary_key IN (....);
Hibernate 似乎想要进行查询以获取 Id(我刚刚指定!),然后转到 L2 缓存。有没有办法跳过初始查询?我只想要一组按主键的实体。不确定这是 JPA 1 还是 JPA 2.0(更好地支持列表)。
我可以在循环中执行 findById() 并获得所需的结果,但这显然不是最佳的。
c - 多次对函数进行基准测试 - 第一次之后的所有调用都被指令缓存?
我正在用 C 编写一个小型基准测试库,用于对单个函数进行基准测试。它的工作方式是为基准测试函数提供一个指向void
没有参数的函数的指针和迭代次数。然后该函数返回一个struct
带有关于的信息
但是,在查看单个结果时,我发现第一次调用占用了很多时间,然后调用之后占用了很少的时间。
所以我想知道:
- 这是由于指令缓存吗?
- 如果第一个问题是肯定的,基准测试工具通常如何符合这一点?排除第一个电话吗?
- 如果第一个问题是肯定的,是否存在未将缓存应用于函数的情况?
- 如果第一个问题是肯定的,缓存是否发生在整个函数或函数的片段上?
- 如果第一个问题是肯定的,还有什么我应该考虑我应该阅读并更好地理解的吗?
数据和代码
检索时间的函数:
测试结果:
没有优化标志的结果:
正在测试的函数会产生这个结果:
制作文件:
包含所有代码的 Github 存储库:
https://github.com/Ancide/TinyBench
编辑:忘记提及编译器和编译器标志
编辑 2:为所有代码添加了 git repo,以防有人想查看所有内容
编辑 3:添加了没有 O2 标志的结果
c++ - CPU 缓存感知 C++/C 编程
我正在浏览 Scott Meyer 的关于CPU 缓存和你为什么关心的播客似乎这会使代码运行得更快,是否有任何开源代码可供参考。或者任何人都有基于数据结构/算法设计的示例CPU caches aware
operating-system - 缓存中“块大小”的概念
我刚刚开始学习直接映射和设置关联缓存的概念。我有一些非常基本的疑问。开始。
假设地址是 32 位长,我有一个 32KB 的缓存,64Byte 块大小和 512 帧,“块”内实际存储了多少数据?如果我有一条从内存位置的值加载的指令,并且该值是 16 位整数,那么 64 字节块之一现在是否仅存储 16 位(2 字节)整数值。块中的其他 62 个字节呢?如果我现在有另一个加载指令,它也加载一个 16 位整数值,这个值现在根据加载地址进入另一个帧的另一个块(如果地址映射到前一条指令的同一帧,那么前一个值被逐出并且该块再次仅在 64 个字节中存储 2 个字节)。正确的?
如果这似乎是一个非常愚蠢的疑问,请原谅我,这只是我想正确理解我的概念。
optimization - 每个程序员都应该知道关于内存的什么?
我想知道 Ulrich Drepper 的What Every Programmer Should Know About Memory从 2007 年起仍然有效。我也找不到比 1.0 更新的版本或勘误表。
(也可以在 Ulrich Drepper 自己的网站上找到 PDF 格式:https ://www.akkadia.org/drepper/cpumemory.pdf )
tags - 如何计算 CPU 缓存的标记位、索引字段的大小?
我正在编写一个 CPU 缓存模拟器,它将获取缓存的大小(以字节为单位)、每个缓存行的长度(以字节为单位)以及缓存中的集合/组的数量。
我已经写了大部分内容,但是几个小时以来我一直在苦苦挣扎的是弄清楚我需要向左/向右移动多少位才能提取给定地址的标签和索引字段。
例如,给定地址48,我需要确定标签和索引。
这是我提取标签的内容,但我很确定它不正确。