我想学习如何编写更好的代码来利用 CPU 的缓存。使用连续内存似乎是理想的情况。话虽如此,我很好奇是否可以使用非连续内存进行类似的改进,但要遵循一组指针,例如:
struct Position {
int32_t x,y,z;
}
...
std::vector<Position*> posPointers;
...
updatePosition () {
for (uint32_t i = 0; i < posPointers.size(); i++) {
Position& nextPos = *posPointers[i];
nextPos.x++;
nextPos.y++;
nextPos.z++;
}
}
这只是一些粗略的模拟代码,为了正确学习,我们假设所有 Position 结构都是在整个堆中随机创建的。
英特尔 i7 等现代智能处理器能否展望未来并看到它很快就会需要X_ptr
数据?以下代码行会有帮助吗?
... // for loop
Position& nextPos1 = *posPointers[i];
Position& nextPos2 = *posPointers[i+1];
Position& nextPos3 = *posPointers[i+2];
Position& nextPos4 = *posPointers[i+3];
... // Work on data here
我读过一些演示幻灯片,这些幻灯片似乎表明这样的代码会导致处理器预取一些数据。真的吗?我知道有一些非标准的、特定于平台的方法来调用预取__builtin_prefetch
,但是到处乱扔似乎是一个丑陋的过早优化。我正在寻找一种可以下意识地编写缓存高效代码的方法。