使用C ++查找L1和L2缓存的大小

时间:2018-04-14 12:08:15

标签: c++ caching

我需要在Windows操作系统中使用c ++简单程序找到L1和L2缓存的大小。通过计算以不断增加的大小访问数组中元素所花费的时间,我能够在2台不同的计算机中找到L3缓存的大小。当跳跃时间很长时,我们会从缓存级别转到ram级别。

如何从这里找出L1和L2尺寸?

限制是我无法读取配置或使用内置函数来确定值。我必须时间读/写操作。

1 个答案:

答案 0 :(得分:1)

  

我需要使用c / c ++简单程序找到L1和L2缓存的大小。

一般来说,你不能(理论上)。

由于符合标准的C11实现(阅读n1570)甚至不需要在具有缓存的真实计算机上运行。同样适用于C++11或C ++ 14(阅读n3337)。

它可以运行:

  • 与人(使用一群奴隶来运行C程序将是不道德的,低效的,缓慢的,但是是可能的;在教室里使用半小时的学生是一种教学C或C ++的有趣方式 - 整个类成为C或C ++实现。)

  • 没有任何缓存的计算机上的
  • 。今天,微控制器(如Arduino)可以用C或C ++编程(并且通常是),并且没有任何缓存。

  • 在您最喜爱的x86-64笔记本电脑上。您将更好地了解英特尔和AMD处理器处理缓存的方式。

  • 关于其他事情(例如一些Power9 motherboard,一些Intel Edison,一些Raspberry Pi,一些emulator in your browser等等。你可能会有惊喜!

  

如何从这里找出L1和L2尺寸?

您可以查看生成的汇编程序代码(GCC使用g++ -O1 -fverbose-asm -S进行编译,然后查看生成的.s文件),想象一下您拥有哪种处理器和ISA,并制作一些有根据的猜测(从测量的时间)。避免要求过于强optimizations(因为您的程序可能有undefined behavior)。

在许多操作系统上,您可以使用特定于操作系统的API来查询处理器。在Linux上,您可以使用proc(5)并使用/proc/cpuinfo

如果您确实运行了程序,对它进行了几次基准测试,并给出了时间安排,那么您可以对缓存大小进行有根据的猜测(但是您需要假设您的进程没有经常安排;在非常负载的情况下系统,情况并非如此;你应该避免thrashing)。

BTW我想在as-if rule 下你的程序可能会optimized 到你没想过的事情(参见this)。请注意,在new已分配的数组中使用单元格而不初始化它们(原则上)undefined behavior(或至少unspecified behavior)。所以我相信一个足够聪明的编译器可以将你的程序优化到相当于一些abort()(或者只是保留printf)。