【秀才】Loken(2338195090) 16:29:49
请教个问题,CPU有 L1,L2,L3 高速缓存,L3那么大,有64M。C语言 或者 汇编编程,有没什么奇淫技巧,能让某个程序更好的命中高速缓存。例如把L3的一半内存拿给我的特定程序用,其他的程序分剩下的内存。
【管理员】0xAA55k3rn3l@0xaa55.com 17:02:36
SSE系列指令集有缓存相关的指令,可以用intrinsic的方式在C语言里调用,Intel有完整教程,以及Autodesk Maya的Arnold光追渲染器使用了这个技术。
不过这里的“缓存相关的指令”指的是能绕开缓存直接读写内存,而绕开缓存直接读写内存的时候,讲究一个顺序读写。因为直接操作内存的话,CPU要走一个“打开Row”“关闭Row”的时序从而产生延迟,顺序读写的过程可以保证你尽可能多地利用打开的Row。
这个绕开缓存进行读写的指令就是传说中的“SIMD流式处理”。
【管理员】0xAA55k3rn3l@0xaa55.com 17:08:53
而你在设计程序的时候,应当考虑将能够进行流式处理的部分用这种方式来写,从而让缓存更能存储你正打算用的部分。然后多用数组,少用树或者链表,就能提高缓存命中率。
【管理员】0xAA55k3rn3l@0xaa55.com 17:09:32
但最主要的是:其实在你的程序能运行的时间片里,缓存的内容基本上就没有别的程序的内容了。