矢量化和 ISA 级别

Simcenter STAR-CCM+ 利用针对指令集架构 (ISA) 和所用处理器的微架构级别量身定制的优化库。

矢量化库的实现显著增强了 Simcenter STAR-CCM+ 在较新处理器上的性能,特别是对于使用耦合求解器的模拟。但是,对于依赖于分离求解器的模拟,这种性能提升不太明显。无需特殊配置即可使用此功能 - Simcenter STAR-CCM+ 自动检测硬件功能并选择适当的矢量化级别。

什么是矢量化?

矢量化是使用单个指令同时执行多个算术运算的过程,通常称为单个指令多数据 (SIMD) 矢量化。例如,考虑两个任意长度的矢量,您希望对它们求和并将结果存储在第三个矢量中。在标量运算(与矢量化相反)中,第一个矢量的第一个单元将添加到第二个矢量的第一个单元,并将结果存储在第三个矢量的第一个单元中。对每个后续单元重复此过程。相反,矢量化允许 CPU 将第一个矢量的第一个和第二个单元同时添加到第二个矢量的第一个和第二个单元,并将结果存储在第三个矢量的相应位置。此方法将该计算所需的时间减少了一半。

支持的微架构级别

x86_64 CPU

对于使用 x86_64 指令集架构的 CPU(如 Intel 或 AMD 的 CPU),当前有以下优化库级别可用:

级别 主要特征
x86-64-v1 SSE2
x86-64-v3 AVX2 和融合乘加 (FMA)

ARM64 / aarch64 CPU

对于采用 aarch64 指令集架构的 CPU,目前有以下优化库级别可用:

级别 主要特征
armv8.2-a(*) 高级 SIMD(NEON,无 FMA)
armv8.2-a+fma NEON + FMA
armv8.2-a+sve 可扩展矢量扩展 (SVE)

(*) armv8.2-a 级别不会自动选择,而是始终被 armv8.2-a+fma 级别取代。

矢量化如何影响结果

虽然矢量化不会引起精度问题,但它可能会导致精度差异。最终结果仍然准确;但是,例如,在不同向量化级别下计算时,300.0001 K 的温度可能会报告为 299.9999 K。

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

避免在单个并行作业中使用混合-ISA-级别

建议不要使用与 ISA/矢量化级别有关的异构计算群集。不要混合使用资源,例如其中有些节点具备 x86-64-v3 (AVX2) 功能,而另一些节点则不具备。如前所述,ISA 和微架构级别的差异会导致不同的舍入误差。此外,对于同一模拟,在具有 x86-64-v3 (AVX2) 功能的节点上计算的结果可能与没有这些功能的节点上计算的结果可能会略有不同。