是否无法对长双数据类型执行openMP矢量化操作

Is openMP vectorization operations on long double datatype not possible?

本文关键字:执行 openMP 矢量化 操作 数据类型 是否      更新时间:2023-10-16

我正在学习openMP,凭借我有限的知识,我已经将代码并行化了。我正在尝试使用openMP矢量化技术来改进此代码。但在浏览相关阅读材料(链接)时,我发现不可能对长双数据类型进行矢量化操作。有人能提供为什么会这样的信息,并提出除了降低精度之外的解决方案吗?

链接中的内容如下:"避免SIMD硬件不支持的操作。Linux上(80位)长的算术加倍,余数运算符"%"是SIMD硬件中不支持的运算示例。"

附言:我使用的是INTEL C++编译器16.0.2、带有128位长矢量寄存器的INTEL XEON处理器和Linux。我的数据类型大多是长双。

x86指令集的SIMD指令仅支持32位和64位浮点运算(对16位浮点运算的支持有限)。此外,即使存在64位乘以64位到128位的标量整数指令(例如mulx),也没有相应的SIMD指令。许多人试图实现高效的128位整数x86 SIMD算法,但都失败了(乘法和加法也有一些例外)。没有通用的x86 SIMD整数除法指令。

然而,对于浮点运算,人们使用双精度浮点SIMD运算取得了更大的成功。双精度为106位,而双精度为64位,双精度为80位。但并不是每个C++编译器都使用80位长的double。有些只使用只有54位精度的double(例如MSVC),有些则使用128位精度为113位的quad,维基百科甚至声称,在一些编译器中,long double被实现为double double。

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

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

不过,不要期望OpenMP的simd构造实现双双。您需要自己实现或找到一个库。