1.指令集相关的几个编译选项
-march=
cpu-type
指导生成符合指定体系结构CPU的指令,对于x86家族的CPU来说,主要是涉及部分SIMD指令的使用。
比如:
‘core2’:Intel Core 2 CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3 and SSSE3 instruction set support.
‘broadwell’:Intel Broadwell CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX and PREFETCHW instruction set support.
‘skylake’:Intel Skylake CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC and XSAVES instruction set support.
-mtune=
cpu-type
在不改变ABI和支持指令集同时,对生成的指令优化调整。-mcpu=cpu-type与该选项相同,已经废弃。
在性能优化时,上述两个选项是比较常用的两个优化指令的方法;而在一些使用场景中,在考虑到指令兼容性时,也常常使用到这两个编译选项。
当用户提供的二进制需要在不同的CPU体系结构上运行时,考虑到性能、兼容性,常常打开、关闭具体的某种指令集优化,比如SSE4.2、AVX、BMI2等,可以通过“-m-
xxx
”、“-mno-
xxx
”使能、去使能相应的指令集:
-mmmx -msse -msse2 -msse3 -mssse3 -msse4 -msse4a -msse4.1 -msse4.2 -mavx -mavx2 -mavx512f -mavx512pf -mavx512er -mavx512cd -mavx512vl -mavx512bw -mavx512dq -mavx512ifma -mavx512vbmi -msha -maes -mpclmul -mclfushopt -mfsgsbase -mrdrnd -mf16c -mfma -mfma4 -mprefetchwt1 -mxop -mlwp -m3dnow -m3dnowa -mpopcnt -mabm -mbmi -mbmi2 -mlzcnt -mfxsr -mxsave -mxsaveopt -mxsavec -mxsaves -mrtm -mtbm -mmpx -mmwaitx -mclzero -mpku
另外还有一些指令集相关的选项,可以通过”
gcc –target-help
“命令在环境上查看。
详细可以参考gcc手册:
https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/x86-Options.html#x86-Options
可以通过命令
gcc -march=native -c -Q –help=target
或“gcc -### -march=native /usr/include/stdlib.h”查看当前使能了哪些目标机相关的编译选项,比如:
qq@qq:~$ gcc -march=native -c -Q --help=target
The following options are target specific:
-m128bit-long-double [disabled]
-m16 [disabled]
-m32 [disabled]
-m3dnow [disabled]
-m3dnowa [disabled]
-m64 [enabled]
-m80387 [enabled]
-m8bit-idiv [disabled]
-m96bit-long-double [enabled]
-mabi= sysv
-mabm [enabled]
-maccumulate-outgoing-args [disabled]
-maddress-mode= short
-madx [enabled]
-maes [enabled]
-malign-data= compat
-malign-double [disabled]
-malign-functions= 0
-malign-jumps= 0
-malign-loops= 0
-malign-stringops [enabled]
-mandroid [disabled]
-march= broadwell
-masm= att
-mavx [enabled]
-mavx2 [enabled]
-mavx256-split-unaligned-load [disabled]
... ...
指定march为native时,gcc会根据本地环境上的cpu类型选择对应的体系架构,而且相应的支持的指令集打开;
而在指定了具体的arch之后,具体支持的SSE、AVX等之类的仍显示为[disable],并不是说不会使用这些指令,而是arch指定的cpu体系结构一致说明支持了,也就是不单独指定,也已经支持使用了。
2.查看使用的CPU体系架构
在指定CPU体系架构时,在编译阶段会生成支持指令集的汇编代码,对性能会有一定的提升;而在未指定具体架构,或者指定为“native”时,可以通过下面的命令查看具体的体系结构信息:
qq@qq:~$ gcc -c -Q --help=target | grep march
-march= x86-64
qq@qq:~$ gcc -march=native -c -Q --help=target | grep march
-march= broadwell
qq@qq:~$ gcc -march=corei7 -c -Q --help=target | grep march
-march= corei7
qq@qq:~$
3.查看gcc定义的相关宏
查看gcc定义的指令集相关的宏,确定当前cpu体系架构支持哪些扩展指令集,可以通过
gcc -march=x86-64 -dM -E - < /dev/null
命令查看:
qq@qq:~$ gcc -march=x86-64 -dM -E - < /dev/null | grep -i SSE
#define __SSE2_MATH__ 1
#define __SSE_MATH__ 1
#define __SSE2__ 1
#define __SSE__ 1
qq@qq:~$ gcc -march=native -dM -E - < /dev/null | grep -i SSE
#define __SSE4_1__ 1
#define __SSE4_2__ 1
#define __SSE2_MATH__ 1
#define __SSE_MATH__ 1
#define __SSE2__ 1
#define __SSSE3__ 1
#define __SSE__ 1
#define __SSE3__ 1
qq@qq:~$
性能优化时,选择匹配的CPU体系结构优化代码,使用增强指令;应用程序、lib库等二进制发布时,出于对运行环境中CPU体系结构的兼容性考虑等,一般均都会用到上述的一些编译选项。
编译时使用的指令集本文主要说明在预编译阶段,gcc根据用户指定的参数或者默认参数,而选择定义的一些宏。编译时使用的指令集1.指令集相关的几个编译选项2.查看使用的CPU体系架构3.查看gcc定义的相关宏1.指令集相关的几个编译选项-march=cpu-type指导生成符合指定体系结构CPU的指令,对于x86家族的CPU来说,主要是涉及部分SIMD指令的...
cpu支持的
指令集
不同的CPU就和一个干活的员工一样,能力有强有弱。能力的强弱除了处理速度意外,支持的
指令集
数量也是关键点。
我们在linux系统上可以用lscpu命令或者cat /proc/cpuinfo来
查看
cpu可支持的
指令集
:
[root@localhost ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s):
$ ./cParser <some> -i <instruction> -o <assembly>
注意:
指令集
标志尚未实现。目前仅生成x86程序集。
要链接生成的程序集文件并创建有效的可执行文件,请
使用
gcc
或clang:
$
gcc
assembly.s -o out
通过第1阶段和
第一/二期数据勘误,以及 Berkeley 缩减静态 codesize TR 解读
在本期数据报中,我们将对 RISCV
指令集
上
GCC
和 LLVM-Clang
编译
器
(以下简称 Clang)的 codesize 对比,以及 RISCV
指令集
和 ARM
指令集
在
GCC
编译
器上的 codesize 对比,
使用
更加严谨的优化
编译
选项进行再次报
告,并将结合 ARM 官方公开的 ARM Compiler 优化数据来分析 RISCV 的潜
在优化空间。本期报告还将解读来自 Berkeley CS 系的技术报告《Reduce
Static Code Size and Improve RISC
linux系统下
编译
出错Error: suffix or operands invalid for `vbroadcastss'解决办法报错场景解决办法参考文献
linux系统下
编译
出错Error: suffix or operands invalid for `vbroadcastss’解决办法
在运行kaggle-2014-criteo-master 开源程序
时
,由于需
编译
运行gbdt,li...
arm64的板,
编译
g2o库,报错;
找到了Github上类似的问题GitHub相关问题描述链接
通过git checkout 4b9c2f5b68d14ad479457b18c5a2a0bce1541a90命令同步解决方案。我这边是直接修改Cmakelist.txt文件。
修改的内容github 变更详情
找到以下内容
IF(NOT "${ARCH}" MATCHES "arm")
# Generic settings for optimisation
SET(CMAKE_CXX_FL
文章目录一、可执行程序是如何被组装的?二、用
gcc
生成静态库和动态库1.编辑生成例子程序 hello.h、hello.c 和 main.c2.将hello.c
编译
成.o文件3.由.o 文件创建静态库4.在程序中
使用
静态库三、静态库.a与.so库文件的生成与
使用
1.引入库2.读入数据三.总结
一、可执行程序是如何被组装的?
1.编辑:也就是编写C/C++程序。
2.预处理:相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件
编译
指令,没有特殊符号的输出文件,这个文件的含义.
介绍AVX
AVX就是Intel提供的支持向量并行计算的C语言的一个库,所有的东西都在<immintrin.h>中.这个库跟正常的C标准库差不多.需要注意的是在
编译
AVX的
时
候一定要加
编译
参数-mavx和-mavx2.一般来说用到AVX的
时
候还会用到AVX的祖先SSE因此SSE的
编译
参数也要加上.用
gcc
编译
的指令如下
gcc
filename.c -mavx -mavx2 -mf...
"
gcc
-c" 和 "
gcc
-o" 是两个在
编译
C 程序
时
常用的命令。
"
gcc
-c" 用于
编译
C 源代码文件,但不进行链接,它会生成一个中间文件(通常是 .o 或 .obj 文件)。例如:
gcc
-c main.c
"
gcc
-o" 用于将多个中间文件(通常是多个 .o 文件)链接起来,生成可执行文件。例如:
gcc
-o main main.o other.o
所以,通常情况下,
编译
一个 C 程序的完整命令如下:
gcc
-c main.c
gcc
-o main main.o other.o
第一行命令
编译
main.c 文件,生成 main.o 中间文件;第二行命令则将 main.o 和 other.o 链接起来,生成可执行文件 main。