是否有适用于双打 (__m128d) 的 Move (_mm_move_ss) 和 Set (_mm_set_ss) 内在函数?

2024-05-25

多年来,我有几次看到 in 中的内在函数float参数被转换为__m128使用以下代码:__m128 b = _mm_move_ss(m, _mm_set_ss(a));.

例如:

void MyFunction(float y)
{
    __m128 a = _mm_move_ss(m, _mm_set_ss(y)); //m is __m128
    //do whatever it is with 'a'
}

我想知道是否有类似的使用方法_mm_move and _mm_set内在函数对双打做同样的事情(__m128d)?


几乎每一个_ss and _ps内在/指令有一个double版本带有_sd or _pd后缀。 (标量双精度或压缩双精度)。

例如,搜索找到需要的内在函数double作为第一个参数。或者只是找出最佳的 asm 是什么,然后在 insn 参考手册中查找这些指令的内在函数。除了它没有列出所有内在函数movsd http://www.felixcloutier.com/x86/MOVSD.html,因此在内在函数查找器中搜索指令名称通常是有效的。

回复:头文件:总是只包含<immintrin.h>。它包括所有英特尔 SSE/AVX 内在函数。


也可以看看方法来放置一个float变成一个向量 https://stackoverflow.com/a/11766098/224132,以及sse /questions/tagged/sse标记 wiki 以获取有关如何随机排列向量的链接。 (即洗牌指令表Agner Fog 的优化装配指南 http://www.agner.org/optimize/)

(请参阅下面的 godbolt 链接到一些有趣的编译器输出)

回复:你的序列

仅使用_mm_move_ss(或 sd)如果你真的想合并两个向量。

你没有展示如何m被定义为。您的使用a作为浮点数和向量的变量名称意味着向量中唯一有用的信息是floatarg。变量名冲突当然意味着它无法编译。

不幸的是,似乎没有任何方法可以“投射”float or double变成一个向量,上面 3 个元素中有垃圾,就像 for__m128 -> __m256:
。我发布了一个关于内在函数的限制的新问题:如何将标量合并到向量中,而不会让编译器浪费指令将上部元素归零?英特尔内在函数的设计限制? https://stackoverflow.com/questions/39318496/how-to-merge-a-scalar-into-a-vector-without-the-compiler-wasting-an-instruction

我尝试使用_mm_undefined_ps()为了实现这一点,希望这能告诉编译器它可以将传入的高垃圾留在原处,在

// don't use this, it doesn't make better code
__m128d double_to_vec_highgarbage(double x) {
  __m128d undef = _mm_undefined_pd();
  __m128d x_zeroupper = _mm_set_sd(x);
  return _mm_move_sd(undef, x_zeroupper);
}

但 clang3.8 将其编译为

    # clang3.8 -O3 -march=core2
    movq    xmm0, xmm0              # xmm0 = xmm0[0],zero
    ret

所以没有优势,仍然将上半部分归零,而不是将其编译为只是ret。 gcc 实际上会生成非常糟糕的代码:

double_to_vec_highgarbage:  # gcc5.3 -march=nehalem
    movsd   QWORD PTR [rsp-16], xmm0      # %sfp, x
    movsd   xmm1, QWORD PTR [rsp-16]      # D.26885, %sfp
    pxor    xmm0, xmm0      # __Y
    movsd   xmm0, xmm1    # tmp93, D.26885
    ret

_mm_set_sd似乎是将标量转换为向量的最佳方法。

__m128d double_to_vec(double x) {
  return _mm_set_sd(x);
}

clang 将其编译为movq xmm0,xmm0, gcc 到存储/重新加载-march=generic.


