Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 缓存C/C+中某个值的命中/未命中+;节目_C++_C_Performance_Profiling - Fatal编程技术网

C++ 缓存C/C+中某个值的命中/未命中+;节目

C++ 缓存C/C+中某个值的命中/未命中+;节目,c++,c,performance,profiling,C++,C,Performance,Profiling,这是我的要求,我知道某些算法很好地利用了缓存,有些算法没有,有些算法在特定的数据集上比其他算法做更多的I/O,等等。我希望自己看到并分析这种情况 所以我想知道是否有一种方法可以知道某个内存/变量是如何读取的,即它是从缓存中读取的,还是缓存未命中。此外,如果检索此值时出现页面错误等 非常感谢 取决于具体的编译器、操作系统和运行的处理器的具体型号。在C/C++语言中没有任何东西(据我所知)可以让您访问在缓存级别发生的事情 有各种各样的度量工具,但它们在很大程度上独立于语言 有一些“规则”可以最大限度

这是我的要求,我知道某些算法很好地利用了缓存,有些算法没有,有些算法在特定的数据集上比其他算法做更多的I/O,等等。我希望自己看到并分析这种情况

所以我想知道是否有一种方法可以知道某个内存/变量是如何读取的,即它是从缓存中读取的,还是缓存未命中。此外,如果检索此值时出现页面错误等


非常感谢

取决于具体的编译器、操作系统和运行的处理器的具体型号。在C/C++语言中没有任何东西(据我所知)可以让您访问在缓存级别发生的事情

有各种各样的度量工具,但它们在很大程度上独立于语言


有一些“规则”可以最大限度地减少缓存和分页问题,不过我需要一些时间来考虑一个合理全面的列表。

我会尝试使用,它可以打印带有注释的源代码行,其中包含该行缓存的命中/未命中数。

我不知道AMD CodeAnalyst是否可以显示该粒度级别,但检查也不会有什么坏处。

如果您真的想知道缓存何时命中/未命中,现代处理器有性能计数器,您可以完全用于此目的。我在学术研究中广泛使用了它们。使用它们最简单的方法是通过。Perfmon2既有一个可链接到程序的库,也有一个可监视现有程序的独立程序。例如,下面是记录所有级别1数据缓存读取请求和未命中的独立程序:

pfmon -eL1D_CACHE_LD:MESI,L1D_CACHE_LD:I_STATE your_program

(PDF)的附录A列出了有关可用硬件计数器的英特尔文档供参考。

您可能对这个问题感兴趣:请注意,cachegrind缓存未命中不是真正的缓存未命中,而是模拟的缓存未命中。AMD CodeAnalyst在英特尔平台上有点受限(但非常基本的方法可以工作)。因此,英特尔有英特尔Vtune;LinuxOprofile/perf/perfmon2。