0

我知道理论,但在实际实施中遇到问题。我用 C 编写了一个 AES 算法。现在,我想知道它“有”每个字节有多少个周期。我知道我必须(这是 100% 正确吗?):

  1. 以每秒字节数计算算法的速度
  2. 以赫兹为单位获取时钟速度
  3. 以每秒字节数为单位的算法速度除以以赫兹为单位的时钟速度
  4. 取 3 的倒数。
  5. 以千兆字节每秒为单位测量算法的速度
  6. 以每秒千兆字节为单位的算法速度除以以千兆赫为单位的时钟速度
  7. 取 6 的倒数。

是否可以在 C/C++ 中做到这一点?如何制作它以及我应该使用/寻找什么来制作它?

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

4

1 回答 1

1

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

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

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

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

  1. 获得适合这种测量的高分辨率时间戳T 1
  2. 在B个字节上运行你的算法N
  3. 获取另一个时间戳T 2
  4. 从另一个中减去时间戳,得到经过的时间E = T 2 - T 1
  5. 您现在已经以E时间单位处理了(N * B)个字节
  6. 重复几次
  7. 如果您的测量值不稳定,或者您的持续时间E令人不安地接近于零,或者可疑地接近某个系统计时器粒度,请增加N和/或B并重试。实际上,无论如何都要这样做几次,以确认您得到处理的字节数和所用时间之间的线性关系
  8. 将您的时间单位(纳秒、微秒,无论它们是什么)缩放为秒,如果这是您想要显示结果的方式

请注意,如果您上面的“时间戳”实际上是一个周期计数器,您可以跳过周期/第二阶段。否则,您可以从平台的系统/硬件信息工具中读取 CPU 频率。

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


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

  • 取大量(足够)样本以使其可靠
  • 理想情况下,如果没有 FIFO/实时调度,则没有其他东西争夺资源
  • 要么确保关闭任何 CPU 时钟缩放,要么丢弃它正在预热的第一个样本
于 2013-06-20T09:52:25.620 回答