首页 > 解决方案 > 测量简单矢量化数组操作的性能

问题描述

我正在优化简单的数组操作,例如

for (int i=0; i<cnt; i++) dst[i] = src1[i] * src2[i];

其中 cnt 通常为 32 到 1024,这是我的应用程序中的典型情况。我正在比较 Intel IPP、MSVC 2017 本机矢量化器,并且我还在 MSVC 中利用 AVX 和 AVX512 的内在函数。我将线程优先级设置为关键,线程关联掩码设置为“1”。然后我使用 QueryPerformanceCounter 计算“操作”开始和结束的时间,其中包括运行循环数百万次。在具有 10 个内核的新 i9 上运行。

问题是结果各不相同,很多。有时 op takse 3 秒,有时 4。这使得结果基本上无法使用。有什么想法可能是错的吗?正在处理的数组中的值始终相同,数组对齐到 32 字节边界。

标签: optimizationvisual-c++x86performancecounteravx512

解决方案


您的 CPU 或操作系统可能会限制内核的频率。它可能一次以 3.6 GHZ 运行,另一次以 2.8 GHZ 运行。有一些方法可以通过 Windows 和/或您的 BIOS 来防止这种情况,但我不记得具体细节了。

此外,这个简单的操作将受内存限制,因此编译器或 AVX2 与 AVX512 之间的差异将是微不足道的。


推荐阅读