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指令的支持相关推荐

  1. 在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 ...

  2. ffmpeg编译时添加freetype支持,用于在视频中添加文字

    现在对ffmpeg的学习到了往视频指定位置添加对应文字的时候了. 发现添加文字,用的是drawtext滤镜,需要在编译ffmpeg的时候,添加–enable-libfreetype. 为此先编译fre ...

  3. 关于 QWidget+Qml程序打包到ubuntu时,程序与系统库版本不同,编译时添加并依赖自带库 的方法

    需求 更新了Qt版本到5.9.3之后,部署到ubuntu16.04上无法正常运行,需要使其正常运行(注意:此时不能将库直接添加至系统路径,因为ubuntun16.04依赖本身低版本的qt库,可能会产生 ...

  4. 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 ...

  5. 【Groovy】Groovy 语言特点简介 ( 支持 Java 语法 | 支持 Java 虚拟机 | Groovy 语言是动态语言 | Groovy 扩展 JDK | 编译时元编程 )

    文章目录 一.Groovy 支持 Java 语法 二.Groovy 支持 Java 虚拟机 三.Groovy 语言是 动态语言 四.Groovy 扩展 JDK 五.Groovy 编译时元编程 一.Gr ...

  6. 解决AndroidStudio添加ProjectLibary后在编译时遇到的各种问题之解决方式索引(finished with non-zero exit value and so on...)

    解决AndroidStudio添加ProjectLibary后在编译时遇到的各种问题之解决方式索引(finished with non-zero exit value and so on...) 因为 ...

  7. codeblocks和vscode编译时弹出不支持的16位程序解决方案

    codeblocks和vscode编译时弹出不支持的16位程序解决方案 参考文章: (1)codeblocks和vscode编译时弹出不支持的16位程序解决方案 (2)https://www.cnbl ...

  8. 如何在编译内核时添加缺少的固件(以intel wireless 5100 AGN的 iwlwifi 为例)

    不知大家在笔记本使用 Linux 时编译内核后无线wifi 能不能用,我的本本是"联想 Y450"一款足够老的本本,配的无线网卡是: $ lspci | grep Wireless ...

  9. 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时, ...

最新文章

  1. android 4.4 禁止下拉,Android开发中禁止下拉式的实现技巧
  2. jquery之hide()用法详解
  3. BeagleBone Black快速入门教程
  4. MySQL-03:数据表操作基本命令笔记
  5. bind简单转发实验
  6. 用java编写的一个迪杰斯特拉算法(单源最短路径算法,Dijkstra算法)。
  7. fis php,在node.js上安装fis后显示fis不是内部命令,安装fis的环境变量配置问题
  8. emacs(考场+平时)配置方案
  9. python可视化库matplotlib_Python数据可视化库-Matplotlib(一)
  10. string.Empty和null三者的区别
  11. python发明小故事简写_科学发明小故事10字以上
  12. 怎么做好论文查重,分享几个重查方法
  13. 机器学习(MACHINE LEARNING)MATLAB实现层次分析法案例【AHP】
  14. 洛谷 P5713 【深基3.例5】洛谷团队系统 C语言
  15. 用Gitolite 构建 Git 服务器
  16. 【软件测试技术期末复习选择题】
  17. 图片报道:2008年12月4日夜晚,暴风雪突袭烟台(上)
  18. 脉冲宽度调制pdm_脉冲宽度调制(PWM)技术原理
  19. win10任务栏图标两个以上不显示缩略图且不显示桌面预览解决方案
  20. 火爆全网的ChatGPT上手体验,文尾免费送账号!

热门文章

  1. 解决Dmaven.multiModuleProjectDirectory system propery is not set. Check M2_HOME错误
  2. 冠状病毒的治疗方案汇总
  3. IntelliJ IDEA JDK配置
  4. 计算机二级试题aoa,计算机二级AOA理论题库
  5. C++实现的利用LR(1)分析表对赋值表达式进行语法制导翻译生成四元式及汇编代码
  6. 如何给客户进行价值塑造?说一万句话,不如讲一个故事
  7. vue.使用popstate监听点击浏览器自带返回按钮
  8. Windows--从dos下进入D盘,切换盘符
  9. 极米投影仪: U盘安装APP
  10. python求斐波那契数列第n项