今年有很多关于矢量和对象值数组的重要性的视频/教程/讲座可以存储在缓存中。然而,我还没有找到任何信息如何确保从给定的posiotion左/右的N个向量元素确实被加载(不是一个,但至少说16个)? Boost中是否有任何包装器api或编译器特定的预定义宏?
答案 0 :(得分:2)
此视频将向您解释缓存以及程序执行时发生的情况。它还教你如何最好地编程缓存友好。
编辑:
基本上,当你加载一个已经不在缓存中的变量时,CPU将加载到一大块RAM中并包括你当时正在使用的内容,这个加载的内存是缓存线。如果您随机使用不在RAM中的变量(例如链接列表),则每次进入下一个需要时间的节点时都会加载一个缓存行。
在顺序存储存储器的数据结构中,即。矢量或数组。您接下来要使用的数据很可能已经在缓存行中,您不必离开cpu缓存以获取值
如果您正在迭代顺序数组,那么您将利用所有缓存行并且还具有预处理友好性(CPU将尝试猜测您将在下一次使用的内存,如果您&# 39;重新迭代一个顺序数组,CPU将预取下一个缓存行,这样你需要的数据就会在你要求之前就已存在。)
缓存行的大小可能会有所不同,但我相信它主要是64字节,这取决于CPU。所有这些都是在CPU上执行的,而无需您的程序知道。编译器无法控制缓存。
答案 1 :(得分:0)
不同的处理器具有不同数量的缓存和不同的管理方式,并且可能有其他进程与您的进程同时运行并竞争缓存空间,因此您无法保证数据将是在任何特定时间的缓存中。您可以做的最好的事情是以有助于缓存的方式将数据安排在RAM中。
当您的数据是连续的,在数组或向量中时,相邻的值通常属于同一个缓存行,因此当处理器从RAM中获取一个值时,它会同时将其他一些值加载到缓存中作为副作用。如果你的程序很快就会使用那些相邻的值,那么它们可能(不保证)仍然在缓存中。