gpt4 book ai didi

c++ - 不能对 long double 数据类型进行 openMP 矢量化操作吗?

转载 作者:搜寻专家 更新时间:2023-10-31 01:35:33 25 4
gpt4 key购买 nike

我正在学习 openMP,并以我有限的知识并行化了我的代码。我正在尝试使用 openMP 矢量化技术改进此代码。但是在阅读相关阅读 Material (link)时,我发现无法对 long double 数据类型进行矢量化操作。有人可以提供有关为什么会这样的信息并提出除降低精度之外的解决方案吗?

链接中的内容如下:“避免在 SIMD 硬件中不支持的操作。在 Linux 上使用(80 位)long double 的算术运算和余数运算符“%”是 SIMD 硬件中不支持的操作示例。”

附言我正在使用 INTEL C++ 编译器 16.0.2、具有 128 位长 vector 寄存器的 INTEL XEON 处理器和 Linux。我的数据类型大多是 long double。

最佳答案

x86 指令集的 SIMD 指令仅支持 32 位和 64 位浮点运算(对 16 位 float 的支持有限)。此外,即使有 64 位乘以 64 位到 128 位标量整数指令(例如 mulx),也没有相应的 SIMD 指令。许多人已经尝试并未能实现高效的 128 位整数 x86 SIMD 算法(multiplication 和可能的 addition 有一些异常(exception))。没有通用的 x86 SIMD 整数除法指令。

但是,对于浮点,人们使用 double-double 进行更高精度的浮点 SIMD 运算取得了更大的成功。 . Double-double 具有 106 位精度,而 80 位 long double 具有 64 位精度。但并非每个 C++ 编译器都使用 80 位 long double。有些只使用只有 54 位精度的 double (例如 MSVC),有些使用具有 113 位精度的 128 位四精度,维基百科甚至声称一些编译器将 long double 实现为 double-double。

我描述了双双的一些细节here .请注意,double-double 不是 IEEE 浮点类型,它有一些不寻常的属性。此外,double-double 的范围与 double 相同,因此它只会提高精度。

与 long double 相比,double-double 的速度有多快?我从来没有测试过这个。但我发现,在进行乘法和加法运算的平衡混合时,double-double 比 double 运算慢大约 10 倍。 long double 肯定比 double 慢(除非它被实现为 double)。但是由于您可以将 SIMD 与 double-double 一起使用,但不能与内置的 long double 一起使用,因此速度会与 SIMD 宽度成比例地提高。因此,使用 SSE2 进行 2 次双重操作,使用 AVX 进行 4 次操作,使用 AVX512 进行 8 次操作。

不过不要指望 OpenMP 的 simd 构造能够实现 double 。您需要自己实现或查找库。

关于c++ - 不能对 long double 数据类型进行 openMP 矢量化操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37109647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com