optimization - 测量简单矢量化数组操作的性能
问题描述
我正在优化简单的数组操作,例如
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 字节边界。
解决方案
您的 CPU 或操作系统可能会限制内核的频率。它可能一次以 3.6 GHZ 运行,另一次以 2.8 GHZ 运行。有一些方法可以通过 Windows 和/或您的 BIOS 来防止这种情况,但我不记得具体细节了。
此外,这个简单的操作将受内存限制,因此编译器或 AVX2 与 AVX512 之间的差异将是微不足道的。
推荐阅读
- c# - RSACng 无法验证哈希
- c - 非阻塞连接不向 kqueue 报告完成
- c++ - 如何将枚举类型向量的向量保存在
- r - 包 'ggbiplot' 不可用(对于 R 版本 3.5.3)?
- react-native - 在调用函数 React-Native 上保存 textInputs 的值
- javascript - 将日期和时间保存为按钮的值
- django - Rest API 参数为空 Serializer 没有模型
- php - 如何在 Symfony/Doctrine 中为 FileType 的输入设置默认值?
- git - 本地中央 git 存储库的离线同步
- c# - Xamarin.Forms 应用程序中的试用版