AVX指令去除-0符号位
一、AVX -0影响
在AVX指令运算中,-0和0是不同的,-0运算在常规运算中没有影响,但在按位计算中会造成很严重的影响
比如:
#define AVX_ONE_FLOAT {1.f,1.f,1.f,1.f,1.f,1.f,1.f,1.f}__m256 one = _mm256_set1_ps(0.f);
__m256 neg_one = _mm256_set1_ps(-0.f);
__m256 one_half = _mm256_set1_ps(-1.f);__m256 mul = _mm256_and_ps(_mm256_mul_ps(one, one_half),AVX_ONE_FLOAT); // {-1})
__m256 neg_mul = _mm256_and_ps(_mm256_mul_ps(neg_one, one_half),AVX_ONE_FLOAT); //{1}
如上所示,mul和neg_mul的结果完全相反
二、去除-0符号
如何在消除-0的影响时,又能不影响其他值呢,如下所示:
#define EQ_OQ 0x0 //等于 =
#define AVX_ONE_FLOAT {1.f,1.f,1.f,1.f,1.f,1.f,1.f,1.f}
#define AVX_NEG_ONE_FLOAT {-1.f,-1.f,-1.f,-1.f,-1.f,-1.f,-1.f,-1.f}
#define AVX_ZERO_FLOAT {0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f}
#define AVX_NEG_ZERO_FLOAT {-0.f,-0.f,-0.f,-0.f,-0.f,-0.f,-0.f,-0.f}__m256 value = _mm256_set_ps(0.6f, 0.4f, -0.f, 0, -0.f, -0.6f, -0.3f, -0.1f);__m256 zero_flg = _mm256_and_ps(_mm256_cmp_ps(value, AVX_NEG_ZERO_FLOAT, EQ_OQ), AVX_NEG_ONE_FLOAT); //取0标志
//{ 0.000000000 0.000000000 0.000000000 -1.00000000 -1.00000000 -1.00000000 0.000000000 0.000000000 }
__m256 dir_flg = _mm256_and_ps(_mm256_or_ps( _mm256_and_ps(value, AVX_NEG_ZERO_FLOAT), AVX_ONE_FLOAT),AVX_NEG_ONE_FLOAT); //取符号
//{ -1.00000000 -1.00000000 -1.00000000 -1.00000000 1.00000000 -1.00000000 1.00000000 1.00000000}
__m256 zero_and_dir = _mm256_and_ps(zero_flg, dir_flg); //-0 方向
//{1.00000000 1.00000000 1.00000000 -1.00000000 1.00000000 -1.00000000 1.00000000 1.00000000 }
__m256 zero_dir = _mm256_or_ps(zero_or_dir, AVX_ONE_FLOAT); value = _mm256_mul_ps(value, zero_dir); // == 0 {1}
``//{ -0.100000001 -0.300000012 -0.600000024 0.000000000 0.000000000 0.000000000 0.400000006 0.600000024}1、将-0和0筛选出来
2、取所有值符号
3、取-0和0符号位,移除非0符号影响
4、与-0相乘即可消除-0影响我蠢了value = _mm256_add_ps(value, AVX_ZERO_FLOAT); //加0就可以消除影响
AVX指令去除-0符号位相关推荐
- 汇编王爽老师,FR寄存器的溢出位OF 与 进位CF的解析,补充SF符号位,cmp与ZF
dosbox里运行debug.exe程序,显示的8位标志寄存器信息如下: OF DF IF SF ZF AF PF CF OV DN EI NG ZR AC PE CY NV UP DI P ...
- C语言符号位补码要变吗,补码与符号位取反
补码与符号位取反 先来一个 C 语言的小例子: #include #include int main(void) { int16_t n = -1; n &= 0x7FFF; // 按位与 p ...
- 汇编语言-013(DAS 、DAA与DAS、QWORD类型用SBB借位减法、编写指令将AX符号扩展到EAX,不能使用CWD、用SHR和条件判断指令将AL循环右移一位、SHLD、压缩十进制转换)
1:DAS : SUB或SBB在AL中生成二进制结果,DAS(减法后的十进制调整)转压缩十进制格式 .386 .model flat,stdcall.stack 4096 ExitProcess PR ...
- 《编写高质量代码:改善c程序代码的125个建议》——建议14-2:在右移中合理地选择0或符号位来填充空出的位...
本节书摘来自华章计算机<编写高质量代码:改善c程序代码的125个建议>一书中的第2章,建议14-2,作者:马 伟 更多章节内容可以访问云栖社区"华章计算机"公众号查看. ...
- 有一个字长32位的浮点数符号位1位_边缘计算专题:(二)别看只有0和1,数学不好的勿进!...
一.二进制数与信息表示 1.概述 二进制的由来 德国最重要的自然科学家.数学家.物理学家.历史学家和哲学家,一个举世罕见的科学天才,和牛顿同为微积分的创建人--莱布尼兹. 在数学史上,西方史学家认为他 ...
- 编程中无穷大的设定 很多人可能设为0x7fffffff,这个数的确是32-bit int的最大值,符号位为0,其他的都是1 但在很多情况下,0x7fffffff会出现错误,比如溢出,这样两个无穷大数相
很多人可能设为0x7fffffff,这个数的确是32-bit int的最大值,符号位为0,其他的都是1 但在很多情况下,0x7fffffff会出现错误,比如溢出,这样两个无穷大数相加会变成负数,还有如 ...
- 将0.1101101*2^(-10)表示成阶码用4位移码、尾数用8位原码(含符号位)的浮点数
0.1101101 * 2^(-10) 表示成阶码用4位移码.尾数用8位原码(含符号位)的浮点数是: 符号位:0 阶码(4位移码):0111 尾数(8位原码):11011010 所以,0.110110 ...
- 为什么计算机中数字符号位0表示正数,1表示负数
大学时上计算机组成原理课程的时候,上到计算机如何存储数据的相关知识时,因为计算机世界里面所有的数据归根结底都是由0和1来存储的,那么如何表达数值的正负呢?只知道书本上说是有一个符号位,当该符号位为 ...
- SF符号位什么时候为1,什么时候为0!二进制如何判断符号位正负!
首先让我们看一下SF到底是什么? SF(sign flag)符号位:当运算结果为负时,SF置1,记为NG(negative),为正时清零记为NZ(Non Zero). 那么我看这段说明简直就是一点用处 ...
最新文章
- 一步步带你做vue后台管理框架(三)——登录功能
- 广汽研究院BMS软件工程师_感·创未来 2020广汽科技日有哪些干货?
- OpenCV使用形态学转换提取水平和垂直线的实例(附完整代码)
- 选项卡示例代码###
- Exchange Server 2013预览版服务器角色概况
- 为什么乱码:meta http-equiv=content-type前的非ANSI字符
- 河北大学计算机在哪学,河北大学计算机科学与技术学院
- verilog 不可综合语句 总结 汇总(Z)
- Adobe Air 写文件如何换行
- python第四课知识点总结
- uboot中DEBUG定义
- Kalman Filter—Data Fusion, Covarince Matrix, State Space Representation, Observation
- 神经网络常用激活函数总结
- 密码字典生成工具—Crunch的使用
- 静态链表(简单介绍)
- 摄像头设计工程师面试技巧_系统设计面试准备的5个技巧
- cidr计算器android,JavaScript 实现 CIDR 详细信息计算
- 在上海创业的日子之注册公司的详细流程
- 技术小咖之基于SDK的第一个windows图形界面程序
- keycloak 的配置与ftl模板文件的表达式相互关联