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

Profiling a simple, one cycle length operation

本文关键字:一个 操作 周期 简单      更新时间:2023-10-16

我们有一个赋值,需要评测"简单指令"(例如加法或逐位)。这意味着多次执行相同的操作(100K+),并以微秒为单位测量平均时间。结果应以循环长度表示:(totalTime/iterations)*cphMHz

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

我的问题是:什么是一个好的配置操作?我需要澄清两点:

  1. 我使用循环展开来更准确一点,所以在每次迭代中,我执行10个简单的指令。这意味着由于编译器优化,我必须选择一个不会只执行一次的操作(我们不能像学校工作人员那样使用-o标志)。错误的示例:var = i;-编译器将只执行最后一个命令
  2. 什么是真正的"简单指令"?如何知道实际执行的操作数?我试着阅读程序集输出,但我看不懂

希望我足够清楚,任何想法都会很棒。

无论如何,谢谢

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

1)如果启用(或可能启用)优化,这听起来(对我来说)像是一项不可能完成的任务。您永远无法确定编译器在优化过程中会做什么。我肯定会重复使用以前的结果。如果允许/可能的话,我会尝试包含一个要分析的原始汇编程序片段(这样你就可以确保没有额外的开销;尽管它仍然可以优化)。

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

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

相关文章: