如何通过获取指令类型细分来表征工作负载?
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 可以。
相关: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 的部分。
我想获取测试程序中内存读写指令的百分比,最好是动态获取。除了计算 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 可以。
相关: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 的部分。