当前位置: 首页 > 知识库问答 >
问题:

long double数据类型上的openMP矢量化运算是不可能的吗?

许亦
2023-03-14

我正在学习openMP,用我有限的知识,并行化了我的代码。我正试图使用openMP矢量化技术来改进这段代码。但是在浏览相关阅读材料时,我发现对long double数据类型进行矢量化运算是不可能的。有人能提供为什么会这样的信息,并提出除了降低精度以外的解决方案吗?

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

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

共有1个答案

郗福
2023-03-14

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

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

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

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

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

 类似资料:
  • 问题内容: 我出现了不想要的行为,即,它更改了进入原始函数的参数的数据类型。我最初的问题是关于一般情况的,我将使用这个新问题来提出更具体的情况。 (为什么要问第二个问题?为了说明问题,我创建 了一个关于更具体案例 的问题-从具体问题到更一般的问题总是比较容易。而且我 单独 创建了这个问题,因为我认为这是有助于保持一般情况以及对一般情况的答复(应该找到),而不会因为考虑解决任何特定问题而受到“污染”

  • 这句看似微不足道的台词摘自我的迈克·巴纳汉的C书 我可以理解隐式提升是如何根据操作数的类型在诸如之类的表达式中发挥作用的,但我无法理解在诸如之类的表达式中,隐式提升是如何以及在何种情况下发挥作用的,其中b是任何合法的操作数。你能解释一下,然后给出一个恰当的例子吗? 摘录如下: 通常的算术转换应用于运算符的二进制形式的两个操作数。仅对运算符的一元形式的操作数执行积分提升。 更新: 为了避免被忽视,我

  • 问题内容: 我想写一个Naive Base文本分类器。由于sklearn不接受“文本格式”功能,因此我正在使用TfidfVectorizer对其进行转换。 我仅使用转换后的数据作为特征就能够成功创建此类分类。代码如下: 一切都按预期工作,但是当我想添加其他功能时遇到问题。指示天气的标志,给定的文本包含某个关键字。我尝试了多种方法来正确地转换“ url”功能,然后将转换后的功能与另一个布尔功能组合在

  • 所以我有那个代码,我是通过上传到Imgur v3使用Javahttps错误得到的,我在第50行得到一个错误,因为“列表”告诉我 类型列表不是泛型的;它不能用参数参数化 我能做些什么来解决这个问题? 我正在使用http://hc.apache.org/httpclient-3.x/并希望使用v3 API将图像上传到imgur。 编辑:更改导入后,我现在收到这些错误。 这就解决了这个问题,但又给了我两

  • 在将中缀表达式转换为后缀表达式的上下文中,使用分流码算法。我想使用一个向量来存储输出,它将存储运算符和数字类型数据。 上面的代码当然不会编译,因为方法没有为定义。我看到两种方法来修复它: 定义 方法 创建一个向量来存储对数字和的引用。 我认为第二个是首选,尽管我不知道创建引用向量是否会带来很多复杂性。

  • 注意:我知道以前在SO上也问过类似的问题,但我觉得它们没有帮助或非常清楚。 第二点注意:对于这个项目/任务的范围,我试图避免使用第三方库,比如Boost。 我想看看是否有一种方法可以让一个向量在它的每个索引中包含多种类型。例如,假设我有以下代码示例: 我听过向量 在我的实际应用中,我知道哪些可能的类型可能被插入到一个向量中,但是这些类型并不都来自同一个超级类,并且不能保证所有这些类型都会被推到向量

  • 问题内容: 有没有一种方法可以执行以下任一操作: - 要么 - 问题答案: 并非开箱即用。但是,很容易以多种语言(包括JS)进行手工构建。 您可以使用基于ASCII的名称(例如)来避免在不需要时使用字符串。但是,由于有人用字符串表示运算符并希望从中获得功能,所以提出了与此问题类似的问题的一半。

  • 本文向大家介绍不能做switch()的参数类型是:相关面试题,主要包含被问及不能做switch()的参数类型是:时的应答技巧和注意事项,需要的朋友参考一下 switch 的参数不能为实型。