其他有趣的编译器输出来自float and doubleGodbolt 编译器浏览器上的版本 http://gcc.godbolt.org/#compilers:!((compiler:g530,options:'-xc+-std%3Dgnu11+-Wall+-Wextra++-O3+-fverbose-asm+-march%3Dnehalem',sourcez:MQSwdgxgNgrgJgUwAQB4QFt3gC4CdwB0AFgHwBQZA%2BpegIwBMAHEgGZQD2Ahtpdu5QDcEEABRsu2JAA8AlEgDeZJElwJsMXGCQ10lAM5r9ekbIDcZAL4VqdJqw7de/IREpEQAcyIfOuAEacHghiDpKyCkraNAzMMGCILEgAvNqYlHEJ4AhwlAAOxjLmyjYx0pQAXgi47DC5uVXJqboGPHrGZpGq6ppNNOxCRiIZCCwANGWV1bX1uIWWFFTRduKOfILClA5wIRLScorKXRpaOptcOW0iAGQdVou2zACyAJ4AYnEQ2CDsYDvcSM8ZGQDsoog8kOhGqcWpN%2BPkRHNQWDSpwoWl0P0EIN0ONoYZLoDESo1MckJwiqCAPSUuDsJAAdyI3AQQlwSBAkhAegZHKISAA5Jx%2BfMyNSxeKJcpaTA/FBkKy9N8wAAuYm5KCcCDINqU/I87B8vRwXVwUWUpB6djoZBwEAsFhVBCQBB6VVmpDQThgDxIAC06F8ECISSCYCqIAgFqtagwLqQMAM3NUHl9yYh/QAjkg%2BEhYdmiMhpg0mVAWO7GY72ZJbXAwPzJAnkBiBHBWOw2QbtZxrUhchpcuwDOytJ37LsFUrrEtGK3pbKsWsXCI53K9hFDiSenjWttblOHrOavOnOtXO4vD5/IFgivkOEQSUmK3hokUqcX1kcrltkTHzOJlUNR1A0b5pC0%2Bi7kSRxbuimIQUM8QjOMUgVIBRazOYdz3DEh4ynKJ4uGcnDbLea4gtBJxpFs8E3HMdx/rhx4vO8kBfD8y5HqugLrqCDEQmizRqLCeQ/hSxTTq2qKgbozZYkaIg4r04HyYSFIUWSYlINStIMky2Asg0HLsty9K8gKQqWEAAAA%3D)),filterAsm:(commentOnly:!t,directives:!t,intel:!t,labels:!t),version:3

float_to_vec:   # gcc 5.3 -O3 -march=core2
    movd    eax, xmm0       # x, x
    movd    xmm0, eax       # D.26867, x
    ret

float_to_vec:   # gcc5.3 -O3 -march=nehalem
    insertps        xmm0, xmm0, 0xe # D.26867, x
    ret

double_to_vec:    # gcc5.3 -O3 -march=nehalem.  It could still have use movq or insertps, instead of this longer-latency store-forwarding round trip
    movsd   QWORD PTR [rsp-16], xmm0      # %sfp, x
    movsd   xmm0, QWORD PTR [rsp-16]      # D.26881, %sfp
    ret
float_to_vec:   # clang3.8 -O3 -march=core2 or generic (no -march)
    xorps   xmm1, xmm1
    movss   xmm1, xmm0              # xmm1 = xmm0[0],xmm1[1,2,3]
    movaps  xmm0, xmm1
    ret

double_to_vec:  # clang3.8 -O3 -march=core2, nehalem, or generic (no -march)
    movq    xmm0, xmm0              # xmm0 = xmm0[0],zero
    ret


float_to_vec:    # clang3.8 -O3 -march=nehalem
    xorps   xmm1, xmm1
    blendps xmm0, xmm1, 14          # xmm0 = xmm0[0],xmm1[1,2,3]
    ret

所以 clang 和 gcc 都使用不同的策略float vs. double,即使他们可以使用相同的策略。

使用整数运算,例如movq浮点运算之间的操作会导致额外的旁路延迟延迟。使用insertps将输入寄存器的高位元素清零应该是 float 或 double 的最佳策略,因此所有编译器should当 SSE4.1 可用时使用它。 xorps + Blend 也很好,并且比 insertps 可以在更多端口上运行。存储/重新加载可能是最糟糕的,除非我们在 ALU 吞吐量上遇到瓶颈,并且延迟并不重要。

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

是否有适用于双打 (__m128d) 的 Move (_mm_move_ss) 和 Set (_mm_set_ss) 内在函数? 的相关文章

