社区
汇编语言
帖子详情
关于xmm0~7寄存器问题(SSE)
EndDuke
2007-10-31 08:53:29
我在用SSE写一段四元数运算,一种一个步骤需要对xmm1寄存的中的最高位 xmm1[3] 进行取反
即xmm1[3]=0-xmm1[3]
经过了多次实验 但最终还是失败了
希望高手能够指教 希望代价不会太大 总觉得可以很简单的解决
...全文
2847
15
打赏
收藏
关于xmm0~7寄存器问题(SSE)
我在用SSE写一段四元数运算,一种一个步骤需要对xmm1寄存的中的最高位 xmm1[3] 进行取反 即xmm1[3]=0-xmm1[3] 经过了多次实验 但最终还是失败了 希望高手能够指教 希望代价不会太大 总觉得可以很简单的解决
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
EndDuke
2007-11-04
打赏
举报
回复
真的是十分感谢,受益匪浅。我做图形这部分 刚刚涉及到SSE,很多东西不是很清楚 谢谢
housisong
2007-11-04
打赏
举报
回复
> EndDuke:"方案2 是乘法,速度应该比较慢 和加减运算不是一个数量级的 "
SSE中的乘法也没有你想的那么恐怖
> EndDuke:"方案3 要定义变量 申请和释放都会有消耗,本不想过多地调用内存完成这样的"
不用申请和释放的,所以没有这方面的消耗; 但确实会访问一次内存,多次访问代价相当于一级
缓存的延迟 也可以考虑把它放到寄存器
housisong
2007-11-04
打赏
举报
回复
说“xorps xmm4,xmm4 要比 subps xmm4,xmm4 好? ”
我是基于这样的考虑:
如果是整数,xor和sub方案都没有多大关系,但浮点指令不一样;
比如现在寄存器中存放着整数,把它按照二进制格式映射到float,就可能得到4种类型的float:
正常的规格化float值a、未规格化的float值b、特殊float值(正负无穷大)c、无效float d
调用subps将按照浮点减法: a-a=0; b-b一般的CPU都会正确地得到0; c-c一般还是c;而d-d一般是NaN
(没有查手册)
所以xmm寄存器清零用xorps而不是subps
EndDuke
2007-11-02
打赏
举报
回复
多谢
大熊猫侯佩
2007-11-02
打赏
举报
回复
//xorps xmm4,xmm4 要比 subps xmm4,xmm4 好?
可能指令本身设计的原因。就好像xor比sub make null 更快一样
EndDuke
2007-11-02
打赏
举报
回复
没有测试 不过我青睐于第一种方案 多谢
原因
方案2 是乘法,速度应该比较慢 和加减运算不是一个数量级的
方案3 要定义变量 申请和释放都会有消耗,本不想过多地调用内存完成这样的
附加一个问题
为什么
xorps xmm4,xmm4 要比 subps xmm4,xmm4 好?
当是整数或double的时候 subps不也是零么?
EndDuke
2007-11-01
打赏
举报
回复
问题 暂时解决 期待更好的解决方案
解决代码如下:
subps xmm4,xmm4
movss xmm4,xmm1
subps xmm1,xmm4
subps xmm1,xmm4
一共4行 觉得多少有点 小题大做了 。。。。。 期待更好的解决方案
EndDuke
2007-11-01
打赏
举报
回复
housisong:这种方法可以么 比较青睐 可以这样 操作 xmm0 的最低位的浮点数么?
EndDuke
2007-11-01
打赏
举报
回复
现在我考虑想这样做
movss st0,xmm0
FLDZ
FSUB
movss xmm0,st0
但是 st0 没有定义 不知道应该怎么写 我浮点这块完全 不会
EndDuke
2007-11-01
打赏
举报
回复
能给几行代码么 我很少用汇编的。。。。
housisong
2007-11-01
打赏
举报
回复
如果是浮点数 最高位取反 和 最高寄存器取负 完全一样 (负0的问题不用担心,也是符合IEEE浮点规格的)
所以可以利用 SSE2的整数 位运算 来达到目的
EndDuke
2007-11-01
打赏
举报
回复
其实我发现我挺愚蠢的,把公式变下型现在只用对最低位 求负了
用subss求负应该怎么弄?
EndDuke
2007-11-01
打赏
举报
回复
只取反一位
因为在公式中,其它位都是加,而最有一位应该是减法
我想有没有办法直接操作最高位 subss只能操作最低位,我觉得用shufps来会混合 代价比较大
大熊猫侯佩
2007-11-01
打赏
举报
回复
是最高寄存器整个取反,还是最高位取反?
housisong
2007-11-01
打赏
举报
回复
低寄存器浮点数取反操作
1.
你的方案可以写为3条指令
movss xmm4,xmm1
subss xmm1,xmm4
subss xmm1,xmm4
而且subps xmm4,xmm4清零并不是一个好主意,
这个时候xmm4的当前值可能不一定是一个float浮点数(可能存着整数或double)
可以改成 xorps xmm4,xmm4
2.
可以定义一个常量 float tt=-1.0;
(如果需要多次使用,而且寄存器够用,可以预先载入到寄存器中)
mulss xmm1,tt
(补充: 如果是高位取反,可以定义 float tt[]=(1.0,1.0,1.0,-1.0);
mulps xmm1,tt )
3.
位操作的话这样,定义 int32 tt[]=(0x80000000,0x00000000,0x00000000,0x00000000);
xorps xmm1,tt
你试下哪个快
SIMD_Benchmarking:基本矩阵和向量运算的性能比较。 参考与 x86 SIMD 内在函数(
SSE
、AVX(128256 位)和 AVX2FMA3 指令集)
SIMD 基准测试 测试基本矩阵和向量运算与其 SIMD 对应物的相对性能。 每个操作的时间平均超过 10000 次运行。 使用随机单精度浮点数的 4x4 矩阵或 4D 向量。 对 AVX 128 位 (XMM) 和 256 位 (YMM)
寄存器
执行的单独计算。 AVX2/FMA3(128 位)指令集(融合乘加)需要 Intel Haswell CPU 。 所有操作都经过了相当大的优化。 SIMD 矩阵乘法使用线性组合方法。 在带有 Intel i5-4278u 2.6 GHz 双核 Haswell CPU 的 2014 rMBP 上进行测试。 操作系统:在 VMWare Fusion 7 上运行的 Windows 8.1。 使用 MSVC++ 2012 编译: x64 mode 、 /arch:AVX 、 /fp:Fast 通过__rdtsc()在 CPU 时钟周期中计时。 (也可以
深入解析计算机系统中的XMM
寄存器
,看透系统底层的奥秘!
XMM是英特尔处理器中的一个128位
寄存器
,它是
SSE
(Streaming SIMD Extensions)指令集的一部分。与其他通用
寄存器
(如EAX、EBX、ECX、EDX等)相比,XMM
寄存器
可以同时存储更多数据,并且能够进行更加高效的数据处理,因此使用XMM
寄存器
进行数据处理速度更快。在64位模式下,CPU支持16个XMM
寄存器
,分别以
XMM0
到XMM15表示;在32位模式下,CPU支持8个XMM
寄存器
,以
XMM0
到XMM7表示。此外,在
SSE
2之后的版本中,又引入了YMM、ZMM等扩展
寄存器
。
优化汇编例程(17)
17. 特别话题 17.1. XMM与浮点
寄存器
具有
SSE
指令集的处理器可以在XMM
寄存器
中进行单精度浮点计算。具有
SSE
2指令集的处理器还可以在XMM
寄存器
中进行双精度浮点计算。在XMM
寄存器
与旧式的浮点栈
寄存器
中,浮点计算几乎一样快。使用浮点栈
寄存器
ST(0) ~ ST(7)还是XMM
寄存器
的决定,取决于以下因素。 使用ST()
寄存器
的好处: 与没有
SSE
或
SSE
2的旧式处理器兼容。...
XMM
SSE
2浮点指令
SSE
2 (单指令多数据流扩展)浮点指令使用128位的XMM
寄存器
,可以处理双精度(64位)浮点值。也有一些工作于单精度(32位)浮点值的指令。
SSE
2在Pentium 4 和 Xeon处理器中被提出。 这些指令跟
SSE
浮点指令非常类似,除了它们工作的数据长度不同。 在你的代码中使用这些指令之前,你必须检测你的机器是否支持它们。设置EAX=1,调用CPUID指令,此时测试EDX的第26位,如果
Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 -
SSE
扩展(1) - 概述/历史/新数据类型/XMM
寄存器
组
SSE
Instructions
SSE
Overview & History Intel
SSE
技术的全称是Streaming SIMD Extension,中文译作流式单指令多数据指令扩展。1999年,Intel在Pentium III处理器上引入了
SSE
指令集,包括了70条新指令,主要操作单精度浮点数据类型,用于增强浮点计算性能,面向于数字信号处理与图形处理市场。
SSE
完整的支持...
汇编语言
21,458
社区成员
41,601
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章