如何将 __m128d simd 向量的内容存储为双精度,而不将其作为联合访问?

2023-12-21

我想要优化的代码基本上是一个简单但大型的算术公式,自动分析代码以并行计算独立的乘法/加法应该相当简单,但我读到自动向量化仅适用于循环。

我已经读过多次了,应该不惜一切代价避免通过联合或其他方式访问向量中的单个元素,而应该用 _mm_shuffle_pd 代替(我只处理双打)...

我似乎不知道如何将 __m128d 向量的内容存储为双精度,而不将其作为联合访问。另外,与标量代码相比,这样的操作是否会带来任何性能增益?

union {
  __m128d v;
  double d[2];
} vec;
union {
  __m128d v;
double d[2];
} vec2;

vec.v = index1;
vec2.v = index2;
temp1 = _mm_mul_pd(temp1, _mm_set_pd(bvec[vec.d[1]], bvec[vec2[1]]));

另外,这两个联合看起来丑陋得可笑,但是当使用时

union dvec {
  __m128d v;
  double d[2];
} vec;

尝试将 indexX 声明为 dvec,编译器抱怨 dvec 未声明。


不幸的是,如果你看一下 MSDN,它是这样说的:

You 不应该访问__m128d 字段directly. 但是,您可以在调试器中看到这些类型。__m128 类型的变量映射到 XMM[0-7] 寄存器。

我不是 SIMD 专家,但这告诉我你所做的事情不会起作用,因为它不是设计的。

EDIT:

我刚刚找到了这个 http://www.rz.uni-karlsruhe.de/rz/docs/VTune/reference/Intrins_API.htm,它说:

仅在赋值的左侧使用 __m128、__m128d 和 __m128i,作为返回值或参数。请勿在其他算术表达式中使用它,例如“+”和“>>”。

它还说:

在聚合中使用 __m128、__m128d 和 __m128i 对象,例如联合(例如,用于访问浮点元素)和结构。

所以也许你可以使用它们,但只能在工会中使用。然而,这似乎与 MSDN 所说的相矛盾。

EDIT2:

这是另一个有趣的资源,通过示例描述了如何使用这些 SIMD 类型 http://locklessinc.com/articles/interval_arithmetic/

在上面的链接中,您会发现这一行:

#include <math.h>
#include <emmintrin.h>
double in1_min(__m128d x)
{
    return x[0];
}

在上面我们使用 gcc 4.6 中的新扩展来通过索引访问高低部分。旧版本的 gcc 需要使用并集并写入两个双精度数的数组。这很麻烦,而且当优化关闭时速度会特别慢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 __m128d simd 向量的内容存储为双精度,而不将其作为联合访问? 的相关文章

