代码之家  ›  专栏  ›  技术社区  ›  Vojtěch Melda Meluzín

测量简单矢量化阵列操作的性能

  •  0
  • Vojtěch Melda Meluzín  · 技术社区  · 7 年前

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

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

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

    问题是结果各不相同,很多。有时运算需要3秒,有时需要4秒。这使得结果基本上无法使用。你知道怎么回事吗?正在处理的数组中的值始终相同,数组与32字节边界对齐。

    1 回复  |  直到 7 年前
        1
  •  0
  •   ChipK    7 年前

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

    此外,这个简单的操作将受到内存限制,因此编译器或AVX2与AVX512之间的差异将很小。