是否无法对长双数据类型执行openMP矢量化操作
Is openMP vectorization operations on long double datatype not possible?
我正在学习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
构造实现双双。您需要自己实现或找到一个库。
- 我使用 OpenMP 的线程越多,执行时间就越长,这是怎么回事?
- 对OpenMP reduction子句中的变量执行原子操作
- 为什么 std::chrono 在测量循环和编译器优化的并行 OpenMP 的执行时间时不起作用?
- 为什么 C++ openMP 程序执行时间更长
- OpenMP 4.5 任务依赖关系和执行顺序
- C++ OpenMP 斐波那契:1 个线程的执行速度比 4 个线程快得多
- 使用 OpenMP 并行执行比串行执行 c++ 花费更长的时间,我计算执行时间是否正确?
- OpenMP 并行编程基于线程数与执行时间的关系
- 使用OpenMP库,执行时间如何取决于线程数量的增加
- 使用OpenMP在指定的核心上执行特定函数
- OpenMP 构造,在至少 1 个线程完成后立即继续执行
- OpenMP 一次只执行一个线程
- OpenMP:嵌套的 for 循环,执行时间几乎没有任何差异
- 为什么要在我的OpenMP代码中增加执行时间
- 是否无法对长双数据类型执行openMP矢量化操作
- C++和OpenMP——线程的执行时间大不相同
- OpenMP将函数的执行分配给线程
- openMP 在自定义容器中从 2 到 4 个线程执行二进制搜索时速度变慢
- OpenMP - 在执行期间挂起
- 在 OpenMP 代码C++测量执行时间