如何在设计C++程序时减少可能的缓存未命中数?
内联函数每次都有帮助吗?或者只有当程序是CPU限制的时候才是好的(即程序是面向计算而不是面向I/O)?
在处理这种代码时,我喜欢以下几点.
考虑您是否需要"数组结构"或"结构数组".您要使用哪个将取决于数据的每个部分.
尝试将结构保持为32个字节的倍数,以便它们均匀地打包缓存行.
在热和冷元素中对数据进行分区.如果你有一个类o的对象数组,并且经常使用ox,oy,oz,但偶尔只需要访问oi,oj,那么请考虑将ox,oy和oz放在一起并移动i,j和k部分为平行的腋窝数据结构.
如果您拥有多维数据数据,那么使用通常的行顺序布局,沿着首选维度进行扫描时访问速度非常快,而沿着其他维度进行扫描速度非常慢.将其沿空间填充 曲线映射将有助于在任何维度中遍历时平衡访问速度.(阻塞技术类似 - 它们只是具有较大基数的Z顺序.)
如果您必须发生缓存未命中,则尝试尽可能多地使用该数据以分摊成本.
你在做什么多线程吗?注意缓存一致性协议的减速.填充标记和小计数器,以便它们位于单独的缓存行上.
英特尔的SSE提供了一些预取内在函数,如果您提前知道您将要访问的内容.
Herb Sutter有一个非常好的视频,在这里提到了这个话题
用于数据绑定操作
在列表,地图和集合上使用数组和向量
按行在列上进行处理