矢量化

Simcenter STAR-CCM+ 在支持 AVX-2 指令集的所有 Xeon 处理器(目前为 Haswell、Broadwell 和 Skylake 处理器)上使用 AVX-2 指令。

处理器较旧的机器继续跟之前一样使用 SSE2 指令集。此变更可增强 Simcenter STAR-CCM+ 在较新处理器上进行使用耦合求解器的模拟时的性能,但是对于使用分离求解器的模拟没有太大影响。无需任何特殊操作即可使用此功能 — Simcenter STAR-CCM+ 会自动检测硬件并运行相应级别的矢量化。

什么是矢量化?

矢量化指使用单个指令计算若干个算术运算。为了详细说明,不妨考虑两个要求和的任意长度矢量并将结果存储在第三个矢量中。标量算术(与矢量化相反)将第一个矢量中的第一个单元添加到第二个矢量的第一个单元,并将结果存储在第三个矢量的第一个单元中,然后针对第二个单元、第三个单元等重复该过程。但是,矢量化能使 CPU 完成如下所述的操作:将第一个矢量的第一个和第二个单元同时添加到第二个矢量的第一个和第二个单元,并将相应结果存储在第三个矢量的第一个和第二个单元中,从而将此特定计算所需的时间减少一半。

矢量化的不同级别是什么,我如何知道使用了哪个级别?

矢量化需要硬件支持。如果硬件一次只能执行一个计算,则没有软件操作能够通过矢量化获得任何性能提升。

可用的矢量化不同级别如下:

  • 2001 年 Intel 发布其 Pentium 4 处理器后,SSE2 矢量化可用。
  • SSE2 矢量化支持在 2 个双精度浮点数或 4 个单精度浮点数上进行同步算术运算。
  • 2011 年,Intel 随 Sandy Bridge 架构一同发布了 AVX 矢量化(这意味着 Sandy Bridge 和 Ivy Bridge 计算机同时支持 SSE2 和 AVX)。该矢量化级别支持在 4 个双精度浮点数或 8 个单精度浮点数(为 SSE2 的双倍)上进行同步算术运算。
  • 2013 年,Intel 随 Haswell 架构一同发布了 AVX-2 矢量化(这意味着 Haswell 和 Broadwell 同时支持 AVX-2、AVX 和 SSE2)。

    AVX-2 仍旧支持 4 个双精度浮点数或 8 个单精度浮点数(与 AVX 相同),但提供额外的运算。例如,AVX-2 提供了一种称为积和熔加(简称 FMA)的新运算。FMA 指令支持计算机在一次计算(而不是两次)中计算 ab+c(即,首先计算 ab,然后将 c 加到结果中)。

矢量化如何影响结果

虽然矢量化不会造成任何准确性问题,但会造成精度问题。换言之,最终结果的准确性跟之前相同,但是精度会有所不同,例如,对于两个不同级别的矢量化运行,求解器可能会分别返回温度 300.0001 K 和 299.9999 K。

为了更好地理解矢量化如何影响结果,不妨考虑浮点算术的主要问题:舍入误差。舍入误差可造成有悖常理的情况:(a+b)+ca+(b+c)。有关舍入误差的详细信息,请参见 Wikipedia 上的文章:Floating-point arithmetic > Accuracy problems

避免在单个并行作业中使用混合矢量硬件

强烈建议避免使用异类计算集群进行矢量化。即,不要使用其中部分节点具有 AVX-2 功能而其他节点没有 AVX-2 功能的一组资源。矢量化级别变化会导致不同的舍入误差(如上所述)。此外,对于同一个模拟,在具有 AVX-2 功能的节点上的计算结果与在没有 AVX-2 功能的节点上的计算结果略微不同。

参考书目

[12]
Wikipedia。[2018。]“Floating-point arithmetic”,https://en.wikipedia.org/wiki/Floating-point_arithmetic。