c – 如何最容易预取内存区域?

前端之家收集整理的这篇文章主要介绍了c – 如何最容易预取内存区域?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
背景:我实现了一种随机算法,需要随机排序才能获得最佳收敛.但是,这样做显然会破坏内存局部性.我发现通过预取下一个迭代的数据,性能下降最小化.

我可以使用_mm_prefetch以简单的,主要是OS编译器 – 可移植的方式预取n个缓存行 – 但是缓存行的长度是多少?现在,我正在使用64的硬编码值,这在x64处理器上似乎是现在的常态 – 但我不知道如何在运行时和a question about this last year found no simple solution检测到这一点.

我在Windows上看到了GetLogicalProcessorInformation,但我对使用如此简单的复杂API非常谨慎,而且无论如何都无法在mac或linux上运行.

也许还有一些完全可以预取由字节(或单词等)标识的内存区域的其他API /内部函数,并允许我在不知道缓存行长度的情况下进行预取?

基本上,使用#define CACHE_LINE_LEN 64是否有合理的_mm_prefetch替代方法

解决方法

有一个问题询问 here同样的事情.如果你想深入研究一些程序集,你可以从cpuID中读取它.当然,您必须为此编写特定于平台的代码.

你可能已经熟悉了Agner Fog的manuals for optimization,它为许多流行的处理器提供了缓存信息.如果您能够确定所遇到的预期cpu,则可以对高速缓存行大小进行硬编码,并查找cpu供应商信息以设置行大小.

猜你在找的C&C++相关文章