2013-04-21 64 views
1

我想为C/C++中的数组动态分配一个内存块,并且这个数组将以高频率访问。所以我希望这个阵列在芯片上保持,即,在缓存中。我怎样才能明确地用C/C++中的代码来做到这一点?如何分配内存块并将其放入缓存?

+1

什么环境? C和C++在他们的标准形式中并没有真正的缓存意识。 – 2013-04-21 15:20:31

+3

你必须确定你的硬件和O/S,而任何机制将完全O/S特定的,你可能做不到在L1或L2高速缓存,你可能就不会想要么。如果内存真正在高频率使用,那么它将被频繁使用保存在缓存中。如果它没有足够频繁地用于缓存,那么如果你设法找到一种方法来颠覆缓存,那么你会伤害系统的整体性能。 – 2013-04-21 15:21:38

回答

3

没有标准的C++语言功能可以让你做到这一点。

根据您的编译器和CPU,你可以在一个汇编块使用一个特定的头号CPU指令:

T* p = new T(...); 
size_t n = sizeof(T); 
asm { 
    "CACHE n bytes at address p" 
} 

...或一些内置的编译器功能(“内在”),做这个。

您需要查阅您的CPU手册和/或编译器手册。

例如,x86 CPU有一组以PREFETCH开头的指令。

而另一个例子,GCC有一个叫__builtin_prefetch的功能。见GCC Data Prefetch Support

+1

尼斯,我不知道这个内置的功能:)现在我很想使用它;) – Caladan 2013-04-21 15:28:58

2

我不认为你可以。首先,哪个缓存? L3,L2,L1?你可以使用prefetchalign,这样它的访问就更加优化了,然后你可以定期查询它,使它保持不变,而不是LRU,但是你不能真的让它留在缓存中。

+0

你可能是对的,但有可能在OP是在支持锁定下来或者一些线条或环境中工作所有的缓存。 – 2013-04-21 15:30:14

+0

@CarlNorum:我同意,这只是我以为他的意思是只有C++或C – 2013-04-21 15:31:26

+0

这取决于你的架构。例如,在某些ARM CPU上,“缓存”处于手动控制之下,您可以使用修改过的'new'操作符专门为其分配/释放内存。 'T * t = new(fastmem)T();' – 2013-04-21 15:42:38

1

首先,您必须知道要运行代码的机器的体系结构。那么你应该检查它是否有一条指令来做这种事情。

实际上,大量使用内存会强制缓存控制器将此区域放入缓存中。

而且还有优化的三个规则,你可能需要先了解他们:) http://c2.com/cgi/wiki?RulesOfOptimization

3

我会尽量回答有点不同的角度来问。你真的需要这样做吗?即使这是一种方式,它会值得吗?想象一下,有一个“魔术”void * malloc_and_lock_in_cache(int cacheLevel)函数。你将如何处理这些数据。如果它是一个应用程序,只限于while(1)从单线程随机数组访问的循环,则由于优化和CPU体系结构,无论如何你都会有这样的行为。如果你考虑更多的真实世界的解决方案,你总是有关于访问的逻辑。例如锁定多线程,某些条件等等。问题 - 其余的应用程序算法是否如此完美,只剩下要做的就是在缓存中分配数组。

是否所有其他的访问/排序/查找功能都是先进的逻辑,不能被审查,而是获得非常有限的性能反弹,试图覆盖CPU优化。

你也考虑在原始硬件上运行没有任何操作系统的应用程序,所以你不应该关心你的分配将如何影响操作系统的行为,其余的应用程序运行?

如果您的应用程序将在虚拟机或XEN等环境中运行,会发生什么?

我记得15-18年前的一篇相似的热门话题,关于物理内存使用和磁盘缓存实用程序。确实像MS-DOS smartdrive或类似的工具这样的工具是非常有用的,并加速了很多事情。 Usenet充满了“调优建议”和性能分析,例如直写/回写设置。

尤其是如果你的DOS应用程序正在处理大量数据并实现了一些内存交换逻辑(我正在谈论时间,那么4MB内存就是奢侈品),这大部分都是戏剧,从一个角度来看,你需要尽可能多的内存你可以,但是从另一个角度来看,你需要换,所以你实际上需要交换,但交换经历高速缓存等。

但接下来发生的事。我们拥有VM386模式,集成到操作系统中的磁盘缓存/内存交换,以及谁在关注调整smartdrive/ramdisk等内容。总的来说,分配尽可能多的虚拟机然后实现自己的voodoo算法来交换物理内存块(虽然这个功能仍然在WinAPI中)。

所以,我真的建议专注于算法和应用程序的设计工作而不是尝试,直到你不开发一些新的微内核操作系统使用一些非常低的水平与特点真的不可预知的结果。