随机推荐

  • 为什么“删除[][]...多维数组;” C++中不存在运算符

    我一直想知道标准C 语言中是否有删除多维数组的运算符 如果我们创建了一个指向一维数组的指针 int array new int size 删除看起来像 delete array 那太棒了 但是如果我们有二维数组 我们就不能这样做 delet
  • python导入语句

    我已经开始使用 Python 大约一个月了 我遇到了一些我想更好地理解的事情 跟进口有关系 所以我有一个模块 根 核心 连接性 现在在这个模块中我定义了一个类 Connectivity 该模块还有一个 main 仅用于测试目的 不确定这是否
  • MYSQL - 将数据拆分为多行

    我使用一个应用程序导入了一些数据 该应用程序从 IMDB 收集信息并将其传输到 MYSQL 数据库中 这些字段似乎尚未标准化 并且 1 个字段中包含许多值 例如 Table Movie MovieID Movie Title Written
  • 删除div之间的空白

    我在两个 div 之间发现了一些奇怪的空白 每个div都有css属性display inline block每个都有固定的高度和宽度 我找不到空白在哪里 这是一个小提琴 http jsfiddle net RVAQp 1 那里有空格 因为
  • 如何使用 TypeScript 从 npm 扩展模块?

    我在用着joi https github com hapijs joi blob master API md and 类型 joi https github com DefinitelyTyped DefinitelyTyped tree
  • 无法获得 D-Bus 连接:不允许操作

    我正在尝试在 docker centos7 映像上安装 ambari 2 6 但在 ambari 设置步骤中以及在初始化 postgresql 数据库时 我收到此错误 无法获得 D Bus 连接 不允许操作 每次我尝试在 Docker 映像
  • swagger 正在添加上下文根两次

    我正在使用 swagger 3 0 0 SNAPSHOT 和 spring data rest 我的应用程序属性文件中有上下文配置 server servlet context path sample 我的swagger配置如下 Confi
  • 在 DataGridTemplateColumn 内的 TextBlock 上复制 ContextMenu 上的命令

    想问一下 因为以前从未在 TextBlock 上这样做过 我无法复制 DataGridTemplateColumn 的内容 其中有一个 TextBlock 并且我已为其分配了一个上下文菜单 复制的内容是空白的 当我在 MS Word 中尝试
  • Python BeautifulSoup:解析具有相同类名的多个表

    我正在尝试解析 wiki 页面中的一些表格 例如http en wikipedia org wiki List of Bollywood films of 2014 http en wikipedia org wiki List of Bo
  • 如何在不使用异常的情况下检查 constructor() 中的失败?

    我正在处理的所有类都有 Create Destroy 或 Initialize Finalized 方法 Create 方法的返回值为bool像下面这样 bool MyClass Create 所以我可以从返回值中检查实例的初始化是否成功
  • Aeson:将动态键解析为类型字段

    假设有一个像这样的 JSON bob id name bob age 20 jack id name jack age 25 是否可以将其解析为 Person with Person定义如下 data Person Person id Te
  • php 正则表达式 utf-8 中的单词边界匹配

    我在 utf 8 php 文件中有以下 php 代码 var dump setlocale LC CTYPE de DE utf8 German Germany utf 8 de DE german var dump mb internal
  • 如何定义常量值 - 最佳实践

    我有两种定义常量的方法 第一个在类中保存一堆静态最终 DataType 变量 另一个使用 Enum 这是拳头类型 public class TipTipProperties public static final String MAX WI
  • 动态创建 QML ListElement 和内容

    所以我试图在 a 中动态创建 ListElementsListModel 在我尝试在 ListElements 中写入一些要动态加载的内容之前 这种方法工作得很好 我尝试用以下命令创建一个自己的文件ListElement在 和 小时内作为属
  • Jackson:名称为“defaultReference”的多个反向引用属性

    我正在尝试将 json 字符串格式 映射到对象 但出现以下错误 com fasterxml jackson databind JsonMappingException 多个 名称为 defaultReference 的反向引用属性 这是 j
  • 静态地图:绘制具有多个点的多边形。 (2048 个字符限制)

    由于 get 请求中存在 2048 个字符的限制 因此您无法使用 Google Static Maps 生成包含具有大量多边形点的多边形的图像 特别是当您尝试在一张地图上绘制许多复杂的多边形时 如果您使用 Google Maps API 那
  • php 脚本查找 Web 服务器名称

    是否有任何 php 脚本可以查找 Web 服务器的名称 例如 apache varnish nginx 等 我了解 netcraft 和 wappalyzer 但我想要一个脚本在我的本地计算机上运行 主要原因是 我的本地机器中有4台服务器A
  • Haskell 中“show”出现歧义

    我是函数式编程的新手 我正在尝试使用 Haskell 创建并展示堆栈 我希望我的程序能够向我展示我正在用它构建的堆栈 这是我的代码 module Stack Stack empty push pop top isEmpty where da
  • Windows 10 通用应用程序 - 默认情况下以全屏模式运行

    我有目标 Windows 8 1 的应用程序 当我在 Windows 10 上运行此应用程序时 它默认在小窗口中运行 因为它是主要的平板电脑应用程序 所以我需要它默认以全屏模式运行 是否可以在 Visual Studio 中或应用程序的某些
  • 如何将 __m128d simd 向量的内容存储为双精度,而不将其作为联合访问?

    我想要优化的代码基本上是一个简单但大型的算术公式 自动分析代码以并行计算独立的乘法 加法应该相当简单 但我读到自动向量化仅适用于循环 我已经读过多次了 应该不惜一切代价避免通过联合或其他方式访问向量中的单个元素 而应该用 mm shuffl