分析一个简单的,一个周期长度的操作

时间:2012-03-18 10:20:17

标签: c++ profiling

我们有一个分配,我们需要分析一个'简单指令'(例如,添加或按位)。这意味着执行相同的操作很多次(100K +)并测量平均时间(以微秒为单位)。结果应以周期长度显示:(totalTime/iterations)*cphMHz

因此,结果可能会有所不同,但总而言之,我们被告知我们应该得到接近1个周期长度的结果。只要编程正确,实际结果无关紧要。

我的问题是:描述什么是好的操作? 我需要两点来调整:

  1. 我使用循环展开更准确,所以在每次迭代中我执行10个简单的指令。这意味着我必须选择一个由于编译器优化而不会只执行一次的操作(我们不能使用-o0标志,因为学校工作人员没有)。 错误示例:var = i; - 编译器只执行最后一个命令。
  2. 什么是真正的“简单指令”?我如何知道实际执行的操作数量?我试着阅读汇编输出,但我无法理解。
  3. 希望我足够清楚,任何想法都会很棒。

    非常感谢

    P.S不知道这是否重要,但我在CPP中写道

1 个答案:

答案 0 :(得分:1)

1)如果(或可能)启用了优化,这听起来(对我而言)就像一个不可能完成的任务。您永远无法确定编译器在优化期间将执行的操作。我肯定会像重复使用之前的结果那样做。如果允许/可能,我会尝试包含一个原始汇编程序片段进行分析(因此您可以确定没有额外的开销;虽然它仍然可以进行优化)。

2)至于指令:一个汇编程序命令是一条指令。例如。 a += i将 - 取决于可用的指令集和内容 - 最有可能产生4条指令:读取,读取i,添加,写入a。阅读大会非常简单。根据指令集/处理器,可能存在用于读取的不同“方向”(即“从 - >到”)。 x86汇编程序(以及大多数其他常见处理程序的汇编程序)将更喜欢instruction target, source,而DSP则更喜欢使用instruction source, target。重要的是要知道:移动数据必须通过寄存器进行。因此,即使像a = b这样的单个作业也会产生两条指令(b注册并注册到a)。

一般来说,如果这个答案走向错误的方向,请尝试详细说明您的具体任务及其要求(例如使用哪个编译器),并给我一个简短的评论。