C++缓存感知编程

Mat*_*Mat 56 c++ optimization caching cpu-cache

有没有办法在C++中确定CPU的缓存大小?我有一个处理大量数据的算法,我想将这些数据分解成块,以便它们适合缓存.这可能吗?你能否给我一些有关缓存大小的编程的其他提示(特别是在多线程/多核数据处理方面)?

谢谢!

Rob*_*nes 15

根据" 每个程序员应该了解内存的内容 ",Ulrich Drepper可以在Linux上执行以下操作:

一旦我们有了内存需求的公式,我们就可以将它与缓存大小进行比较.如前所述,缓存可能与多个其他核共享.目前{肯定会很快成为一种更好的方式!}在没有硬编码知识的情况下获取正确信息的唯一方法是通过/ sys文件系统.在表5.2中,我们已经看到了内核发布的有关硬件的内容.程序必须找到目录:

/sys/devices/system/cpu/cpu*/cache
Run Code Online (Sandbox Code Playgroud)

这在第6节:程序员可以做什么中列出.

他还描述了图6.5中的一个简短测试,如果你无法从操作系统中获取它,它可用于确定L1D高速缓存大小.

我在他的论文中还有一件事: sysconf(_SC_LEVEL2_CACHE_SIZE)在Linux上进行系统调用,它应该返回L2缓存大小,尽管它似乎没有很好地记录.


kus*_*sma 11

C++本身并不"关心"CPU缓存,因此不支持查询语言中内置的缓存大小.如果您正在为Windows开发,那么可以使用GetLogicalProcessorInformation()函数来查询有关CPU缓存的信息.


小智 8

预分配一个大型数组.然后按顺序访问每个元素并记录每次访问的时间.理想情况下,当发生高速缓存未命中时,访问时间会有所增加.然后你可以计算你的L1缓存.它可能不起作用,但值得尝试.


Tob*_*ner 4

读取 cpu (x86) 的 cpuid,然后通过查找表确定缓存大小。该表必须填写 CPU 制造商在其编程手册中发布的高速缓存大小。

  • 嘿,听起来很有趣!网上有这样的预制表格吗? (2认同)