【问题标题】:How to measure CPU cycles per instruction in a C program如何测量 C 程序中每条指令的 CPU 周期
【发布时间】:2010-11-05 13:26:09
【问题描述】:

我有一个 C 程序,我开始对 SPE(单元处理器)等使用一些 SIMD 优化。我想以某种方式“计时”他们需要多少个周期。一种想法是打开/关闭并测量整个执行时间。但这很慢。我还可以在执行 gettimeofday(&start,NULL) 等语句之间和之前添加,但我认为它们只有在处理超过毫秒时才准确。

我想知道是否可以有效地测量每条指令的纳秒数或仅测量 CPU 周期或其他一些精确的时间测量。

【问题讨论】:

    标签: c cell cycle timing


    【解决方案1】:

    根据您的 CPU,您可能能够在 CPU 本身内获得performance registers,它跟踪指令时钟和许多其他有用的东西。探查器和其他性能实用程序可以做到这一点,因此也应该可以从用户代码中实现。在 Mac OS X 上,我会使用 Apple CHUD 框架,但您没有说明您使用的是什么操作系统或 CPU,因此很难给出具体建议。

    【讨论】:

    • 我在 Cell 处理器上的 Linux 下运行 C 程序。有一些系统模拟器,但安装和理解非常复杂
    • @Werner:Cell 没有 SSE2 - 这是一个 x86 SIMD 扩展 - Cell 在 SPE 上使用自己独特的矢量指令集,在基于 PowerPC 的 PPE 上使用 AltiVec - 您要尝试哪一个写代码?
    • 对不起,是的,你是完全正确的,我只是写了 SSE2,因为它是相似的,为了让事情更清楚,我会编辑这个,谢谢
    • OK - 在 Cell SPE 上,计算周期有点棘手。如果您阅读 Cell 手册,您会看到有奇数/偶数指令槽,并且如果您正确安排代码,您可以每个时钟发出一条指令。
    • @paul,对不起,我不明白 yoy 的意思,你能举一个更具体的例子吗?
    【解决方案2】:

    在循环中执行要测试的代码,并用循环计数器除以它所花费的时间。您使用的计时器必须不是高分辨率才能测量正确的值。

    【讨论】:

    • 只是循环本身会极大地扭曲结果。
    • @Let_Me_Be 当您只想找出哪个版本的代码更快时,我认为它可以达到这个目的。你同意吗?
    • @frast 是的,但前提是测量方法产生的开销不会使结果偏离可用点。
    • @Let_Me_Be Right。您不能像 xor 那样测量单个汇编指令,因为测量时引入的错误会比测量的时间大得多。
    • @frast 除非他可以访问系统模拟器,我认为只有英特尔才有。如果他们有的话。
    【解决方案3】:

    纳秒是不够的。你需要皮秒。

    我认为你不能可靠地测量这样的东西。您将不得不查看规格(我不确定当前的 CPU 是否记录了此信息)。

    【讨论】:

    • 是的,这将是一个好主意,我会尽力找到这些信息 elweshwere,
    【解决方案4】:

    作为一个非 C 的人...我猜你需要查看汇编代码,然后从那里开始。唯一的问题是单个指令可能需要 1 或 100000 个 cpu 周期,具体取决于您使用的确切 CPU。

    【讨论】:

    • 可惜我不懂汇编。无论如何,是否很容易“看到”一个单一的 C 指令的汇编翻译?
    猜你喜欢
    • 2020-04-09
    • 2010-12-05
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    相关资源
    最近更新 更多