随机推荐

  • 二维随机微分方程 (SDE)

    我第一次研究随机微分方程 我正在寻求模拟和求解二维随机微分方程 模型如下 dp F t p dt G t p dW t where p 是一个 2 1 向量 p theta t phi t F是列向量 F sin theta Psi cos
  • 为什么无法在 F# 项目中添加子文件夹?

    在大多数 NET项目中 我可以使用文件夹来组织代码文件 在 C 中 我不能 但过滤器最终会扮演相同的角色 但是 在 Visual Studio 2010 中的 F 中 我不能 每个代码文件都直接显示在项目目录中 为什么这个功能不可用 组织包
  • 由于“primaryKeyPosition”值错误,房间数据库迁移测试出错

    我正在测试房间迁移 在 迁移和验证 步骤中我得到了一个java lang IllegalStateException 迁移失败 由于一个错误的primaryKeyPosition service id 列上的值 深入挖掘后我注意到Expec
  • 尝试提取 jar 文件时出错

    我正在尝试使用以下命令提取 jar 文件 C Program Files Java jdk1 7 0 25 bin gt jar xf C Users MyJar jar 但出现错误 java io IOException META INF
  • Django 和 AWS 简单电子邮件服务 [重复]

    这个问题在这里已经有答案了 我正在尝试启动并运行 django 站点 并且正在尝试启用 django 的标准密码重置服务 我的网站由 AWS EC2 托管 因此我想将 AWS SES 用于我的电子邮件服务 但是 我无法使 smtp 连接正常
  • 如何在 configmap.yaml (Helm) 中使用 json 文件?

    我正在使用 Helm 部署到 Kubernetes 集群 我研究了配置映射 发现可以从文件中检索数据并将其放入配置映射中 我有以下内容configmap yaml kind ConfigMap apiVersion v1 metadata
  • iOS表单键盘不消失

    我知道我必须打电话 BOOL disablesAutomaticKeyboardDismissal return NO this dismiss keyboard on ios BOOL textViewShouldBeginEditing
  • 将字符串转换为整数数组 String at = "1 2 3 4 5" 转换为 ar=[1,2,3,4,5]

    我正在读取一个字符串 作为一整行数字 用空格分隔 即1 2 3 4 5 我想将它们转换为整数数组 以便我可以操作它们 但这段代码不起作用 它说不兼容的类型 String str br readLine int array new int 4
  • XSD 验证错误:在 web.xml 中找不到 TagLib 标记

    我详细显示错误如下 cvc complex type 2 4 a 发现以元素开头的无效内容 taglib One of http java sun com xml ns javaee 描述 http java sun com xml ns
  • iOS:AVPlayer 视频预加载

    我正在使用 AVPlayer 来播放视频 它们的长度很短 2 5秒 它们以随机顺序播放 问题是 当更改视频并开始播放新视频时 设备会滞后很短的时间 但我不希望更改流畅 有没有办法用 AVPlayer 预加载视频 尝试使用AVQueuePla
  • 核心蓝牙框架本质上是异步的吗?

    当我在应用程序中使用 CB 框架时 我没有引入任何并发性或反应性方法 并且一切正常 当我每秒从外设接收超过 100 个样本时 UI 不会被阻止 这是否意味着它被设计为异步工作 我没有找到任何说明它具有异步性质的资源 也没有找到任何在使用核心
  • matplotlib pyplot 不在 Visual Studio 中绘图?

    我使用的是 VS 2013 Express 版本 安装了 python 工具和 canopy python 2 7 当我运行代码时 我试图绘制一个简单的函数 但它不起作用 import numpy as np import matplotl
  • Visual Studio 2013 的 TypeScript 1.3 缺少 SDK 目录 (tsc.exe)

    Typescript v1 3 是今天宣布 http blogs msdn com b typescript archive 2014 11 12 announcing typescript 1 3 aspx 所以我安装了VS2013 的电
  • Web SQL 将数据插入多行

    我尝试在 Web SQL 数据库中一次将变量插入多行 但使用我所知的所有方法时 我收到错误 INSERT INTO tab a b VALUES v1 v2 v3 v4 gt gt could not prepare statement 1
  • Python绕相机轴旋转图像

    假设我有一个图像 是在对某些原始图像应用单应性变换 H 后获得的 未显示原始图像 将单应性 H 应用于原始图像的结果是该图像 我想围绕合适的轴 可能是相机所在的位置 如果有的话 将此图像旋转 30 度以获得此图像 如果我不知道相机参数 如何
  • MySQL 布尔模式匹配对中间词不返回任何内容

    我在 MySQL 数据库中使用 Match Against 时遇到问题 希望有人能提供帮助 这是我的数据库中的数据示例 id name 1 really bitter chocolate 2 soft cheese 当我运行此查询时 SEL
  • Google Analytics Pod 安装了太多依赖项

    我刚刚添加了 Google Analytics Pod 如中所述他们的 iOS 开发者指南 https developers google com analytics devguides collection ios v3 with pod
  • 从 J2SE 5.0 学习 Java SE 6 有多难?

    我是新来的 我有一个简单的问题 希望有人能帮助我 我即将开始学习Java 正在寻找一本好的教材来使用 我发现 Y Daniel Liang 的 Java 编程入门 评价很高 但我想知道是否可以使用旧的第 6 版 2006 年 7 月 22
  • 如何在 SwiftUI 中使用 @FetchRequest 和新的可搜索修饰符?

    是否可以使用新的 searchable结合 FetchRequest 我有这样的代码 struct FooListView View Environment managedObjectContext private var viewCont
  • 是否有适用于双打 (__m128d) 的 Move (_mm_move_ss) 和 Set (_mm_set_ss) 内在函数?

    多年来 我有几次看到 in 中的内在函数float参数被转换为 m128使用以下代码 m128 b mm move ss m mm set ss a 例如 void MyFunction float y m128 a mm move ss