用C CPU基于循环计数的分析/ C ++的Linux x86_64的 [英] CPU Cycle count based profiling in C/C++ Linux x86_64

查看:238
本文介绍了用C CPU基于循环计数的分析/ C ++的Linux x86_64的的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用下面的code来分析我的行动,在我拍摄功能的CPU周期优化。

I am using the following code to profile my operations to optimize on cpu cycles taken in my functions.

static __inline__ unsigned long GetCC(void)
{
  unsigned a, d; 
  asm volatile("rdtsc" : "=a" (a), "=d" (d)); 
  return ((unsigned long)a) | (((unsigned long)d) << 32); 
}

我不认为这是因为即使两个连续的通话最好的给我33的区别。
有什么建议?

I don't think it is the best since even two consecutive calls gives me a difference of "33". Any suggestions ?

推荐答案

我个人认为RDTSC指令是伟大的,可用于各种任务。我不认为使用CPUID是必要的prepare为RDTSC。下面是我身边的原因RDTSC:

I personally think the rdtsc instruction is great and usable for a variety of tasks. I do not think that using cpuid is necessary to prepare for rdtsc. Here is how I reason around rdtsc:


  1. 因为我用的是在Watcom编译器,我使用RDTSC的#pragma AUX,这意味着C编译器将生成指令内嵌实施,预计结果EDX:EAX,也通知其优化的EAX的内容, EDX已被修改。这是从传统的_asm实现了巨大的改进,其中优化器将在_asm的附近优化望而却步。我还利用实施的#pragma AUX,这样我就不会需要调用一个lib函数,当我转换clock_cycles给我们或毫秒divide_U8_by_U4。

  2. RDTSC的每次执行将导致一些开销(多很多,如果它被封装在笔者的例子),必须采取更多考虑序列来测量越短。一般我不大于内部时钟频率通常工作了1/10 ^ 8秒(3 GHZ内部时钟)的1/30时间短的序列。我用这种测量的指示,而不是事实。知道了这一点我可以离开了CPUID。该次我衡量,事实越接近我会。

  3. 要可靠地测量我会用1/100 - 1/300范围I / E 0.03 - 0.1我们。在这个范围内使用CPUID的额外精度几乎是微不足道的。我用这个范围短序列时序。这是我的非标准单元,因为它是依赖于CPU的内部时钟频率。例如,一个1 GHz的机器上我不会用0.03我们,因为那会把我的1/100的限制之外,我的读数会成为指示。在这里,我会用0.1作为我们在最短的时间测量单元。 1/300不会被使用,因为它会过于接近1我们(见下文),以使任何显著差异。

  4. 甚至更长的处理顺序我分隔两个RDTSC与阅读之间的差异说3000(3 GHz)和将经过的时钟周期转换到我们。其实我使用(差异+ 1500)/ 3000,其中1500是3000的一半用于I / O等待我用毫秒=>(差异+ 1500000)/ 3000000。这些是我的标准单位。我很少用秒。

  5. 有时候,我得到异常缓慢的结果,然后我必须问自己:这是由于中断或到code?我衡量多做几次,看看它,的确是一个中断。在这种情况下...好吧中断发生在现实世界中所有的时间。如果我的序列短那么有一个很好的可能性,接下来的测量将不会被打断。如果序列是较长的中断就会更经常发生,没有太多我可以做的。

  6. 非常精确地测量经过较长时间(小时和我们不再外星人或更低)将增加在获得一个divide_U8_by_U4师异常的风险,所以我想通过时要使用我们,何时使用毫秒。

  7. 我也有code为基础的统计数据。使用这个我登录最小值和最大值,我可以计算出平均值和标准偏差。此code是不平凡的,以便其自身的ET必须从测量专家组中减去。

  8. 如果编译器正在做大量的优化和您的读数存储在本地变量编译器可能会决定(正确)的code可以省略。为了避免这一点的一种方法是将结果存储在公共(非基于堆栈非静态,)变量。

  9. 程序中应以现实世界的条件来衡量现实世界的条件下运行,还有周围没有办法。

随着时间的时间戳计数器的问题是准确的我会说,假设在不同内核上的TSC是同步的(这是正常的)有CPU节流的过程中低活动期,以减少能源消耗的问题。它始终是可能的测试时抑制功能。如果你在1千兆赫或10兆赫的同一处理器上执行的指令经过的周期计数将成为即使前者在时间玉米$ P $概率pd 1%完成后者相同。

As to the question of time stamp counter being accurate I would say that assuming the tsc on different cores are synchronized (which is the norm) there is the problem of CPU throttling during periods of low activity to reduce energy consumption. It is always possible to inhibit the functionality when testing. If you're executing an instruction at 1 GHz or at 10 Mhz on the same processor the elapsed cycle count will be the same even though the former completed in 1% of the time compred to the latter.

这篇关于用C CPU基于循环计数的分析/ C ++的Linux x86_64的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