在 Linux 上以编程方式获取准确的 CPU 缓存层次结构信息

2024-03-18

我试图获得 Linux 上当前 CPU 的数据缓存层次结构的准确描述:不仅是各个 L1/L2/L3(可能还有 L4)数据缓存的大小,还包括它们在不同系统之间分割或共享的方式核心。

例如,在我的 CPU (AMD Ryzen Threadripper 3970X) 上,每个核心都有自己的 32 KB 的 L1 数据缓存和 512 KB 的 L2 缓存,但 L3 缓存在核心复合体 (CCX) 内的核心之间共享。换句话说,有 8 个不同的 L3 缓存,每个缓存 16 MB。

Windows 上的 CPU-Z 屏幕截图的“缓存”部分基本上就是我想要找出的内容:

我在 Windows 上获取这些信息没有问题GetLogicalProcessorInformation() https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getlogicalprocessorinformation.

然而,在Linux上,似乎sysconf()只提供 L1 和 L2 数据缓存的每核心缓存大小(_SC_LEVEL1_DCACHE_SIZE and _SC_LEVEL2_DCACHE_SIZE),或总 L3 缓存大小(_SC_LEVEL3_CACHE_SIZE).

编辑:lstopo 的输出在VMWare下。虚拟机有8个核心。 L1 和 L2 缓存信息很好,但 L3 缓存大小似乎不正确:


通过打开以下文件,可以以编程方式找到缓存层次结构的完整图片/sys(系统文件系统)。

每个“线程”或“逻辑处理器”由一个子目录表示/sys/devices/system/cpu/。在该目录中,您将找到一个缓存目录。例如,可以在此处找到第一个逻辑处理器的缓存信息:

$ ls /sys/devices/system/cpu/cpu0/cache/
index0
index1
index2
index3
power
uevent

与该逻辑处理器关联的每个缓存实体由一个index[0-9]*目录。索引后的数字does not代表水平。相同的高速缓存实体可以在不同的逻辑处理器下多次列出。在这些目录中,您可以找到缓存实体的所有属性(级别、集合、行大小等)。

$ ls /sys/devices/system/cpu/cpu0/cache/index0
coherency_line_size
level
number_of_sets
physical_line_partition
power
shared_cpu_list
shared_cpu_map
size
type
uevent
ways_of_associativity

可以找到完整的文档here https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-system-cpu.

最重要的是,为了获得您想要的输出,您需要检查shared_cpu_list:

$ cat /sys/devices/system/cpu/cpu0/cache/index0/shared_cpu_list
0,28

这将向您显示哪些逻辑处理器共享此缓存实体。通过检查所有实体(/sys/devices/system/cpu/cpu*/cache/index*/),并使用消除重复项shared_cpu_list,您可以通过编程方式访问所需的所有数据。

请注意,您的虚拟机管理程序不需要传递准确的信息。这只会显示来宾内核看到的缓存层次结构。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Linux 上以编程方式获取准确的 CPU 缓存层次结构信息 的相关文章

  • 将处理后的图形绘制到另一个图形中

    我想将一个经过处理的图形绘制到另一个图形中 I have two graphics var gHead Graphics FromImage h var gBackground Graphics FromImage b Transform
  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • 添加对共享类的多个 WCF 服务的服务引用

    我正在尝试将我的 WCF Web 服务拆分为几个服务 而不是一个巨大的服务 但是 Visual Studio Silverlight 客户端 复制了两个服务共享的公共类 这是一个简单的例子来说明我的问题 在此示例中 有两个服务 两者都返回类
  • 为什么 BOOST_FOREACH 不完全等同于手工编码的?

    From 增强文档 http www boost org doc libs 1 48 0 doc html foreach html foreach introduction what is literal boost foreach li
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 为什么 std::allocator 在 C++17 中丢失成员类型/函数?

    一边看着std 分配器 http en cppreference com w cpp memory allocator 我看到成员 value type pointer const pointer reference const refer
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • std::bind 重载解析

    下面的代码工作正常 include
  • C# 搜索目录中包含字符串的所有文件,然后返回该字符串

    使用用户在文本框中输入的内容 我想搜索目录中的哪个文件包含该文本 然后我想解析出信息 但我似乎找不到该字符串或至少返回信息 任何帮助将不胜感激 我当前的代码 private void btnSearchSerial Click object
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 运行代码首先迁移更新数据库时出错

    我在迁移到数据库时遇到问题 并且似乎找不到我遇到的错误的答案 System MissingMethodException Method not found System Data Entity Migrations Builders Tab
  • 如何在 GCC 5 中处理双 ABI?

    我尝试了解如何克服 GCC 5 中引入的双重 ABI 的问题 但是 我没能做到 这是一个重现错误的非常简单的示例 我使用的GCC版本是5 2 如您所见 我的主要函数 在 main cpp 文件中 非常简单 main cpp include
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • boost::program_options:带有固定和可变标记的参数?

    是否可以在 boost program options 中使用此类参数 program p1 123 p2 234 p3 345 p12 678 即 是否可以使用第一个标记指定参数名称 例如 p 后跟一个数字 是动态的吗 我想避免这种情况
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens

