如何通过获取指令类型细分来表征工作负载?

How to characterize a workload by obtaining the instruction type breakdown?

我想获取测试程序中内存读写指令的百分比,最好是动态获取。除了计算 gdb asm 转储中的指令(无论如何都是静态的)之外,还有更简单的方法来获取它吗? Valgrind provides total heap usage. Perf has some nice features but does not support WSL. Pin 具有指令计数功能,但我不确定它是否支持 WSL。

(更新:据报道 PIN 在 WSL 下不起作用。但它不需要性能计数器,因此它在 VM 或其他方面仍然有用。)


您是否尝试过 PIN 或建立在 PIN 之上并能满足您要求的 SDE? https://software.intel.com/en-us/articles/intel-software-development-emulator
sde64 -mix -- ./my-program 会告诉您 PIN 是否有效,并且可能会自行解决您的问题。 SDE 的指令组合是通过助记符 IIRC,可能不是通过内存目标与 src,但至少您会知道 PIN 可以在您随时编写自定义 PIN 工具之前使用。

PIN 基于动态运行时检测,而不是性能计数器。它可能甚至没有 cath SIGILL(不是说 WSL 会有问题);它必须在解码为 rep bsr 的 CPU 上模拟 lzcnt,诸如此类。

所以我怀疑除了 JIT 能力之外,PIN 还需要很多内核支持(像 Java 和 Web 浏览器 JS 引擎需要的东西,只是 mmap(PROT_EXEC))。它可能会使用 ptrace,但如果 GDB 在 WSL 下工作,那么希望 PIN 可以。

另见 Tools to count number of different types of instructions in x86 assembly to create a dynamic instruction mix table

相关:How do I determine the number of x86 machine instructions executed in a C program? 不是 WSL 特定的,但提到了 sde64 -mix

valgrind 工具所做的远不止提供总的堆使用情况。

参见 valgrind 用户手册http://www.valgrind.org/docs/manual/manual.html

请特别查看描述 valgrind 工具 callgrind 和 cachegrind 的部分。

http://www.valgrind.org/docs/manual/cg-manual.html

http://www.valgrind.org/docs/manual/cl-manual.html