获取算法的每字节周期数?

时间:2013-06-20 09:05:36

标签: c++ c cpu cpu-speed

我知道这个理论,但在实际实施方面存在问题。我在C中写了一个AES算法。现在,我想知道它“拥有”每个字节有多少个周期。我知道我必须(是100%严格吗?):

  1. 计算算法的速度,以每秒字节数为单位
  2. 以赫兹获得时钟速度
  3. 以赫兹时钟速度
  4. 划分算法的速度,以每秒字节数为单位
  5. 取3的倒数。
  6. 以每秒千兆字节为单位测量算法的速度
  7. 以千兆字节为单位,以千兆字节/秒为单位划分算法的速度
  8. 取6的倒数。
  9. 是否可以在C / C ++中完成?如何制作它以及我应该使用/寻找什么呢?

    我对Linux / Windows / Mac解决方案感兴趣。

1 个答案:

答案 0 :(得分:1)

这只是代数,而不是方程式或理论。

如果您已经知道字节/秒和时钟速度(周期/秒),那么

(bytes/second) / (cycles/second) => bytes/cycle
1 / (bytes/cycle) => cycles/byte

如果您不知道每秒字节数,可以通过以下方式计算:

  1. 获取适合此类测量的高分辨率时间戳 T 1
  2. B 字节
  3. 上运行您的算法 N
  4. 获取另一个时间戳 T 2
  5. 从另一个中减去时间戳,给出经过的时间 E = T 2 - T 1
  6. 您现在已经在 E 时间单位中处理了(N * B)字节
  7. 重复几次
  8. 如果您的测量值不稳定,或者您的持续时间 E 令人不舒服地接近于零,或者可疑地接近某个系统计时器粒度,请增加 N 和/或 B 然后再试一次。实际上,无论如何都要这样做以确认你在处理的字节和花费的时间之间得到线性关系
  9. 将您的时间单位(纳秒,微秒,无论它们是什么)缩放到秒,如果这是您想要显示结果的方式
  10. 请注意,如果上面的“timestamp”实际上是一个循环计数器,则可以跳过循环/第二阶段。否则,您可以从平台的系统/硬件信息工具中读取CPU频率。

    对于POSIX,合理的计时器可能是clock_gettime(CLOCK_THREAD_CPUTIME_ID,...)。您应该能够通过搜索找到rdtsc的示例代码,最佳Windows计时功能的文档等。


    至于实际进行测量,评论中有很好的建议。你需要:

    • 获取大量(足够)样本以使其可靠
    • 理想情况下,如果不使用FIFO /实时调度,则没有其他资源争夺资源
    • 要么确保关闭任何CPU时钟缩放,要么丢弃正在预热的第一个样本