繁体   English   中英

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

[英]Find the size of L1 and L2 cache with C++

我需要使用Windows操作系统中的c ++简单程序查找L1和L2缓存的大小以进行分配。 通过计算以递增的方式访问数组中的元素所花费的时间,我能够在两台不同的计算机中找到L3缓存的大小。 当时间跳跃很大时,我们从缓存级别转到内存级别。

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

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

我需要使用ac / c ++简单程序查找L1和L2缓存的大小以进行分配。

通常, 您不能 (理论上)。

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

它可以运行:

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

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

  • 在您最喜欢的x86-64笔记本电脑上。 您将更好地了解有关Intel和AMD处理器处理缓存的方式的更多信息。

  • 在其他设备上(例如某些Power9主板 ,某些Intel Edison ,一些Raspberry Pi您的浏览器中的模拟器等等)。 你可能会有惊喜!

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

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

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

如果您确实运行了程序,对其进行了多次基准测试并给出了时间安排,则可以对缓存大小进行有根据的猜测(但是您需要假设您的进程没有被安排得太频繁;在负载非常大的系统上,并非如此;您应该避免颠簸 )。

顺便说一句,我猜想在常规规则下, 您的程序可能已优化为您没有想到的东西(请参阅参考资料 )。 注意,在new分配的数组中使用单元而不进行初始化是(原则上) 未定义的行为 (或至少是未指定的行为 )。 因此,我相信足够明智的编译器可以优化您的程序,使其等效于某些abort() (或仅保留printf )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM