【发布时间】:2013-11-26 02:23:28
【问题描述】:
据我所知,硬件预取器至少会检测并获取内存中的恒定步幅。此外,它可以monitor data access patterns,无论这意味着什么。这让我想知道,硬件预取器会根据存储在内存中的实际数据做出决定,还是纯粹基于程序表现出的行为?
我问的原因是因为我偶尔会使用“非本地”指针作为指针。一个简单的例子是一个预先分配的数组,以及索引这个数组的小整数而不是指针。如果我需要存储大量这样的“指针”,那么节省的内存可以快速增加,进而通过使用更少的内存间接提高缓存性能。
但据我所知,这可能会干扰硬件预取器的工作方式。或不!
我当然可以想象,不管现实与否,一个预取单元检查进入 L1 高速缓存的本地指针地址的高速缓存行,并开始将它们提取到 L2 或类似的东西中。在这种情况下,我节省内存的巧妙技巧突然变得不那么聪明了。
那么,现代硬件预取器到底是做什么的呢?它们会被“非本地”指针绊倒吗?
【问题讨论】:
-
我可能听起来很愚蠢,但什么是非本地指针?
-
在这个问题中,“本机”指针应该是一个字面意义上的保存内存地址的值。
0x1234将指向0x1234的内存。 “非本机”指针是以间接方式引用内存的值。在这种情况下,0x1234可能指的是some_array[0x1234]的内存,或者更复杂的东西,例如array = some_map[0x1234>>8]; pointer = array[0x1234&0xff]。
标签: c++ c optimization prefetch cpu-cache