翻译:Linux C++: how to profile time wasted due to cache misses?

Stack overflow地址:Linux C++: how to profile time wasted due to cache misses? - Stack Overflow


翻译:

我知道可以使用gprof来测试衡量我的代码。

然而,我有一个问题--我有一个智能指针,它有间接的额外东西(可以认为这是一个代理对象)。

结果,我有一个额外的层影响了很多函数,并且带有一些缓存。

这里有没有一种方法来测试我的CPU浪费在由于缓存没有命令的时间?

谢谢!



Answers1:

你可以使用 cachegrind,它是 kcachegrind的前端界面。


Answer2:

你可以找一个访问并统计CPU计数的工具。在每个核心上都有一个寄存器,L1、L2等等。Cachegrind是一个可选择的循环执行的仿真器。

然而,我不认为这是有见解行的。你的代理对象可能被它自己的方法修改了。一个正常的性能分析器会告诉你这个方法使用了多少时间。没有性能分析器会告诉你如何执行和提升在没有缓存源代码的情况下。这是一个减少程序工作集的大小和结构的问题,这是不容易推断的。

一个快速的google搜索找到了你可能感兴趣的 boost::intrusive_ptr。它似乎不支持 weak_ptr,但是这个转换对于你的程序可能是不重要的,然后你就可以确定的知道非侵入式的引用耗费了多少时间。


Answers3:

Linux从2.6.31起就支持perf了。它允许你做下面这些事情:

    1.使用-g参数编译你的代码,会有debug信息;

    2.运行你的代码,使用最后一级的缓存缺失计数器:perf record -e LLC-loads,LLC-load-misses yourExecutable

    3.运行 perf report

        3.1 在确认了初始化的信息后,找到 LLC-load-misses行;

        3.2 然后是第一个函数

        3.3 然后 annotate,你应该看这些行(被原始代码包围的汇编代码),对于那些缓存丢失发生的行中,一个数字将会被指出最后一级缓存丢失的比例。


Answers4:

这取决于你用的什么系统和CPU。例如:对于苹果系统x86或者ppc,Shark将会分析缓存丢失。在Linux上有 Zoom的 Ditto。


Answers5:

如果你在AMD的处理器上运行,你可以使用 CodeAnalyst,这显然是免费的。


Answers6:

首先,获取一个基本的性能分析时间,使用你喜欢的工具:VTune或者PTU或者OProf。

然后,获取缓存未命中时间,L1缓存未命中或者L2缓存未命中。

第一个性能分析时间将“花费的时间”和每个程序计数器相关联。第二个将“缓存未命中次数”和每个程序计数器相关联。

小提示:我经常“减少”数据,总结它们通过其功能,或者(如果我有技术)按循环进行处理总结。或者通过64bytes进行分类。分开比较单个程序计数器通常是没有用的,因为性能计数器是模糊的-你看到的缓存未命中的地方通常有多条不同的指令发生。

好,现在开始一个新的段落来比较两个性能分析。这里有一些我认为有用的段落内容:

"Iceberg" charts: X axis is PC, positive Y axis is time, negative Y access is cache misses. 找到这个地方然后上下进行寻找。

XY图表:对于每一个采样箱(PC或者函数或者循环等等)绘制一个点,它的X轴坐标是标准的时间,它的Y轴坐标是标准化的缓存未命中。如果你在右上角得到了很多数据点-大于%age时间并且大于%age的缓存未命中-这是有趣的证据。或者,忘记这些点数-如果上面所有百分比总和很大...

不幸的是,你必须回滚这些分析。上次我检查 VTune没有为你做这些。我通常使用 gnuplot和 Excel(警告:Excel在大于64000个数据点是会崩溃)。

更多的建议:

如果你得智能指针是内联的,你会得到计数在所有的地方。在理想的世界中,你可以在PC上跟踪到原始代码行。在这种情况下,你可能想要稍微延迟一下:查看所有的个人电脑;映射它们到源码行,然后映射到原始函数中。许多编译期,就像GCC有很多符号表让你可以这么做:

顺便说一句,我怀疑你的问题不是因为智能指针导致的缓存抖动。除非你在任何地方都使用 smart_ptr<int>。如果你正在做smart_ptr,并且sizeof(Obj)+大于4 * sizeof(Obj *)(如果smart_ptr本身不是很大),那么它就不是那么多。

巧合的是,我在午餐的时候和一个年轻人谈话,他们有一个引用计数的智能指针,它使用了一个句柄,间接的级别,像这样:

template class refcntptr {

    refcnt_handle handle;

public:

    refcntptr(T*obj) {

        this->handle = new refcnt_handle();

        this->handle->ptr = obj;

        this->handle->count = 1;

    }

};

template class refcnt_handle {

    T* ptr;

    int count;

    friend refcnt_ptr;

};

(我不会用这种编码方式,它只用于说明)

这里的两个间接 this->handle->ptr可能是一个很大的性能问题。甚至是三个间接 this->handle->ptr->field。至少,在一台 5次周期 L1缓存的机器上,每个this->handle->ptr->field将花费10个周期。并且比单个指针更难追踪。但更糟糕的是,如果每个都是L1高速缓存未命中,即使它只有20个周期到L2 ...隐藏2×20 = 40个高速缓存未命中延迟周期要比单个L1未命中更难。

通常来说,避免使用间接的智能指针是一个好的建议。替换指向句柄使用所有的智能指针指向对象自身。你可以通过指向对象以及句柄来使智能指针变大。 (然后不再是通常称为句柄的东西,而更像是一个信息对象。)

如:

template class refcntptr {

    refcnt_info info;

    T* ptr;

public:

    refcntptr(T*obj) {

        this->ptr = obj;

        this->info = new refcnt_handle();

        this->info->count = 1;

    }

};

template class refcnt_info {

    T* ptr; // perhaps not necessary, but useful.

    int count;

    friend refcnt_ptr;

};

无论如何,性能分析器是你最好的朋友。

Intel的EMON硬件也可以告诉你有多少周期数在PC上等待的。这可以区分大量的L1丢失和少量的L2丢失。


Answers7:

我的建议是使用Intel的PTU(Performance Tuning Utility)。

这是VTune的直接后代,并提供可用的最佳可用采样分析器。 你可以跟踪CPU花费的时间或浪费时间(借助可用的硬件事件),而且不会减慢应用程序的性能。 当然,你可以收集你正在查找的所有缓存行未命中事件。


Answers8:

另一个工具分析CPU性能分析计数器是 oprofile。你可以使用 Kcachegrind来看这个结果。


Answers9:

这有一种通用的答案

举个例子:如果你的程序正在花费50%的时间在缓存丢失上,当你暂停程序计数器时,由于缓存丢失将会有50%的时间在内存寻找精准的位置。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容