我可以"force" Cachegrind 来分析操作(或行)吗?
Can I "force" Cachegrind into analyzing an operation (or line)?
我正在对两种搜索算法的缓存行为进行基准测试,这两种算法使用Cachegrind对一系列排序项目进行操作。一个向量中有n个项,另一个向量包含所有有效索引。我对第二个向量使用std::random_shuffle,然后对第一个向量中的项执行n次成功查找。我基准测试的功能大致如下:
template <typename Iterator>
void lookup_in_random_order(Iterator begin, Iterator end)
{
const std::size_t N = std::distance(begin, end);
std::vector<std::size_t> idx(N);
std::iota(idx.begin(), idx.end(), 0);
std::srand(std::time(0));
std::random_shuffle(idx.begin(), idx.end());
// Warm the cache -- I don't care about measuring this loop.
for(std::size_t i = 0; i < N; ++i)
my_search(begin, end, idx[i]);
std::random_shuffle(idx.begin(), idx.end());
// This one I would care about!
for(std::size_t i = 0; i < N; ++i)
{
int s = idx[i];
// Especially this line, of course.
my_search(begin, end, s);
}
}
我用g++(用-g和-O2)编译代码。我运行Cachegrind,然后运行cg_annote。我得到了如下内容:
Ir I1mr ILmr Dr D1mr DLmr Dw D1mw DLmw
. . . . . . . . . template <typename Iterator>
17 2 2 0 0 0 6 0 0 void lookup_in_random_order(Iterator begin, Iterator end)
. . . . . . . . . {
. . . . . . . . . const std::size_t N = std::distance(begin, end);
. . . . . . . . . std::vector<std::size_t> idx(N);
. . . . . . . . . std::iota(idx.begin(), idx.end(), 0);
. . . . . . . . .
4 0 0 0 0 0 2 1 1 std::srand(std::time(0));
. . . . . . . . . std::random_shuffle(idx.begin(), idx.end());
. . . . . . . . .
3,145,729 0 0 0 0 0 0 0 0 for(std::size_t i = 0; i < N; ++i)
. . . . . . . . . my_search(begin, end, idx[i]);
. . . . . . . . .
. . . . . . . . . std::random_shuffle(idx.begin(), idx.end());
. . . . . . . . .
3,145,729 1 1 0 0 0 0 0 0 for(std::size_t i = 0; i < N; ++i)
. . . . . . . . . {
1,048,575 0 0 1,048,575 132,865 131,065 0 0 0 int s = idx[i];
. . . . . . . . . my_search(begin, end, s);
. . . . . . . . . }
7 0 0 6 1 1 0 0 0 }
出于某种原因,有些线条(尤其是最有趣的一条!)由点组成。现在,Cachegrind手册说:"不适用于一行的事件用一个点表示。这有助于区分不能发生的事件和可以但没有发生的事件。"
这应该如何解释?我的第一个想法是,也许编译器会优化我的搜索。我认为这不可能,因为这个程序确实花了很多时间运行。尽管如此,我还是尝试了在没有-O2标志的情况下进行编译,从某种意义上说,现在调用my_search的每一行都记录了一些数字(不再有点了!)。然而,由于显而易见的原因,这似乎不是正确的做法。
总的来说,有没有一种方法可以告诉Cachegrind"特别是看这一行,我很感兴趣它会导致多少缓存未命中"?
我的猜测是,使用O2,编译器可以在看到点的地方自动内联函数。Cachegrind将不会看到内联函数调用,因为这些调用已经消失。尝试"-fno inline"(编译器选项)
当然,使用和不使用内联可能会有不同的缓存性能数字。
相关文章:
- 使用一个考虑到std::map中键值的滚动或换行的键
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- std::atomic_flag不提供加载或存储操作有什么缺点吗?(自旋锁定示例)
- QString 从行首或行尾修剪非空格字符
- 特征:按列或行顺序将稀疏矩阵传递给同一函数
- 将std ::向量复制到CV :: Mat_的行操作相同
- 正则表达式,捕获 4 个被 括起来的数字.或行开始/结束
- 我只想从文本文件中删除一个特定值或行
- 我如何获得Soci中表格的模式或行名称
- 在 C++ 中使用 try-catch 进行删除 [] 或删除操作是否必要
- 是否可以通过一个模板函数实现列操作和行操作?
- 使用本特定删除零列或行
- OPENGL Texture2D 直接或间接操作
- 如何从opencv cv::Mat或行主数组初始化特征矩阵
- 数组上的行操作
- 我可以"force" Cachegrind 来分析操作(或行)吗?
- 如何使用c++对CSV文件执行逐行操作(一些x)
- 从Windows命令行操作GUI
- 在忙碌等待循环中是否需要内存屏障或原子操作
- C++发行版是否保留或更新操作上的参数(URNG,params)