Intrinsics函数Tips与踩坑
Intrinsics函数踩坑,感觉用Intrinsics函数,最重要的是不能想当然,只有想不到。。还是得参考官方文档来
一系列乘法MUL——_mm256_mul_epi32
这个乘法会把32位的两个整数扩展为64位再相乘,最后结果竟然存成64位!!如果要存为32位的数,应该用下面的函数_mm256_mullo_epi32
一系列set——_mm256_set_epi32
set函数的都是这样,参数顺序是反的。而且似乎性能巨差
看汇编可以发现,set是调用了多轮insertf指令,一点点构建向量。
整数load——_mm512_load_epi32
第一次做把int数组加载到zmm寄存器中的时候,想当然的用了_mm512_load_epi32这个函数,结果编译的时候报错,找不到对应的函数,才发现load一个int类型的数组要用这个函数_mm512_loadu_si512
一看到这个函数,我就发现自己格局小了,,反正是load连续512位的内存,何必区分位数呢。
进一步想,为什么浮点数类型就要区分精度了呢?推测是__mm512i和__mm512两个结构的区别。
loadu和load
区别很明显,load要求内存对齐,而loadu不要求,似乎是在汇编层面上做了什么操作?
内存地址对齐的方法:
1.利用struct,挺多博客讲的,不过似乎不同编译器对齐原则稍有差别(需要考证),附一篇写的很好的博客
2.#pragma pack预编译指令
3._mm_free与_mm_malloc
4.手动对齐,下面的代码通过先开辟空间再手动对齐的方式,完成了对pvbQueryProf、pvsQueryProf、pvH1、pvH2、pvE空间的分配
pSwData->pData = (unsigned char *) calloc (nCount, sizeof (__m256i));if (!pSwData->pData) {fprintf (stderr, "Unable to allocate memory for SW data buffers\n");exit (-1);}/* since we might port this to another platform, lets align the data *//* to 16 byte boundries ourselves */aligned = ((size_t) pSwData->pData + 15) & ~(0x0f);//对齐pSwData->pvbQueryProf = (__m256i *) aligned;pSwData->pvsQueryProf = pSwData->pvbQueryProf + lenQryByte * ALPHA_SIZE;pSwData->pvH1 = pSwData->pvsQueryProf + lenQryShort * ALPHA_SIZE;pSwData->pvH2 = pSwData->pvH1 + lenQryShort;pSwData->pvE = pSwData->pvH2 + lenQryShort;
shift
_mm128_slli_si128函数是将128位的xmm寄存器整体左移n个byte,而_mm256_slli_si256是将两个256位的ymm寄存器按128位为一个整体左移。
可以通过如下的形式实现了256位寄存器的整体左移与右移操作,其中A为源寄存器,N为移动的字节数:
左移:
_mm256_alignr_epi8(A, _mm256_permute2x128_si256(A, A, _MM_SHUFFLE(0, 0, 2, 0)), 16 - N)
右移:
_mm256_alignr_epi8(_mm256_permute2x128_si256(A, A, _MM_SHUFFLE(2, 0, 0, 1)), A, N)
不规则内存读写——gather和scatter
非常牛的两种CPU特性,gather和scatter,一个读一个写,具体看图
类型转换
最有用的是cvt系列的指令,比如_mm256_cvtepi16_epi32
还有extractf,可以用来提取向量中的一部分
一个了解向量化指令的方法
从一位学长那学来的,可以写一个方便自动向量化的简单循环,看一下这个循环的汇编即可
Intrinsics函数Tips与踩坑相关推荐
- 【pthread_cancel函数:避免踩坑】
文章目录 pthread_cancel()函数是什么? 1.pthread_cancel() 函数生效,代码演示: 2.pthread_cancel() 函数不生效,代码演示 总结 pthread_c ...
- mysql 使用sum limit_mysql踩坑记录之limit和sum函数混合使用问题
问题复盘 本次复盘会用一个很简单的订单表作为示例. 数据准备 订单表建表语句如下(这里偷懒了,使用了自增ID,实际开发中不建议使用自增ID作为订单ID) CREATE TABLE `order` ( ...
- Spark踩坑填坑-聚合函数-序列化异常
Spark踩坑填坑-聚合函数-序列化异常 一.Spark聚合函数特殊场景 二.spark sql group by 三.Spark Caused by: java.io.NotSerializable ...
- Vue踩坑之旅(一)—— 数组、对象的监听
作为一个接触 vue 才一个多月的小白,马上就接手基于 vue 的大型商城项目,其间真是跌跌撞撞踩了好多坑(o(╥﹏╥)o).在此写下自己的踩坑之旅,希望给跟我一样还在自学 vue 的同学一些帮助,另 ...
- mybatis学习与踩坑记录
mybatis resultmap高级映射 应用场景:如果sql查询的列名和pojo的属性名不一致,可以使用resultMap将列名和pojo的属性名作一个对应关系,就可以映射成功了.(如果返回值为i ...
- iOS 入门开发踩坑实录
其实人生也没有什么道理可讲,但是我们不必丧气,还是要期待,人生有奇遇. 前言 苹果开发者:iOS Developer 最近因为工作需要要开始搞iOS了,简单记录下我收集和学习的过程. 学习资料准备 组 ...
- 踩坑之 java微信wifi 配网airkiss
最近在负责微信WiFi连接硬件设备的需求 只想说 坑 坑 坑 配网过程中一直重复报两个错 1.config:fail,Error: 系统错误,错误码:40048,invalid url domain ...
- wangEditor的基本使用及踩坑记录
前言 最近写项目用到了富文本编辑器,在同事的建议下,采用了wangEditor3,在此记录下使用wangEditor3的基本步骤以及遇到的一些问题 基本使用 基本使用步骤原作者已讲的非常详细,如有需要 ...
- 【golang程序包推荐分享】分享亿点点golang json操作及myJsonMarshal程序包开发的踩坑经历 :)
目录[阅读时间:约5分钟] 一.概述 1.Json的作用 2.Go官方 encoding/json 包 3. golang json的主要操作 二.Json Marshal:将数据编码成json字符串 ...
最新文章
- 【linux】ARM开发板上设置RTC时间,断电重启后,设置失效的原因分析
- API接口自动化之2 处理http请求的返回体,对返回体做校验
- JSP页面元素的解析顺序
- 如何设计网站权限系统(转载)
- 怎样才能快速批量绑定MAC与IP地址
- 大数据谋定农业发展路径-丰收节贸易会:全球十大经典案例
- 大咖分享会 | 百度首次揭秘如何构建用户画像与移动统计
- linux安装minikube(Ubuntu/deepin)
- Uva572(DFS+联通集)
- 批量ping脚本shell_30个Linux Shell脚本经典案例(上)
- C语言 · 前10名
- 信息学奥赛一本通C++语言——1127:图像旋转
- mysql -数据库
- HCDA day1
- php与jpython-在python中复数怎么表示
- 自我复盘-20210820
- 360浏览器怎么导入html,360浏览器收藏夹导入/导出方法详解
- 【编程语言】Python 从菜鸟到高手
- [POI2005]DWU-Double-row(图论?)
- Linux系统下rar软件的安装以及如何解压文件
热门文章
- 粉丝福利!Matlab自动配色神器ColorForFans
- SQL*Loader-704: 内部错误: ulconnect: OCIServerAttach [0] SQL*Loader-704: Internal error ulconnect: OCI
- mac的系统语言怎么设置为中文
- windows编译 zlib
- HCIP-DATACOM H12-831(41-60)
- 以一元及二元函数为例,通过多项式的函数图像观察其拟合性能;以及对用多项式作目标函数进行机器学习时的一些理解。
- www.us258.com 这家主机商相当无耻,用着不到一个月给我停了,连用户名都删了。...
- 前端学习——17——获取窗口属性,dom尺寸,让滚动条滚动
- 推荐一些助你看透世界本质的书
- 怎么正确理解股票量化的概念?