Faiss(16):编译时添加对AVX512指令的支持
1. 说明
在对Faiss CPU profiling分析时对libfaiss.o进行反汇编发现该程序没有用到avx512指令进行优化,而该指令在进行浮点运算时相比其他指令集会有更好的效率和速度,故在此记录将AVX512指令集添加进程序的编译过程。
2. 编译OpenBLAS
openblas 是一个开源的矩阵计算库,包含了诸多的精度和形式的矩阵计算算法。就精度而言,包括float和double,两种数据类型的数据,其矩阵调用函数也是不一样。不同矩阵,其计算方式也是有所不同,(姑且认为向量也是一维矩阵),例如,向量与向量之间的计算,向量与矩阵之间的计算,矩阵与矩阵之间的计算。
Faiss在编译时就要用到这个库,所以在编译这个库时需要支持AVX512。
2.1 OpenBLAS判断CPU架构的规则
根据CPU架构的不同,OpenBLAS支持多种不同指令集,它判断当前CPU架构的步骤如下:
1. 验证GCC或clang版本
OpenBLAS支持使用GCC和clang两种编译器,对GCC的版本要求是大于gcc-6,clang的要求是大于clang-5。否则编译器不支持AVX512指令。
如getarch.c
#if (( defined(__GNUC__) && __GNUC__ > 6 && defined(__AVX2__)) || (defined(__clang__) && __clang_major__ >= 6))
#else
#define NO_AVX512
#endif
2. 读取CPU的vendor, family, exfamily, model, exmodel
通过上述信息可以判断出CPU属于哪一系列,如我使用的vendor=1, family=6, exfamily=0, model=5, exmodel=5。
cpuid_x86.c/get_cpuname()
family = get_cputype(GET_FAMILY);
exfamily = get_cputype(GET_EXFAMILY);
model = get_cputype(GET_MODEL);
exmodel = get_cputype(GET_EXMODEL);vendor = get_vendor();
3. 通过cpuid(7), xgetbv操作判断是否支持AVX512指令
cpuid_x86.c
int support_avx512(){#if !defined(NO_AVX) && !defined(NO_AVX512)int eax, ebx, ecx, edx;int ret=0;if (!support_avx()) return 0;cpuid(7, &eax, &ebx, &ecx, &edx);if((ebx & 32) != 32){ret=0; //OS does not even support AVX2}if((ebx & (1<<31)) != 0){xgetbv(0, &eax, &edx); if((eax & 0xe0) == 0xe0)ret=1; //OS supports AVX512VL}return ret;
#elsereturn 0;
#endif
}
2.2 重新编译OpenBLAS
由于我用的Ubuntu16.04 使用的GCC版本是5.4.0版本,所以OpenBLAS认为CPU不支持AVX512指令,编译出来的库文件为libopenblas_haswellp-r0.3.8.dev.so,如下图所示:
1. 重新安装编译器
# 安装gcc-7
sudo apt-get install gcc-7, g++-7# 安装gfortran-7
sudo apt-get install gfortran-7# 修改默认属性
cd /usr/bin
rm -f gcc, g++, gfortran
ln -s gcc-7 gcc
ln -s g++-7 g++
ln -s gfortran-7 gfortran
2. 重新编译OpenBLAS
make clean
make FC=gfortran
make install
操作完成后会将生成的库文件添加进/opt/OpenBLAS/lib目录中。如下图所示:
3. 重新编译Faiss
1. 修改编译参数
vim makefile.inc
CPUFLAGS = -mpopcnt -msse4
# 修改为
CPUFLAGS = -mpopcnt -msse4 -mavx512f -mavx512cd
2. 重新编译
make clean
make -j32
make install
3. 反汇编验证
objdump -S libfaiss.o > objdump_libfaiss.txt
返汇编代码可以看到包含诸如vmovss等AVX512指令:
Faiss(16):编译时添加对AVX512指令的支持相关推荐
- 在linux下面使用Jsoncpp,在编译时添加了头文件搜索路径-Ixxxx/json ,导致很多错误,如下: In file included from /usr/include/x86_64-li
在linux下面使用Jsoncpp,在编译时添加了头文件搜索路径-Ixxxx/json ,导致很多错误,如下: In file included from /usr/include/x86_64-li ...
- ffmpeg编译时添加freetype支持,用于在视频中添加文字
现在对ffmpeg的学习到了往视频指定位置添加对应文字的时候了. 发现添加文字,用的是drawtext滤镜,需要在编译ffmpeg的时候,添加–enable-libfreetype. 为此先编译fre ...
- 关于 QWidget+Qml程序打包到ubuntu时,程序与系统库版本不同,编译时添加并依赖自带库 的方法
需求 更新了Qt版本到5.9.3之后,部署到ubuntu16.04上无法正常运行,需要使其正常运行(注意:此时不能将库直接添加至系统路径,因为ubuntun16.04依赖本身低版本的qt库,可能会产生 ...
- Ubuntu 编译时出现错误cc1: error: ‘-fcf-protection’ is not compatible with this target
ubuntu 20.04编译时报cc1: error: '-fcf-protection' is not compatible with this target错误, 原因: 由于ubuntu将-fc ...
- 【Groovy】Groovy 语言特点简介 ( 支持 Java 语法 | 支持 Java 虚拟机 | Groovy 语言是动态语言 | Groovy 扩展 JDK | 编译时元编程 )
文章目录 一.Groovy 支持 Java 语法 二.Groovy 支持 Java 虚拟机 三.Groovy 语言是 动态语言 四.Groovy 扩展 JDK 五.Groovy 编译时元编程 一.Gr ...
- 解决AndroidStudio添加ProjectLibary后在编译时遇到的各种问题之解决方式索引(finished with non-zero exit value and so on...)
解决AndroidStudio添加ProjectLibary后在编译时遇到的各种问题之解决方式索引(finished with non-zero exit value and so on...) 因为 ...
- codeblocks和vscode编译时弹出不支持的16位程序解决方案
codeblocks和vscode编译时弹出不支持的16位程序解决方案 参考文章: (1)codeblocks和vscode编译时弹出不支持的16位程序解决方案 (2)https://www.cnbl ...
- 如何在编译内核时添加缺少的固件(以intel wireless 5100 AGN的 iwlwifi 为例)
不知大家在笔记本使用 Linux 时编译内核后无线wifi 能不能用,我的本本是"联想 Y450"一款足够老的本本,配的无线网卡是: $ lspci | grep Wireless ...
- QT编译时出现:error: cannot open C:\Users\XXX\AppData\Local\Temp\main.obj.83852.16.jom for write
QT编译时出现:error: cannot open C:\Users\XXX\AppData\Local\Temp\main.obj.83852.16.jom for write 我们在初学QT时, ...
最新文章
- android 4.4 禁止下拉,Android开发中禁止下拉式的实现技巧
- jquery之hide()用法详解
- BeagleBone Black快速入门教程
- MySQL-03:数据表操作基本命令笔记
- bind简单转发实验
- 用java编写的一个迪杰斯特拉算法(单源最短路径算法,Dijkstra算法)。
- fis php,在node.js上安装fis后显示fis不是内部命令,安装fis的环境变量配置问题
- emacs(考场+平时)配置方案
- python可视化库matplotlib_Python数据可视化库-Matplotlib(一)
- string.Empty和null三者的区别
- python发明小故事简写_科学发明小故事10字以上
- 怎么做好论文查重,分享几个重查方法
- 机器学习(MACHINE LEARNING)MATLAB实现层次分析法案例【AHP】
- 洛谷 P5713	【深基3.例5】洛谷团队系统 C语言
- 用Gitolite 构建 Git 服务器
- 【软件测试技术期末复习选择题】
- 图片报道:2008年12月4日夜晚,暴风雪突袭烟台(上)
- 脉冲宽度调制pdm_脉冲宽度调制(PWM)技术原理
- win10任务栏图标两个以上不显示缩略图且不显示桌面预览解决方案
- 火爆全网的ChatGPT上手体验,文尾免费送账号!
热门文章
- 解决Dmaven.multiModuleProjectDirectory system propery is not set. Check M2_HOME错误
- 冠状病毒的治疗方案汇总
- IntelliJ IDEA JDK配置
- 计算机二级试题aoa,计算机二级AOA理论题库
- C++实现的利用LR(1)分析表对赋值表达式进行语法制导翻译生成四元式及汇编代码
- 如何给客户进行价值塑造?说一万句话,不如讲一个故事
- vue.使用popstate监听点击浏览器自带返回按钮
- Windows--从dos下进入D盘,切换盘符
- 极米投影仪: U盘安装APP
- python求斐波那契数列第n项