随机推荐

  • php中如何检测ajax跨域请求

    对于普通的ajax请求我使用 strtolower SERVER HTTP X REQUESTED WITH xmlhttprequest 但这不适用于跨域请求 我能怎么做 Edit2 如果您以这种方式使用 jQuery ajax 函数 v
  • PHP 命名空间自动加载必须使用文件夹吗?

    我对在 php 中实现命名空间感到非常困惑 尤其是在别名导入类方面 我已经按照本教程中的教程进行操作 利用 PHP V5 3 命名空间实现可读且可维护的代码 http www ibm com developerworks opensourc
  • 带有可选字段的 JPA 存储库 findAll

    我有一个控制器尝试使用可选字段进行搜索 JPA实体类定义为 package demo import javax persistence Entity public class UploadFile Id GeneratedValue str
  • 安全策略文件和jar

    我有 RMI 应用程序 所以我需要使用策略文件 我的策略文件很简单 conf txt grant permission java security AllPermission 我从 eclipse 运行我的应用程序没有任何问题 我已将 Dj
  • HTML5、Canvas 和 FireFox

    我对下面所示的 HTML5 Canvas 代码有几个问题 该文本不会出现在 Firefox 3 6 中 它会出现在 Chrome 中 关于 ctx 变量 ctx c getContext 2d 是否应该反复重用该变量以在同一画布上创建其他矩
  • 现代 Fortran:无标签的输出格式

    我正在寻找一种不使用标签来指定输出格式的方法 为了理解我的意思 用标签 write 1001 icount x y 1001 format i5 f5 2 e12 3 没有标签应该是我放的format i5 f5 2 e12 3 在 wri
  • 为什么 User.Identity 不包含 ClaimsTypes 的完整列表?

    我正在开发 ASP NET Core Web 应用程序 我的 dotnet 版本是 3 1 401 我使用的是 Visual Studio Community 2019 版本 16 7 2 我在没有 ASP NET Core Identit
  • HTML 电子邮件在 Google Apps/Gmail 中无法正确显示

    我的 Web 应用程序向用户发送基于 HTML 的电子邮件 我创建了一个 HTML 电子邮件模板 基于 MailChimp 提供的模板 据说该模板可以在任何浏览器 电子邮件客户端中使用 当我使用发送它时SendGrid 它到达并完美地显示在
  • “tsc --out ... --declaration”不包括自定义接口

    Setup假设我们有两个文件 A ts 和 B d ts 现在在 A 里面我们有 class A implements B 现在假设我想将所有打字稿文件合并到一个单一的定义文件中 我知道如何执行此操作的唯一方法是创建一个 js 文件 然后创
  • 错误:任务“:app:dexDebug”执行失败。使用 Facebook Fresco 以非零退出值 2 完成

    我在这里阅读了有关此问题的每一条线索 但找不到我的问题的任何答案 添加 Fresco 库后 我在构建应用程序时收到此错误 有问题的行是 compile com facebook fresco fresco 0 5 3 错误 错误 任务 ap
  • 8位到16位转换

    我有一张捕获 8 位的图像 我正在寻找将 8 位值转换为 16 位值 我用了以下 short temp16 short val i lt lt 8 where val是一个 8 位样本的数组 上面的说法引起了噪音 有人能建议一种8位到16位
  • 将短整型复制到 char 数组

    我有一个名为 s int 的短整型变量 它的值 2 unsighed short s int 2 我想将此数字复制到字符数组的第一个和第二个位置 假设我们有char buffer 10 我们想要两个字节s int复制于buffer 0 an
  • 登录我的帐户时,Telethon 不断将我注销。电报、Python

    该代码似乎运行完美 在我最终再次注销之前 我什至有时间用机器人对其进行了短暂的测试 此时我已经尝试了大约 10 次 但 Telethon 似乎出于某种原因将我从手机上的 Telegram 中删除了 我不知道为什么会发生这种情况 而且我也没有
  • 当我使用 Objective-C 中定义的宏时,Swift 条件编译无法正常工作

    我在 Objective C 头文件中定义了一个简单的宏 并通过项目桥接头文件将该头文件导入到 Swift 中 我能够在 Swift 中使用这个宏作为常量 但是当我使用它进行条件编译时 它无法正常工作 我在 Xcode 10 2 1 中创建
  • 如何在 gtk 中将小部件作为不同的线程加载? (瓦拉)

    我创建了这个类 出于效率原因 我想将缩略图作为不同的线程加载到图标视图中 因为如果我在同一个线程中执行此操作 GUI 加载速度会非常慢 但是当我创建线程时 它不起作用 它绘制了一些缩略图 然后它们就消失了 当我使用 join 时 它有效 这
  • 如何在 Mongoid 中更改文档的 _type?

    我在 Rails 应用程序中有以下模型 class User include Mongoid Document end class Admin lt User end 我得到一个用户 u User find some key 并尝试更改 t
  • 在 API 蓝图中表示文件上传

    我们有一个 API 端点 可以在其中上传图像文件以及文件名 字符串 和描述 字符串 养蜂场 API 蓝图不允许我拥有类似的东西 Request multipart form data Headers Authorization key At
  • Java 中最好的可调整大小的循环字节缓冲区是什么?

    我需要 Java 中的字节缓冲区类以供单线程使用 我应该能够在缓冲区后面插入数据并在前面读取数据 摊销成本为 O 1 缓冲区在满时应该调整大小 而不是抛出异常或其他东西 我可以自己写一个 但如果标准 Java 包中尚不存在这个 我会感到非常
  • 我可以覆盖 test_helper.rb 中的任务:环境来测试 rake 任务吗?

    我在 Rakefile 中有一系列 rake 任务 我想将其作为我的规范等的一部分进行测试 每个任务都以以下形式定义 task do somthing gt environment do Do something with the data
  • 在 Linux 上以编程方式获取准确的 CPU 缓存层次结构信息

    我试图获得 Linux 上当前 CPU 的数据缓存层次结构的准确描述 不仅是各个 L1 L2 L3 可能还有 L4 数据缓存的大小 还包括它们在不同系统之间分割或共享的方式核心 例如 在我的 CPU AMD Ryzen Threadripp