Linux 下如何关闭 CPU cache?

2020-07-18 11:25:02 +08:00
 vcfghtyjc

为了避免由于数据在不同层的 cache 所带来的运行时间的差异,我想要关闭 CPU cache,让所有数据都存在 DRAM 里。稍微搜索了一下,好像没什么清晰的解决方案,想问问有没有大神知道如何做。

谢谢!

10253 次点击
所在节点    Linux
108 条回复
realpg
2020-07-18 20:42:51 +08:00
@ryncsn #37
CPU 层面对于内存的使用,并不都是你主动 malloc 的分配

这是他内管理的 对于 data 的逻辑缓存 nfc 打开或者在指令传递时候打上 no cache 标志 就不会在 cache 里面留下 hot cache 但是不代表不继续使用数据和指令的 L1 以及大 L2 cache
Nadao
2020-07-18 21:46:09 +08:00
在还是 DIY 电脑为主流的年代,BIOS 里面就可以关了 L1/L2 。但关了会非常非常慢。
systemcall
2020-07-18 22:30:31 +08:00
@realpg #29
这 15 年你见过超过 400 的 X86 低端 CPU 吗?
按照价格来算,感觉一点也不低端,甚至可以算高端
在办公用 PC 的范围内讨论
lxilu
2020-07-18 23:47:22 +08:00
其他处理器加速功能呢?
vcfghtyjc
2020-07-19 00:03:09 +08:00
@dalabenba 目前我运行同一段代码多次,通过 KNN 我们可以将代码运行时间分成 4 个 clusters,cpu 的型号显示有三层 cache,我就想通过关闭 cache,观察运行时间是否还会被分为 4 个 clusters 。
vcfghtyjc
2020-07-19 00:07:17 +08:00
@Nadao 现在是否有支持关闭 L1/L2 的 BIOS 。我看到有方法是这么说的,也有人说运行状态下无法关闭 cache 。
helloworld000
2020-07-19 00:10:34 +08:00
如果是做实验的话, 最直接的办法就是每次跑这个程序的时候都重启一次电脑
vcfghtyjc
2020-07-19 00:10:53 +08:00
@realpg 看起来经过 intel 文档里的方法,数据依然会从 DRAM 经过 L3/L2/L1 cache 到 CPU ?是否可以理解为所有数据都是从 DRAM 经过 cache 到 CPU,他们移动的距离是一样的?
samuel
2020-07-19 00:13:21 +08:00
禁用了 cpu cache 的测试结果没有实际意义,没有人会这么用,因为实在是太慢了
vcfghtyjc
2020-07-19 00:13:34 +08:00
@helloworld000 是个方法。不过我的实验环境应该没有别的应用在运行(除了操作系统的),不知道会有多少提升。
helloworld000
2020-07-19 00:23:23 +08:00
@vcfghtyjc 因为当初也有过类似经历, database 的 benchmark...就是做完一次 benchmark 就重启系统

这是最直接的办法了, 没有之一
realpg
2020-07-19 00:26:15 +08:00
@vcfghtyjc #48
距离一样,但是时间是不一样的。
我其实也不是搞这个的,只是早年参与调试过 cpu bug,跟 intel 的工程师一起搞过这些东西,他们会很通俗的给你讲这些东西。
这玩意怎么理解好呢,不太正确的说,默认的情况下,cache 的一部分功能是 cpu 直接执行单元的小 ram,不需要你关心,由 CPU 决定有些汇编指令的中间存储放进去,然后还有一部分功能比如指令缓存、数据缓存,这部分就是比较字面意义的 cache 了,还有一些复杂指令本身就不是一步指令,需要中间逻辑存储,或者一切其他需要执行切换场景,就会临时性的放进去,十年前这里面的功能就很复杂了。

这玩意是没法关闭的。就好像说,我不在乎慢,我不要 RAM 了,慢点我能忍,直接操作 SSD,是没有这种接口的。
实际上,CPU 的大部分通用功能的数据进口和出口就是这个 cache 。这里面具体的细节,就得跟 intel 工程师去聊了。


楼上那个嘴硬的,他引用那个帖子,就好像,你去手机店买手机,张嘴我要 256G 内存的,店员是不会非得 SB 似的纠正你那是 256G 硬盘,不是 256G 内存,他就给你一个 8+256 的手机,他知道你要干啥,或者说,最多能干到啥地步而已。

这里面的机制基本我是粗了解,我现在也是搞运维和架构设计的,我不需要了解到 CPU 具体咋工作,但是概念一定要有,仅此而已。
vcfghtyjc
2020-07-19 00:28:14 +08:00
@helloworld000 效果和不重启比有很明显不同吗?
vcfghtyjc
2020-07-19 00:32:18 +08:00
@realpg 距离感觉占了执行时间的很大一部分。目前程序的标准差大概是 1000 ns,如果保证了距离一样是否能减少到比如几百纳秒?
vk42
2020-07-19 00:32:38 +08:00
@realpg #27 #41
本来以为是大佬,结果看你后面回复原来是民科 CPU 专家……Intel 架构中 Cache Disable 不是指令上的 flag,而是 MMU 负责的。而且 x86 架构没有办法对 Cache 直接寻址,所以你说的当 RAM 用不可能。不过除 x86 以外是有类似用法的,比如 ARM 的 TCM,就是可以直接寻址的 SRAM 缓存
reus
2020-07-19 00:33:34 +08:00
@vcfghtyjc 你要的不是禁用缓存,是每次运行代码前 flush 缓存: https://stackoverflow.com/questions/1756825/how-can-i-do-a-cpu-cache-flush-in-x86-windows 。不用重启……
realpg
2020-07-19 00:36:55 +08:00
@vcfghtyjc #54
这些细节我不了解 基本我这边的相关经历都是 10 年以前 一个涉及 intel cpu 的 cache 的硬 bug 调试 我们运维的程序 当时跟 intel 的人协作过一阵子 当时他们给粗略的讲过
vcfghtyjc
2020-07-19 00:37:51 +08:00
@vk42 我到不用把 cache 当 ram 用。看了这么多楼,已经不太懂 Intel 的 Cache Disable 到底做了什么。
vcfghtyjc
2020-07-19 00:39:47 +08:00
@reus 因为我测得是程序的一段代码块的运行时间,是否有在运行中 flush cache 的指令?还是说我应该把这段代码块摘出来,然后重复运行多次?
vcfghtyjc
2020-07-19 00:41:33 +08:00
@realpg 好的,谢谢!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/691081

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX