矢量化和并行化Xeon Phi

时间:2016-02-13 10:35:34

标签: intel xeon-phi

我正在寻找一个简单的例子,在Xeon Phi上使用矢量化和并行化,这比只有Xeon有更好的性能。你能帮帮我吗?

我正在尝试下一个例子。我评论第14,18和19行仅用于Xeon的运行并且为Xeon-Phi解开这些,但只有-Xeon比Xeon-phi具有更好的性能

select distinct ProductID from Table2

1 个答案:

答案 0 :(得分:0)

关于自动向量化的第一句话。自动向量化的优点是简单。您需要设置一些关键字而不是魔术,编译器会为您制作快速代码。如果您想这样做,请尝试manual

这种方法的缺点是没有简单的方法来理解编译器如何使他的工作。在矢量化报告中,您将看到" LOOP WAS VECTORIZED"或者"循环没有被矢量化"。但是如果你想真正理解你的代码是如何工作的,唯一的方法就是查看你的程序集。这不是装配的问题。您需要使用read_file.read().rstrip()编译程序。但我想如果你需要阅读汇编来检查"简单的自动向量化"方法起作用并非如此简单。

自动向量化的替代方案是内在函数(实际上,这不是单一替代方案)。想想像C函数包装的内部函数一样的内在函数。许多内在函数内部包装单个汇编命令。

我建议使用此intrinsics guide

所以我的简单步骤:

  1. 制作单线程参考实现。您将使用它来检查内在函数版本的正确性。
  2. 实施SSE内在函数版本。 SSE内在函数更简单,可以在Xeon上进行测试。
  3. 为Xeon Phi实施AVX-512版本。
  4. 测量你的速度。
  5. 让我们用你的程序来做。 您的计划有很多不同之处:

    1. 我使用float而不是double。
    2. 我使用_mm_malloc代替posix_memalign。
    3. 我想n除以16而没有余数(AVX-512向量寄存器中有16个浮点数)。在这个例子中,我没有使用环剥离。
    4. 我使用纯模式而不是卸载模式。 KNL是可启动的,因此不再需要使用卸载模式。
    5. 另外我认为你的程序不正确,因为它在一个时刻修改了几个线程的c数组。但是让我们认为它并不重要,我们只需要一些计算工作。
    6. 我的代码工作时间:

      Intel Xeon 5680

      • 参考计算时间:97.677505秒
      • Intrinsics计算时间:6.189296秒

      Intel Xeon Phi(KNC)SE10X

      • 参考计算时间:199.0秒
      • 内在化学计算时间:2.78秒

      代码:

      -fcode-asm