我需要找到L1和L2缓存的大小,以便在Windows操作系统中使用c++简单程序进行赋值。我能够在两台不同的计算机中找到L3缓存的大小,方法是计算访问数组中的元素所需的时间。当时间的跳变很大时,我们就从缓存级别转到ram级别。
如何从这里计算出L1和L2的大小?
限制是我不能读取配置或使用内置的函数来确定值。我必须用时间代替读/写操作。
发布于 2018-04-14 12:11:31
我需要找到使用c/c++简单程序进行赋值的L1和L2缓存的大小。
一般来说,不能(理论上)。
由于符合标准的C11实现(read n1570)甚至不需要在具有缓存的真正计算机上运行。同样,对于C++11或C++14 (读n3337)。
它可以运行:
如何从这里计算出L1和L2的大小?
您可以查看生成的汇编程序代码(使用GCC编译使用g++ -O1 -fverbose-asm -S
,然后查看生成的.s
文件),想象一下您拥有什么样的处理器和ISA,并进行一些有教养的猜测(根据测量的时间)。避免询问太强的优化 (因为您的程序可能有未定义行为)。
在许多OSes上,您可以使用操作系统特定的API来查询处理器。在Linux上,您可以使用proc(5)和/proc/cpuinfo
。
如果您确实运行了您的程序,对其进行了几次测试,并给出了时间,您可以对缓存大小进行合理的猜测(但您需要假设您的进程没有被安排得太频繁;在非常加载的系统上,情况并非如此;您应该避免使用痛击。
顺便说一句,我猜在以此类推 下,您的程序可能是 优化,您没有想过(参见这)。注意,在new
分配的数组中使用单元格而不初始化它们(原则上)是未定义行为 (或者至少是未指定行为)。因此,我相信一个足够明智的编译器可以将您的程序优化为相当于某些abort()
的程序(或者只保留printf
)。
https://stackoverflow.com/questions/49831274
复制相似问题