Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.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++_Caching - Fatal编程技术网

C++ 分析指令缓存未命中

C++ 分析指令缓存未命中,c++,caching,C++,Caching,我想为代码中的每个非内联函数f()构造一个指令缓存惩罚直方图。因此,如果我的代码中总共有k个非内联函数,我需要k个单独的直方图。我想知道是否有任何已知的解决方案 对于任何一个特定函数f1()来说,一种简单的方法是在代码中查找对f1()的所有调用,在调用之前记录一个时间戳值,并在f1()的开始处记录一个时间戳,构建差异的直方图。它需要添加(n+1)行新代码,其中n是调用f1()的次数 我基本上想要一个可扩展版本的这个简单的解决方案。根据您的操作系统和处理器,有更精确的解决方案可用。如果您在linu

我想为代码中的每个非内联函数
f()
构造一个指令缓存惩罚直方图。因此,如果我的代码中总共有k个非内联函数,我需要k个单独的直方图。我想知道是否有任何已知的解决方案

对于任何一个特定函数
f1()
来说,一种简单的方法是在代码中查找对
f1()
的所有调用,在调用之前记录一个时间戳值,并在
f1()
的开始处记录一个时间戳,构建差异的直方图。它需要添加(n+1)行新代码,其中n是调用
f1()
的次数


我基本上想要一个可扩展版本的这个简单的解决方案。

根据您的操作系统和处理器,有更精确的解决方案可用。如果您在linux上,请使用
perf\u events
。它为PMU事件提供了良好的接口。您可以使用它来获取icache未命中的精确计数,并对这些事件上的堆栈快照进行采样,以确定发生icache未命中的位置。

我使用过perf,但据我所知,它只报告一个icache未命中计数值。将该计数中的增量属性赋予某个特定函数似乎很重要。如果您使用的是足够新的内核,请尝试
perf record-e--call graph dwarf
。如果没有,则需要使用调用图fp并在不忽略帧指针的情况下构建应用程序。例如,如果您使用的是gcc,编译器选项将是
-fno ommit frame pointer
。我还没有机会尝试它,但会在尝试时报告。看起来很有希望