Tag: performancecounter

将指令的目标地址保持在寄存器中,直到指令退出为止

我想在XeonE5 Sandy Bridge上使用精确的基于事件的采样(PEBS)来记录特定事件的所有地址(例如缓存未命中)。 但是, Core TM i7处理器和Intel®XeonTM5500处理器性能分析指南 (第24页)包含以下警告: 由于PEBS机制在指令完成时捕获寄存器的值,因此无法重建以下类型的加载指令(Intel asm约定)的解除引用的地址。 MOV RAX, [RAX+const] 这种指令主要与指针追逐有关 mystruc = mystruc->next; 这是捕获存储器指令地址的这种方法的重大缺点。 根据objdump,我在程序中有许多该表单的加载指令。 有什么办法可以避免吗? 由于这是一个特定于英特尔的问题,解决方案不必以任何方式移植,它只需要工作。 我的代码是用C语言编写的,我理想地寻找编译器级解决方案(gcc或icc),但欢迎任何建议。 一些例子: mov 0x18(%rdi),%rdi mov (%rcx,%rax,8),%rax 在这两种情况下,在指令退出之后(因此当我查看寄存器值以确定我加载到/来自的位置时)地址的值(在这些示例中分别为%rdi + 18和%rcx + 8 * %rax )被mov的结果覆盖。

每个mmap / access / munmap有两个TLB-miss

for (int i = 0; i < 100000; ++i) { int *page = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); page[0] = 0; munmap(page, PAGE_SIZE); } 我期望在用户空间中获得~100000 dTLB-store-miss,每次迭代一次(同样~100000页错误和内核的dTLB-load-miss)。 运行以下命令,结果大约是我期望的2倍。 如果有人能澄清为什么会这样,我将不胜感激: perf stat -e dTLB-store-misses:u ./test Performance counter stats for ‘./test’: 200,114 dTLB-store-misses 0.213379649 seconds time elapsed PS我已经validation并确定生成的代码没有引入任何可以certificate这个结果的东西。 此外,我确实得到~100000页错误和dTLB加载未命中:k。

每个周期的ARM M4指令(IPC)计数器

我想计算在ARM cortex-M4(或cortex-M3)处理器上执行的每个周期的指令数。 它需要的是:我想要分析的代码的指令数量 (在运行时执行)以及代码执行的周期数 。 1 – 周期数 使用循环计数器非常简单直接。 volatile unsigned int *DWT_CYCCNT ; volatile unsigned int *DWT_CONTROL ; volatile unsigned int *SCB_DEMCR ; void reset_timer(){ DWT_CYCCNT = (int *)0xE0001004; //address of the register DWT_CONTROL = (int *)0xE0001000; //address of the register SCB_DEMCR = (int *)0xE000EDFC; //address of the register *SCB_DEMCR = *SCB_DEMCR | 0x01000000; […]

使用硬件计数器测量ARM Cortex-A8上的执行时间

我正在使用Exynos 3110处理器(1 GHz单核ARM Cortex-A8,例如在Nexus S中使用),并尝试测量特定function的执行时间。 我在Nexus S上运行了Android 4.0.3。我尝试了这个方法 [1] 如何在ARM Cortex-A8处理器中测量程序执行时间? 我加载了内核模块以允许在用户模式下读取寄存器值。 我正在使用以下程序来测试计数器: static inline unsigned int get_cyclecount (void) { unsigned int value; // Read CCNT Register asm volatile (“MRC p15, 0, %0, c9, c13, 0\t\n”: “=r”(value)); return value; } static inline void init_perfcounters (int do_reset, int enable_divider) { // in general enable all counters […]

如何在ARM Cortex-A8处理器中测量程序执行时间?

我正在使用一个名为i.MX515的基于ARM Cortex-A8的处理器。 有Linux Ubuntu 9.10发行版。 我正在运行一个用C编写的非常大的应用程序,我正在使用gettimeofday(); 用于衡量我的应用程序所用时间的函数。 main() { gettimeofday(start); …. …. …. gettimeofday(end); } 这种方法足以让我看看我的应用程序块占用了多少时间。 但是,现在,我正在尝试使用gettimeofday()计算时间的方法彻底优化我的代码,我看到连续运行之间有很多波动(在我的优化之前和之后运行),所以我不能确定实际执行时间,从而影响我的改进。 谁能告诉我应该怎么做? 如果通过访问循环计数器( ARM网站上为Cortex-M3建议的想法 ),任何人都可以向我指出一些代码,它给出了我在Cortex-A8上访问定时器寄存器时必须遵循的步骤吗? 如果这种方法不是很准确,那么请提出一些替代方案。 谢谢 跟进 跟进1:在Code Sorcery上编写了以下程序,生成了可执行文件,当我尝试在主板上运行时,我得到了 – 非法指令消息:( static inline unsigned int get_cyclecount (void) { unsigned int value; // Read CCNT Register asm volatile (“MRC p15, 0, %0, c9, c13, 0\t\n”: “=r”(value)); return value; } […]