BMC*_*BMC 3 c c++ optimization consolidation cpu-cache
我读过一篇2006年的文章,关于CPU如何在整个l1缓存行上进行操作,即使在你只需要用l1行包含的一小部分内容做的事情的情况下(例如,加载整个l1行来写入布尔值)变量显然是矫枉过正的).本文通过以l1缓存友好的方式管理内存来鼓励优化.
假设我有两个int恰好在内存中连续的变量,在我的代码中,我连续写入两个变量.
硬件是否将我的两个代码操作合并到单个l1行上的一个物理操作中(授予CPU具有足以容纳两个变量的l1高速缓存行),或者不是?
有没有办法在C++或C中向CPU提出这样的建议?
如果硬件没有以任何方式进行整合,那么如果在代码中实现这样的东西,你认为它可以产生更好的性能吗?分配一个大小为l1行的内存块并用尽可能多的热数据变量填充它?
缓存行的大小主要与并发性相关.它是可在多个处理器之间同步的最小数据块.
正如您所建议的那样,必须加载整个缓存行以仅在其几个字节上执行操作.如果您在同一处理器上执行多个操作,但它不需要不断重新加载它.顾名思义,它实际上是缓存的.这包括缓存对数据的写入.只要只有一个处理器访问数据,您通常可以放心,它正在高效地执行此操作.
在多个处理器访问数据的情况下,对齐数据可能会有所帮助.使用C++ alignas属性或编译器扩展可以帮助您获得以您希望的方式对齐的数据结构.
您可能对我的文章CPU重新排序感兴趣- 实际上正在重新排序的是什么?这给出了一些关于低水平发生(至少逻辑上)的见解.