小编The*_*mad的帖子

LLVM 指令调度

正如LLVM 核心库入门中所述,LLVM 后端中有三个不同的指令调度程序。其中之一在寄存器分配之前运行,可以使用该-pre-RA-sched选项进行选择。其他两个在寄存器分配后运行。如何选择或禁用这三个调度程序中的每一个?他们之间有什么干扰吗?

scheduling llvm instructions compiler-optimization

6
推荐指数
1
解决办法
1552
查看次数

mem_load_uops_retired.l3_miss 和 offcore_response.demand_data_rd.l3_miss.local_dram 事件之间的区别

我有一个Intel(R) Core(TM) i7-4720HQ CPU @ 2.60GHz( Haswell) 处理器。AFAIK计算DRAM (即)数据读取访问mem_load_uops_retired.l3_miss的数量。顾名思义,计算针对 DRAM 的数据读取次数。因此,这两个事件看起来是等价的(或者至少几乎相同)。但根据以下基准,前一个事件比后者发生的频率要低得多:demandnon-prefetchoffcore_response.demand_data_rd.l3_miss.local_dramdemand

1) 在循环中初始化 1000 个元素的全局数组C

Performance counter stats for '/home/ahmad/Simple Progs/loop':

         1,363      mem_load_uops_retired.l3_miss                                   
         1,543      offcore_response.demand_data_rd.l3_miss.local_dram                                   

   0.000749574 seconds time elapsed

   0.000778000 seconds user
   0.000000000 seconds sys
Run Code Online (Sandbox Code Playgroud)

2)在Evince中打开PDF文档:

Performance counter stats for '/opt/evince-3.28.4/bin/evince':

       936,152      mem_load_uops_retired.l3_miss                                   
     1,853,998      offcore_response.demand_data_rd.l3_miss.local_dram                                   

   4.346408203 seconds time elapsed

   1.644826000 seconds user
   0.103411000 seconds sys
Run Code Online (Sandbox Code Playgroud)

3)运行Wireshark 5秒:

Performance counter stats …
Run Code Online (Sandbox Code Playgroud)

intel performancecounter memory-access perf intel-pmu

3
推荐指数
1
解决办法
509
查看次数

使用 Dwarf DebugInfo 和源代码将 Var 映射到声明

给定变量访问(不是声明)的行号,我如何确定它的类型(或它在.info树中的声明 DIE )?

看下面的代码:

void foo()
{
   {
      struct A *b;
   }

   {
      struct B *b;

      b = malloc(sizeof(struct B));
   }
}
Run Code Online (Sandbox Code Playgroud)

假设我有这个源代码,它是用DWARF格式的调试信息编译的。如何使用源代码和调试信息确定变量b的类型struct B *

我的意思是如何离线自动化?问题是在源代码(例如,行号)和范围信息之间没有映射的.info部分DWARF。在上面的示例中,使用调试信息,我们可以确定存在一个类型struct A * 为 的子代的foo()变量和一个类型struct B *为 的另一个子代的变量foo()。解析源代码有助于确定发生访问的嵌套级别,但无法将访问的变量映射到其类型。因为在同一级别有两种类型b被访问。

如果有办法强制编译器在调试信息中包含更多的信息,问题就可以解决。例如,将DW_AT_high_pc和添加DW_AT_low_pc到 DIE 类型的调试信息DW_TAG_lexical_block将有所帮助。

c debugging static-analysis debug-symbols dwarf

2
推荐指数
1
解决办法
553
查看次数

堆地址范围中的全局变量的地址

我正在调试MPlayer-1.3.0源代码,我看到一个全局变量,其地址(由GDB简单打印返回或甚至简单打印)都在堆分配的范围内,而不是数据部分.我使用了检查堆范围procfs.

555555554000-555555834000 r-xp 00000000 08:12 798876  /usr/bin/mplayer
555555a33000-555555b25000 r--p 002df000 08:12 798876  /usr/bin/mplayer
555555b25000-555555b2b000 rw-p 003d1000 08:12 798876  /usr/bin/mplayer
555555b2b000-555556479000 rw-p 00000000 00:00 0       [heap]
7fffc3fff000-7fffc8000000 rw-s 00000000 00:16 1932    /dev/shm/pulse-shm-3887887751
Run Code Online (Sandbox Code Playgroud)

变量的定义是int verbose = 0;,在line 40mp_msg.c和地址是0x555555b3bbb0,这是在[heap]映射.我甚至在它之前和之后检查了一些变量定义:

int mp_msg_levels[MSGT_MAX]; // verbose level of this module. initialized to -2
int mp_msg_level_all = MSGL_STATUS;
int verbose = 0;
int mp_msg_color = 0;
int mp_msg_module = 0;
Run Code Online (Sandbox Code Playgroud)

其中,仅 …

c heap-memory memory-layout mplayer

2
推荐指数
1
解决办法
271
查看次数

Perf 中用于确定库加载地址的机制

在后处理期间如何perf确定每个加载图像(例如共享库)的加载地址。例如,perf report使用此信息使每个符号地址相对于每个加载图像的开头。如下图所示 ( unwind: _int_malloc...): 在此输入图像描述

它是否存储在elf二进制或分析输出中的某个位置(即perf.data)?

linker trace ip-address shared-libraries perf

2
推荐指数
1
解决办法
937
查看次数

Perf 中奇怪的回溯

