Linux 下如何关闭 CPU cache?

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

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

谢谢!

10302 次点击
所在节点    Linux
108 条回复
ryd994
2020-07-19 07:16:02 +08:00
@vcfghtyjc 比如网络中断,定时器中断,这些都很常见。因为用户态其实优先级很低的,各种中断和内核线程都可以抢占。
如果线程数量少与可用的核数量的话操作系统一般不会随便把你的进程调度到其他核上。但是操作系统后台其实要干很多维护性的工作。又或者你虽然没有用这个功能,但操作系统还是默认在处理相关的逻辑。比如桌面平台为了保证用户体验,一般会把系统定时器的频率设得比较高。

具体可以看 IBM 在超算上 os jitter 相关的论文。
vcfghtyjc
2020-07-19 07:29:02 +08:00
@ryd994 因为我程序是在单机上运行的,应该不太存在网络中断,目前都是单线程,cpu 数量肯定是足够 OS 做维护的,不知道会不会是定时器中断。

HPC 上的 jitter 和普通服务器 server 应该还是有点不同的吧。因为运行在 HPC 上的程序大多依赖 MPI 做并行计算,网络应该是主要的 jitter 来源,不过也许可以看看对于单个 server 的 os jitter 吗? 有什么推荐的关键词吗?

如果我想尽量避免 OS 带来的影响,目前最轻的 Linux 发行版是什么?
ryd994
2020-07-19 08:15:46 +08:00
@vcfghtyjc 就是我上面说的。就算你不用,操作系统编译时有相应的支持,就可能有相关的后台动作,比如可能时不时的要去检查一下网卡。
hpc 上单机的 jitter 会拖慢整个集群,因为大家都在等最慢的那个同步。节点数量多了以后,小概率也变成大概率,至少有一个节点是慢的。于是整个集群就废了。
你现在就有可能是 jitter 的影响,只不过单机影响没那么大而已。
reus
2020-07-19 09:49:37 +08:00
@ryd994 我没说这叫 false sharing,我说的是“类似避免 false sharing”。
reus
2020-07-19 09:51:52 +08:00
@vcfghtyjc 任何可以手工控制内存分配的语言都可以。你居然不是用 C ?
hailinzeng
2020-07-19 09:55:31 +08:00
![different levels of approx. access times]( https://i.stack.imgur.com/xVhVi.png)
reus
2020-07-19 09:58:44 +08:00
@vcfghtyjc linux 内核本身就有实时选项,直接编译即可,不用魔改。但是具体能做到多实时,对你的场景有没有影响,还要具体试过才知道。
我很好奇为啥你要做这种程度的测量,却又不用 C 类可以精细控制内存的语言?
hailinzeng
2020-07-19 10:14:25 +08:00
L1/2 Cache 1ns
L3 Cache 10ns
Main Memory 100ns
SATA SSDs 100,000ns
HDD 5,000,000ns

https://stackoverflow.com/a/42435902
vcfghtyjc
2020-07-19 10:48:18 +08:00
@reus 被分析的程序是 Golang 写的 [捂脸]
vcfghtyjc
2020-07-19 10:49:56 +08:00
@ryd994 ok,多谢,我照这个思路去找找论文,看看有没有对单机里 jitter 因素的分析
dalabenba
2020-07-19 10:57:22 +08:00
@vcfghtyjc 我觉得这个在考虑到 cache 之前应该先考虑下 io (比如读取程序的 pagecache )造成的差异,你可以每次 bench 时候打一下火焰图,定位下函数的差异
peihanw
2020-07-19 11:13:28 +08:00
系统 BIOS 里可以禁用“DRAM Prefetch”、“CPU Core Hardware Prefetcher”、“CPU Cache Stride Prefetcher”(不同主板 BIOS 设置可能有些差异),楼主可以分别 /组合试试。对特定程序(xmrig 那类你懂的)性能会有所提升。虚拟机 /云主机都不行的,只能物理机。
reus
2020-07-19 11:26:43 +08:00
@vcfghtyjc 那没意义,go 运行时本身就做了很多事情,gc,调度都会带来额外的延迟和抖动,根本轮不到操作系统甚至 cpu 层面。建议放弃这个方向。
Aalen
2020-07-19 11:57:04 +08:00
hmmm 以前在 bios 能关缓存,依稀记得我之前有一块奔腾 4,就是二级缓存坏了,bios 关掉 cache 可以用,打开 cache Windows 蓝屏
vcfghtyjc
2020-07-19 12:09:38 +08:00
@reus 但是我用 KNN 确实见到了分层,现在不是很确定是否因为 locality 。是否有办法可以检测 Golang 带来的抖动?
reus
2020-07-19 12:13:24 +08:00
vcfghtyjc
2020-07-19 12:13:35 +08:00
@dalabenba 每次测的都是同一个 function,程序本身并不大,应该不会因为 disk IO 带来差异吧?还是说我对 IO 的理解有问题?
vcfghtyjc
2020-07-19 12:17:01 +08:00
@reus 多谢,我试试看,看看能不能分离出由语言带来的抖动吧。
jsteward
2020-07-19 13:02:03 +08:00
@imbushuo datapath 和對應的 latency 都在,不過 cacheline 不會 refill,也就是每次都 miss,效果上除了會比 dedicated datapath 稍慢,跟沒有沒有區別啦。
Gwzlchn
2020-07-19 14:48:21 +08:00
这个和我本科毕设有点像,我当时有一部分工作测量的是每条指令在太湖之光的 CPU 周期数。当然最后我也没做明白就是了。

先说一下,神威平台是两级 cache,L1 分 data cache 和 ins cache 、L2 不区分。指令集就有点像 MIPS (实际是 Alpha 指令集)
访存指令比较简单了,我当时也考虑了 CPU cache 的问题,那你两条 load/store 指令之间访问数据的距离要大于一整个 L2 cache 的大小就可以了。
最坑爹的是 add/div 之类的计算指令,这个我现在也没想出来应该怎么准确测量出来,因为现在的高级处理器都是多发射+多级流水线的。两个指令之间实际上就差一个最后的写回阶段的间隔。

这个消除流水线+多发射的影响楼主有啥好一点的思路吗?

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

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

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

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

© 2021 V2EX