这是我的疯狂猜测: 缓存
可能是您可以将2行2000
doubles放入缓存中。略小于32kb L1缓存。(同时留出其他必要的空间)
但是,当您将其增加到2048时,它将使用 整个 缓存(并且由于需要其他空间而浪费了一些缓存)
假设高速缓存策略是LRU,则将高速缓存仅溢出一小部分将导致整个行被重复刷新并重新加载到L1高速缓存中。
另一种可能是由于2的幂导致的缓存关联性。尽管我认为处理器是2路L1关联的,所以在这种情况下我认为这并不重要。(但我还是会把这个想法丢掉)
可能的解释2: 由于L2缓存上的超对齐,冲突缓存未命中。
您的
B数组正在列上进行迭代。这样访问就大步向前。
2k x 2k每个矩阵的总数据大小约为32 MB。这比您的L2缓存大得多。
当数据不完全对齐时,您将在B上具有适当的空间局部性。尽管您要跳行并且每个高速缓存行仅使用一个元素,但是高速缓存行仍保留在L2高速缓存中,以供中间循环的下一次迭代重用。
但是,当数据完全对齐(2048)时,这些跃点将全部落在相同的“缓存方式”上,并且将远远超过您的L2缓存关联性。因此,所访问的缓存行
B不会在下一次迭代中保留在缓存中。
相反,它们将需要从ram一直拉出。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)