【发布时间】:2019-04-26 17:48:32
【问题描述】:
要获得最佳性能,请尽量减少缓存未命中。我想我们都可以同意这一点。
我的建议和想问的是以下内容。我这样说:
template <typename T>
struct {
T* a;
T* b;
T* c;
};
比这更容易受到缓存未命中的影响:
template <typename T>
struct {
T a;
T b;
T c;
};
我经常提出以下论点:尽量减少堆分配以尽量减少缓存未命中。我错了吗?
理由:来自我的工作模拟器(我编写了包括 MMU 的 PowerPC 模拟器):内存是按页或块提取的。如果您在堆栈上分配所有内容,编译器将有更好的机会将所有内容放入连续的内存块中,这意味着拉出单个页面/块将包含您的整个结构/类(假设您没有使用巨大的结构/类),因此您将有更少的缓存未命中。
当人们提到现代 CPU 中的缓存行时,我并不完全理解它们(我不知道它是否只是指多个缓存级别上的页表遍历过程)。有些人告诉我我的论点是不正确的,我不明白他们的意思。有人可以告诉我我的论点是否正确/不正确,以及在 x86/x64 架构中是否因特定原因而错误?
【问题讨论】:
-
如果不知道是否将数据一起使用,则无法决定是否将数据保存在一起。
标签: c++ c performance caching memory