【发布时间】:2016-05-09 07:07:13
【问题描述】:
我正在学习 openMP,但我的知识有限,我的代码已并行化。我正在尝试使用 openMP 矢量化技术改进此代码。但是在阅读相关阅读材料(link)时,我发现不可能对 long double 数据类型进行矢量化操作。有人可以提供有关为什么会这样的信息并提出解决方案而不是降低精度吗?
链接中的内容如下:“避免 SIMD 硬件不支持的运算。Linux 上(80 位)long doubles 的算术运算,余数运算符“%”是 SIMD 硬件不支持的运算示例。”
附:我正在使用 INTEL C++ 编译器 16.0.2、带有 128 位长向量寄存器和 Linux 的 INTEL XEON 处理器。我的数据类型大多是 long double。
【问题讨论】:
-
我认为您将并行性与矢量内在混淆了。我怀疑可以并行化这些操作,即使它们没有映射到英特尔的 ISA。无论如何,您需要发布一个完整的、可运行的示例。
-
因为 x86 SIMD 硬件(SSE 到 AVX512)仅支持 32 位和 64 位浮点运算,并且没有整数除法指令。
-
你为什么使用 long double?
-
@Zboson 我正在开发 CFD 求解器。为了确保方案的数值稳定性,我们需要良好的精度。这就是为什么。
-
@prasanna:只有 54 位精度才能变得稳定的算法非常少,而那些很少会被简单地转换为使用较少位即可稳定的等效算法。如果您有更高的精度,您可能会发现迭代解决方案在更少的步骤中收敛,这是真正的好处,但是当每个更高的精度步骤更慢时,您会再次失去它。所以 64 位双精度可能是最快的。
标签: c++ parallel-processing x86 openmp sse