C 如何计算程序(或函数调用)中两点之间执行的x86-64指令数?

C 如何计算程序(或函数调用)中两点之间执行的x86-64指令数?,c,profiling,C,Profiling,我用各种微观优化做了一些算法实现。我需要计算一个调用或两个位置之间(调用前后)执行的指令数 该算法使用很少的周期和条件跳跃,并且数据敏感。所以我不能只使用计算出的每个循环迭代的指令数,然后乘以迭代次数 免责声明:我知道执行指令的数量没有多大关系,因为相同指令的性能因不同CPU而异,但这仅用于演示目的。在x86(32位和64位)上,您可能正在寻找RDTSC指令。 考虑到现代CPU有多么复杂,任何形式的模拟或静态分析肯定都不是 您的编译器可能有也可能没有它的内在特性,如果没有,请执行以下操作:(内联

我用各种微观优化做了一些算法实现。我需要计算一个调用或两个位置之间(调用前后)执行的指令数

该算法使用很少的周期和条件跳跃,并且数据敏感。所以我不能只使用计算出的每个循环迭代的指令数,然后乘以迭代次数

免责声明:我知道执行指令的数量没有多大关系,因为相同指令的性能因不同CPU而异,但这仅用于演示目的。

在x86(32位和64位)上,您可能正在寻找RDTSC指令。 考虑到现代CPU有多么复杂,任何形式的模拟或静态分析肯定都不是

您的编译器可能有也可能没有它的内在特性,如果没有,请执行以下操作:(内联asm的GCC语法,)

uint64\u t GetTSC(无效)
{
uint64_t h,l;
h=l=0;
__asm_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;

h您研究过valgrind吗?有一个选项可以获取所有指令计数。也许有一种方法可以限制范围。您如何计数?前缀作为单个指令计数吗?像
rep movsb
这样的字符串指令如何?这些计数是每一次迭代一次还是一次?您是否尝试打开asm选项,允许生成项目时要生成的汇编程序源文件。这至少会为您提供进行比较所需的源代码。我不确定您是否可以实际计算指令数,但如果您不知道,请查看perf()对于支持推测性执行的现代处理器内核来说,这并不是一个很好的衡量标准。它们都是这样。ISA内核有一个计数器,可以报告失效指令的数量,这是一个更好的衡量标准。不要发明这个轮子,任何像样的分析器都可以让你访问它。但是,这是时钟计数器,而不是executed指令计数器,如果我理解正确的话。
uint64_t GetTSC(void)
{
  uint64_t h, l;

  h = l = 0;
  __asm__("rdtsc" : "=a"(l), "=d"(h));
  h <<= 32;
  h |= l;

  return h;

}