【问题标题】:Calculating cycles/byte from QueryPerformanceCounter()从 QueryPerformanceCounter() 计算周期/字节
【发布时间】:2016-10-27 02:26:21
【问题描述】:

我已经对这里找到的 PRIMATEs 密码进行了一些切片实现:http://primates.ae/(我使用 120 位版本)。

我只用 C 语言编写并使用 Intel Intrinsics,这样我就可以使用 AVX2 指令集。

由于我做了一些切片实现,我想优化它的速度并因此测量性能,我计算了每字节的周期。为此,我使用了 Windows 提供的 QueryPerformanceCounter() 函数

事情就是现在。在我的计算中,我得出每个字节使用 1,91 个周期,这似乎 reeeaaally 很好。我觉得我一定做错了什么(我不是一个好的编码器)。我就是这样做的:

//Size of testdata
int testDataSize = 4000; //bytes

//Get CPU frequency (cycles per sec)
LARGE_INTEGER start, finish;
double cpu_frequency;
QueryPerformanceFrequency(&start);
cpu_frequency = (double)(start.QuadPart)

QueryPerformanceCounter(&start);
encrypt(data);
decrypt(data);
QueryPerformanceCounter(&finish);

double cyclesUsed = (double)(finish.QuadPart - start.QuadPart);
double bytesSecond = (cpu_frequency / cyclesUsed) * testDataSize;
double bytesCycle = bytesSecond / cpu_frequency;
double cycles_per_byte = 1 / bytesCycle;

在运行时,两次 QueryPerformanceCounter 调用之间花费的周期(即加密和解密的时间)是 startfinish 之间的增量,约为 7674 个周期。这是 4000 字节的时间。

自然,然后我将使用每个字节大约 1.9 个周期,但这看起来真的很好......我是否正确实现了周期/字节计算并且我是否正确理解了 QueryPerformanceCounter() 的使用?还是我现在正在计算一些随机数。

另外,如果有人知道:这对于使用现代密码加密/解密数据而言是否具有现实价值?我知道这对于该领域来说是主观的并且很难回答,但值得一试......无论哪种情况,我是否正确实施它是我现在最感兴趣的,因为我可以看到我的测试向量通过有了这些结果。

我在关闭 Intel TurboBoost 且仅使用 1 个 CPU 内核的情况下进行测试....我无法关闭超线程(感谢简化的 Lenovo BIOS),但我怀疑它会有所不同,因为我的代码是单线程的.

【问题讨论】:

  • 你可能想使用 rdtsc
  • 谢谢。我只是从不这样做中吸取了一个惨痛的教训,并且从现在开始会这样做。 __rdtsc 看起来很有用,会试试看!

标签: c performance winapi intrinsics avx2


【解决方案1】:

您的代码是正确的,但您误解了数据。 QueryPerformanceFrequency() 不给你 CPU 频率,它给你性能计数器频率。这意味着您是根据任意滴答而不是周期来计算的。使用 Windows 性能计数器(CPU 频率通常是动态的)获取循环计数并不容易,但您可以获得不错的执行时间。

【讨论】:

  • 非常感谢您的回答,我确实认为这里有问题。很高兴得到澄清。就我而言,QueryPerformanceFrequency 返回 2533192.00。如果我的 CPU 是 2.533Ghz(Turbo 加速关闭,所以它在那个值上很稳定),这是否意味着我的计算是 1000 倍?
  • @oPolo 是的,可能。性能计数器只擅长测量时间,因此您应该计算吞吐量 (MB/s)。我正在删除“通常为 100MHz”的部分,似乎我对其他内容感到困惑。
  • 实际的性能计数器硬件可以并且确实测量核心时钟周期,而不是 TSC 周期。不要将它与某些 Windows 函数的命名混为一谈。 IDK 你会如何在 Windows 上做到这一点,但在 Linux 上你可以运行 perf stat ./a.out 并查看你的整个程序花费了多少核心时钟周期。
  • @ElderBug cpu_clk_thread_unhalted.ref_xclk 性能事件在 Haswell 上精确到 100MHz,但您也可以使用固定功能的未暂停参考和/或未暂停核心周期计数器,您可以从中获取两个字节/秒和(更重要的是)每个周期的字节数超过纳米精度,因为它们分别以 CPU 标称频率和提升频率计算。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
相关资源
最近更新 更多