Paralellization与矢量化性能瓶颈:AVX和MT竞争吗?

时间:2015-07-18 12:28:35

标签: multithreading intel avx

我试图计算大矩阵中所有元素的总和。以下是测试用例:

  1. MT和AVX需要37秒
  2. MT且没有AVX需要40秒
  3. AVX并且没有MT需要49秒
  4. AVX或MT 105 s
  5. 在所有情况下,CPU时钟固定为3.0 GHz(由cpufreq-info声称):

    current policy: frequency should be within 1.60 GHz and 3.40 GHz.
                    The governor "userspace" may decide which speed to use
                     within this range.
    current CPU frequency is 3.00 GHz.
    

    矩阵有25000000个double类型的元素,值为1.0。并且总和在循环中重复计算4096次。没有AVX,使用MT时的速度提升为2.6。 AVX只有1.3。运行MT时,矩阵分为4个块,每个线程一个。如果我降低CPU频率,AVX的MT改进会更大,因此也可能存在缓存未命中的问题,但这无法解释(4)/(2)和(3)/(1)之间的差异。 AVX和MT是否以某种方式相互竞争?芯片是i3570K。

2 个答案:

答案 0 :(得分:3)

很可能您的基准性能受到执行延迟的限制,但是任何一种并行化形式(MT或矢量化)都可以让您打破并达到下一个瓶颈,即CPU的内存BW。

检查你的CPU可达到的峰值BW并与你的数据进行比较,看起来你只需要以20.5GB / s的速度饱和(25000000个元素* 4096个循环* 8Bytes,假设你的系统使用的是双倍/ ~40秒) ,这似乎有点低,因为这link说它应该达到25GB / s,但是在同一个球场周围所以可能是由于其他低效率,如DDR类型,其他应用程序/操作系统在后台工作,频率由CPU完成缩放以节省电力/减少热量等。

您还可以尝试运行一些内存基准测试(lmbench,sandra,..),看看它们是否在相同的环境下做得更好。

答案 1 :(得分:0)

MT不应该与MT竞争,它们是两回事。虽然求和的想法很简单,但根据您的实现,您可以得到非常不同的数字。我建议您使用Stream benchmarks来测试性能,因为它们是标准。我没有看到您的代码,但存在一些问题:

  1. 您正在使用1.0为所有元素初始化矩阵。我认为这不是一个好主意。您应该使用随机数或根据索引进行初始化(例如(i%10)/10.0)。
  2. 你如何衡量时间?你应该将你的计时器放在重复循环的旁边,并取平均重复次数。你也使用准确的计时器吗?
  3. 你确定你的代码实际上是矢量化的吗?你启用任何编译器标志来显示这些信息吗?您确定使用了AVX版本的代码吗?也许编译器选择使用标量版本。
  4. 你提到频率是固定的,你确定在任何时候都没有启用turbo模式吗?
  5. 用MT测量时的线程亲和力怎么样?