我使用asm dcbt
命令触摸我知道执行某些计算所需的内存范围。我的探查器显示缓存未命中模式,因为偶尔访问此范围内的元素(触摸4次,跳过5次等等 - 每次第5次操作产生缓存未命中)。
有一个函数A()
可以访问确切的范围及其大小。此A()
函数在另一个部分之前调用,该部分也将触及并使用A()
范围内的数据。我可以在dcbt
中使用A()
,然后期望B()
,或的改进我是否必须使用{{1在使用该数据集合的同一函数中的范围?
答案 0 :(得分:3)
假设A()
中使用的所有数据都适合缓存,您应该会看到B()
的改进。但是,您也可以最终将数据读入未使用的缓存中,这对任何事情都没有任何意义,只有当内存总线可用于加载某些所需的ACTUAL数据时才会导致内存总线繁忙,如果你的模式和你说的一样零星。一定要尝试一下,但不要指望它有效地神奇地工作 - 它通常需要一些“调整” - 特别是关于“你现在在多大程度上读取数据”。
取决于A()
和B()
的确切行为,例如,如果您在读取和写入之间切换,并从一个部分读取并写入完全不同的部分,则将写入批处理一个“保持区域”,然后被复制到RAM通常是一个很好的计划 - 使保持区域类似于L1缓存的1 / 8-1 / 4。
[警告:我对PowerPC架构完全没有任何经验,但我在使用x86处理器时使用了缓存预取和其他内存优化技术,有时会取得一些成功,而在其他时候却没有那么成功]