L3-misses我使用以下命令在简单的基准测试中提取导致用户级别的回溯evince

sudo perf record -d --call-graph dwarf -c 10000 -e mem_load_uops_retired.l3_miss:uppp /opt/evince-3.28.4/bin/evince
Run Code Online (Sandbox Code Playgroud)

很明显,采样周期相当大(连续采样之间有 10000 个事件)。对于这个实验, 的输出perf script有一些与此类似的样本:

EvJobScheduler 27529 26441.375932:      10000 mem_load_uops_retired.l3_miss:uppp:     7fffcd5d8ec0         5080022 N/A|SNP N/A|TLB N/A|LCK N/A
    7ffff17bec7f bits_image_fetch_separable_convolution_affine+0x2df (inlined)
    7ffff17bec7f bits_image_fetch_separable_convolution_affine_pad_x8r8g8b8+0x2df (/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.34.0)
    7ffff17d1fd1 general_composite_rect+0x301 (/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.34.0)
  ffffffffffffffff [unknown] ([unknown])
Run Code Online (Sandbox Code Playgroud)

在回溯的底部,有一个名为 的符号[unknown],看起来没问题。但随后就呼叫了线路general_composite_rect()。这个回溯OK吗?

AFAIK,回溯中的第一个调用者应该是类似_start()或 的东西__GI___clone()。但回溯不是这种形式。怎么了?

有什么办法可以解决这个问题吗?截断的(部分)回溯可靠吗?

linux trace performancecounter call-graph perf

2
推荐指数
1
解决办法
2921
查看次数

Perf 将一些直接跳转指令报告为内存访问指令

我使用以下perf命令对用户空间对 DRAM 的读取访问进行采样evince

perf record -d --call-graph dwarf -c 100 -e mem_load_uops_retired.l3_miss:uppp /opt/evince-3.28.4/bin/evince
Run Code Online (Sandbox Code Playgroud)

可以看出,我使用该PEBS功能来提高采样的准确性。但是有一些非内存访问报告为内存访问。例如,这是一个由 报告的采样事件perf script

evince 20589 16079.401401:        100 mem_load_uops_retired.l3_miss:uppp:     555555860750         5080022 N/A|SNP N/A|TLB N/A|LCK N/A
    555555579939 ev_history_can_go_back+0x19 (/opt/evince-3.28.4/bin/evince)
    5555555862ef ev_window_update_actions_sensitivity+0xa1f (/opt/evince-3.28.4/bin/evince)
    55555558ce4f ev_window_page_changed_cb+0xf (/opt/evince-3.28.4/bin/evince)
    7ffff574510c g_closure_invoke+0x19c (/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.4)
    7ffff575805d signal_emit_unlocked_R+0xf4d (/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.4)
    7ffff5760714 g_signal_emit_valist+0xa74 (/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.4)
    7ffff576112e g_signal_emit+0x8e (/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.4)
    7ffff7140d76 emit_value_changed+0xf6 (inlined)
    7ffff7140d76 adjustment_set_value+0xf6 (inlined)
    7ffff7140d76 gtk_adjustment_set_value_internal+0xf6 (/usr/lib/x86_64-linux-gnu/libgtk-3.so.0.2200.30)
    7ffff574510c g_closure_invoke+0x19c (/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.4)
    7ffff5757de7 signal_emit_unlocked_R+0xcd7 (/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.4)
    7ffff575fc7f g_signal_emitv+0x27f (/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.5600.4)
    7ffff7153519 gtk_binding_entry_activate+0x289 (/usr/lib/x86_64-linux-gnu/libgtk-3.so.0.2200.30)
    7ffff71539ef binding_activate+0x5f (/usr/lib/x86_64-linux-gnu/libgtk-3.so.0.2200.30) …
Run Code Online (Sandbox Code Playgroud)

linux x86-64 performancecounter memory-access perf

1
推荐指数
1
解决办法
79
查看次数

TLS 数据在所有线程中寻址相同

glibc-2.27使用GDB. 在178in行sysdeps/unix/sysv/linux/getsysstats.c,存在一个thread local storage访问,如下图:

while (l < re && isspace (*l))
Run Code Online (Sandbox Code Playgroud)

IIUC,isspace()似乎访问了一个字符映射到符号类型的 ,以快速确定当前字符是否为空格。这张桌子似乎是一个. 相关拆解如下: ASCIITLS

0x7f8f9ef480de <__GI___get_nprocs+318>  mov    0x2cbd1b(%rip),%rax        # 0x7f8f9f213e00                                                                        
0x7f8f9ef480e5 <__GI___get_nprocs+325>  mov    %fs:(%rax),%rdi                                                                                                    
Run Code Online (Sandbox Code Playgroud)

rax包含0xffffffffffffff98,其中,IIUC,表示地址,对于每个线程,使用以下等式计算:$fs_base + 0xffffffffffffff98。当我使用这个等式来查找每个线程的表地址时,它们都返回相同的0x00007f8f9732b82c。这如下所示:

(gdb) thread apply all x/2x $fs_base + 0xffffffffffffff98

Thread 47 (Thread 22457.22471):
0x7f8f75dfc698: 0x9732b82c  0x00007f8f

Thread 46 (Thread 22457.22470): …
Run Code Online (Sandbox Code Playgroud)

assembly linker gdb glibc thread-local-storage

0
推荐指数
1
解决办法
54
查看次数