事情是这样的:
目前在做自驾中系统优化方面的工作,系统优化可以通过几个层面去研究,进行,例如硬件层面,系统层面,算法层面,函数层面,编译层面,以及利用一些工具(perf,easy-profilter,gperf等)去优化整个软件工程,所以静下心来想先从编译入手,所以基本就是gcc了。
看了gcc的官文,这也太多了,这里感谢@mmt的姚楠老哥(chargpt和copilot都能用,🐂)协助和官方文档,对每个字段都做了初步的解释和使用场景,这里先把x86的option给全面解读一下,后面在完成其他options
【x86 Options】
-mtune=cpu-type :这个选项指定了编译器生成的代码的性能优化目标。它告诉编译器,要优化代码以在特定的CPU类型上运行得更好。"cpu-type"可以是一个特定的处理器型号或处理器族的名称,如"-mtune=i686"或"-mtune=core2"。
-march=cpu-type:这个选项指定了编译器生成的代码的目标架构。它告诉编译器,生成适合某个CPU架构的代码。"cpu-type"的取值与"-mtune"类似,但是"-march"选项通常比"-mtune"更加严格,并且包含了更多的CPU指令。 -mtune-ctrl=feature-list :这个选项告诉编译器,应该启用哪些CPU特性来优化代码生成。"feature-list"是一个以逗号分隔的列表,其中每个特性都表示一个特定的CPU指令集或功能。
-mdump-tune-features :这个选项使编译器在编译过程中输出目标CPU的特性列表。
-mno-default :这个选项告诉编译器,不要将某些选项设置为默认值。 -mfpmath=unit : 这个选项指定了浮点运算所使用的数学库。"unit"可以是"387"(表示使用x87浮点单元)或"sse"(表示使用SSE单元)。 -masm=dialect : 这个选项指定了汇编语言的语法和规则。"dialect"可以是"att"(表示AT&T语法)或"intel"(表示Intel语法)。
-mno-fancy-math-387 : 这个选项告诉编译器不使用x87浮点单元的高级数学函数。 -mno-fp-ret-in-387 :这个选项告诉编译器,函数返回值不应该通过x87浮点单元。
-m80387 : 这个选项告诉编译器,生成的代码要求至少有一个x87浮点单元。
-mhard-float : 这个选项告诉编译器,函数调用时要使用硬件浮点寄存器来传递浮点参数。
-msoft-float : 这个选项告诉编译器,函数调用时要使用软件模拟的方式来传递浮点参数。 -mno-wide-multiply :这个选项告诉编译器,不使用32位乘法指令。选项用于控制是否启用宽乘法(wide multiplication)。在某些处理器上,宽乘法允许一次性执行多个操作数的乘法,从而提高运算速度。但在另一些处理器上,使用宽乘法可能会导致代码大小增加,执行速度变慢。如果你的目标处理器上不支持宽乘法或者你希望最小化代码大小,则可以使用-mno-wide-multiply
禁用它。默认情况下,GCC会根据目标处理器类型自动选择是否使用宽乘法。
-mrtd : 这个选项告诉编译器,生成的代码应该使用微软的__cdecl调用约定。
-malign-double : 这个选项告诉编译器,double类型的数据应该按照8字节对齐。 -mpreferred-stack-boundary=num :这个选项告诉编译器,栈指针应该按照"num"字 -mincoming-stack-boundary=num :设置最小的栈边界对齐字节数,用于调整栈的大小和对齐方式。默认值是 2。 -mcld :指定是否启用 Cld
指令。
-mcx16 :指定是否启用 16 字节通用寄存器 XMM16-XMM31
。
-msahf :指定是否启用 SAHF
和 LAHF
指令。
-mmovbe :指定是否启用 MOVBE
指令。
-mcrc32 :指定是否启用 CRC32
指令。
-mmwait :指定是否启用 MWAIT
指令。 -mrecip :指定是否启用浮点数求倒数指令,可选项为 yes
或 no
,默认是 no
。
-mrecip=opt :指定浮点数求倒数指令的优化级别,可选项为 none
、fast
和 accurate
。 -mvzeroupper :指定是否启用 VZEROUPPER
指令。
-mprefer-avx128 :指定是否偏好 128 位 AVX 寄存器。
-mprefer-vector-width=opt :指定偏好的向量宽度,可选项为 128
、256
和 512
。 -mmove-max=bits :指定最大移动数据宽度,单位为比特。默认值为 128。
-mstore-max=bits:指定最大存储数据宽度,单位为比特。默认值为 128。
-mmmx
: 指定是否启用 MMX
指令集。
-msse
: 指定是否启用 SSE
指令集。
-msse2
: 指定是否启用 SSE2
指令集。
-msse3
: 指定是否启用 SSE3
指令集。
-mssse3
: 指定是否启用 SSSE3
指令集。
-msse4.1
: 指定是否启用 SSE4.1
指令集。
-msse4.2
: 指定是否启用 SSE4.2
指令集。
-msse4
: 指定是否启用 SSE4
指令集。
-mavx
: 指定是否启用 AVX
指令集。
-mavx2
: 指定是否启用 AVX2
指令集。
-mavx512f
: 指定是否启用 AVX-512F
指令集。
-mavx512pf
: 指定是否启用 AVX-512PF
指令集。
-mavx512er
: 启用AVX512-ER指令集,这是Intel CPU的一种指令集,用于扩展向量指令集以支持高性能计算。
-mavx512cd
: 启用AVX512-CD指令集,用于向量压缩和扩展。
-mavx512vl
: 启用AVX512-VL指令集,用于支持扩展向量长度,从而在向量运算中增加通用寄存器的可用性。
-mavx512bw
: 启用AVX512-BW指令集,用于扩展向量指令集,支持8位和16位数据类型的运算。
-mavx512dq
: 启用AVX512-DQ指令集,用于扩展向量指令集,支持32位和64位数据类型的运算。
-mavx512ifma
: 启用AVX512-IFMA指令集,用于实现整数乘法累加操作的加速,主要用于密码学运算。
-mavx512vbmi
: 启用AVX512-VBMI指令集,用于支持向量字节操作,例如在加密和压缩算法中的位移、比较和掩码操作。
-msha
: 启用SHA扩展指令集,用于支持SHA-1和SHA-256哈希算法。
-maes
: 启用AES指令集,用于支持高级加密标准(Advanced Encryption Standard)。
-mpclmul
: 启用PCLMUL指令集,用于支持多项式乘法指令,主要用于密码学算法。
-mfsgsbase
: 启用FSGSBASE指令集,用于支持对FS/GS段基址的直接操作,以实现快速上下文切换。
-mrdrnd
: 启用RDRAND指令集,用于产生随机数。
-mf16c
: 启用16位浮点指令集,用于优化16位浮点运算。
-mfma
: 启用FMA指令集,用于支持浮点数乘加操作。
-mpconfig
: 启用CONFIG TDP MMX指令集,用于优化功率控制机制。
-mwbnoinvd
: 启用WBNOINVD指令集,用于禁止缓存刷新操作。
-mptwrite
: 启用PTWRITE指令集,用于在写入分页表项时产生跟踪数据。
-mprefetchwt1
: 启用PREFETCHWT1指令集,用于提前加载数据到CPU缓存。
-mclflushopt
: 启用CLFLUSHOPT指令集,用于加速缓存刷新操作。
-mclwb
: 启用clwb
指令,用于将缓存行写入内存。默认情况下关闭。
-mxsavec
: 启用xsavec
指令,用于以紧凑的格式保存上下文。默认情况下关闭。
-mxsaves
: 启用xsaves
指令,用于保存扩展状态。默认情况下关闭。
-msse4a
: 启用SSE4a指令集,包含用于加速特定应用程序的指令。默认情况下关闭。
-m3dnow
, -m3dnowa
: 启用3DNow!指令集,包含用于加速浮点计算的指令。默认情况下关闭。
-mpopcnt
: 启用popcnt
指令,用于计算二进制位的数量。默认情况下开启。
-mabm
: 启用ABM指令集,用于加速位操作。默认情况下关闭。
-mbmi
: 启用BMI指令集,包含用于加速位操作的指令。默认情况下开启。
-mtbm
: 启用TBM指令集,包含用于加速位操作的指令。默认情况下关闭。
-mfma4
: 启用FMA4指令集,包含用于加速浮点计算的指令。默认情况下关闭。
-mxop
: 启用XOP指令集,包含用于加速位操作和浮点计算的指令。默认情况下关闭。
-madx
: 启用ADX指令集,包含用于加速某些算法的指令。默认情况下关闭。
-mlzcnt
: 启用LZCNT指令,用于计算二进制数中前导零的数量。默认情况下开启。
-mbmi2
: 启用BMI2指令集,包含用于加速位操作的指令。默认情况下开启。
-mfxsr
: 启用FXSAVE和FXRSTOR指令,用于保存和恢复浮点寄存器的状态。默认情况下开启。
-mxsave
: 启用XSAVE指令,用于将扩展状态保存到内存中。默认情况下开启。
-mxsaveopt
: 启用XSAVEOPT指令,用于以更有效的方式保存扩展状态。默认情况下开启。
-mrtm
: 启用RTM指令,用于实现事务内存。默认情况下关闭。
-mhle
: 启用HLE指令,用于在不使用事务内存的情况下实现原子操作。默认情况下关闭。
-mlwp: 启用LWP指令,用于加速线程调度。默认情况下关闭。
-mmwaitx:启用了此选项后,CPU 的 mwaitx 指令将变为可用状态。mwaitx 可以通过让 CPU 进入深度睡眠状态来优化性能,这在一些需要处理大量等待时间的应用程序中可能会有所帮助。
-mclzero:启用了此选项后,CPU 将支持 clzero 指令。clzero 指令用于将指定内存位置清零,可用于在一些高性能计算场景中加速内存分配和释放操作。
-mpku:启用了此选项后,CPU 的 pkru 寄存器将变为可用状态。pkru 寄存器用于保护内存页的访问权限,可用于加强内存访问安全。
-mthreads:启用了此选项后,编译器将生成多线程代码以充分利用多核 CPU 的性能。默认情况下,此选项处于关闭状态。
-mgfni:启用了此选项后,CPU 将支持 GFM 指令集扩展。GFM 指令集扩展包含一组用于加速有限域数学运算的指令,可用于加速一些密码学算法等应用。
-mvaes:启用了此选项后,CPU 将支持 VAES 指令集扩展。VAES 指令集扩展包含一组用于加速 AES 加密算法的指令,可用于加速一些加密应用。
-mwaitpkg:启用了此选项后,CPU 的 waitpkg 指令将变为可用状态。waitpkg 可以通过在等待时降低 CPU 的功耗来节省能源。
-mshstk:启用此选项后,CPU 将支持 shstk 指令。shstk 指令可以在用户模式下将当前的栈指针保存在一个特殊的堆栈中,可用于一些安全应用。
-mmanual-endbr:启用此选项后,编译器将使用 ENDBR 指令代替 RET 指令,以提高程序的安全性。ENDBR 指令可用于防止 ROP 攻击。
-mcet-switch:启用了此选项后,CPU 的 CET (Control-flow Enforcement Technology)将变为可用状态。CET 可以提供一些控制流程完整性的保护,以减少攻击的成功率。
-mforce-indirect-call:启用了此选项后,编译器将强制使用间接调用而不是直接调用函数。这可用于提高程序的安全性,因为间接调用可以使攻击者更难以进行 ROP 攻击。
-mavx512vbmi2
: 启用AVX-512向量字节操作2指令集,用于处理向量字节操作。
-mavx512bf16
: 启用AVX-512 BF16指令集,用于执行16位浮点数运算,可以加速深度学习等应用。
-menqcmd
: 启用AVX-512 Enqueue Command指令集,用于加速异步处理。
-mvpclmulqdq
: 启用PCLMULQDQ指令集,用于加速GCM模式的AES加密。
-mavx512bitalg
: 启用AVX-512位算法指令集,用于处理哈希、CRC等算法。
-mmovdiri
: 启用MOVDIRI指令,用于内存传输。
-mmovdir64b
: 启用MOVDIR64B指令,用于64字节内存传输。
-mavx512vpopcntdq
: 启用AVX-512向量POPCOUNT指令集,用于快速计算向量中的1的数量。
-mavx5124fmaps
: 启用AVX-512 4元素浮点数指令集,可以加速一些科学计算和矩阵计算等应用。
-mavx512vnni
: 启用AVX-512向量神经网络指令集,用于加速神经网络计算。
-mavx5124vnniw
: 启用AVX-512 4元素向量整数指令集,用于向量整数运算。
-mprfchw
: 启用PRFCHW指令,用于提高内存带宽。
-mrdpid
: 启用RDPID指令,用于获取处理器ID信息。
-mrdseed
: 启用RDSEED指令,用于生成随机数。
-msgx
: 启用SGX指令,用于加密和隔离。
-mavx512vp2intersect
: 启用AVX-512向量二元交指令集,用于向量操作。
-mserialize
: 启用对 C++ 对象的序列化支持。默认情况下关闭。
-mtsxldtrk
: 启用TSXLDTRK指令,用于硬件事务内存。
-mamx-tile
: 启用AMX Tile指令集,用于深度神经网络卷积操作。
-mamx-int8
: 启用AMX INT8指令集,用于整数向量运算。
-mamx-bf16
: 启用AMX BF16指令集,用于浮点数向量运算。
-muintr
: 启用UINTR指令集,用于处理信号。
-mhreset
: 启用HRESET指令,用于重置特权状态。这些选项通常用于优化特定类型的应用程序,因此默认情况下关闭。启用它们可能会增加应用程序的性能,但也可能会增加代码的复杂性和编译时间,因此需要谨慎使用。
-mavxvnni
: 启用AVX-512神经网络指令,可以加速深度学习任务。默认情况下是关闭的。
-mavx512fp16
: 启用AVX-512半精度浮点指令,可以加速浮点运算。默认情况下是关闭的。
-mavxifma
: 启用AVX指令集下的整数乘法和累加指令。默认情况下是关闭的。
-mavxvnniint8
: 启用AVX-512指令集下的整数8位量化指令,可以加速深度学习任务。默认情况下是关闭的。
-mavxneconvert
: 启用AVX指令集下的浮点转换指令,可以加速某些浮点运算。默认情况下是关闭的。
-mcmpccxadd
: 启用AVX-512指令集下的循环同步指令,可用于一些多线程应用。默认情况下是关闭的。
-mamx-fp16
: 启用AMX指令集下的半精度浮点指令,可以加速浮点运算。默认情况下是关闭的。
-mprefetchi
: 启用指令级预取指令,可以在数据到达处理器之前预取数据,以提高性能。默认情况下是关闭的。
-mraoint
: 启用返回其他堆栈指针的指令,可用于一些安全相关应用。默认情况下是关闭的。
-mamx-complex
: 启用AMX指令集下的复数指令,可用于复数运算。默认情况下是关闭的。
-mcldemote
: 启用缓存降级指令,可以将缓存中的数据移动到较慢的存储器级别中,以减少对缓存的竞争。默认情况下是关闭的。
-mms-bitfields
: 启用Microsoft指定的位字段布局规则,可以更有效地使用内存。默认情况下是关闭的。
-mno-align-stringops
: 禁用字符串操作的内存对齐,可以提高性能。默认情况下是关闭的。
-minline-all-stringops
: 内联所有字符串操作,可以提高性能。默认情况下是关闭的。
-minline-stringops-dynamically
: 根据指令计数动态内联字符串操作,可以提高性能。默认情况下是关闭的。
-
-mstringop-strategy=alg
: 指定字符串操作函数的策略,例如strcpy
和memcpy
。默认情况下,它将使用基于循环的实现策略。该选项可以改为使用一些基于算法的实现策略。 -
-mkl
: 使用Intel Math Kernel Library(MKL)的优化代码。 -
-mwidekl
: 启用MKL的宽向量优化。 -
-mmemcpy-strategy=strategy
: 指定memcpy()
函数的实现策略。策略的可选值为rep
(使用REP MOVSB指令)或mov
(使用MOVNTDQA指令)。默认策略因体系结构而异。 -
-mmemset-strategy=strategy
: 指定memset()
函数的实现策略。策略的可选值为rep
(使用REP STOSB指令)或mov
(使用PREFETCHW和MOV指令)。默认策略因体系结构而异。 -
-mpush-args
: 函数调用时使用栈来传递函数参数。 -
-maccumulate-outgoing-args
: 将函数调用的前几个参数存储在寄存器中,而不是在堆栈中传递。这样可以提高函数调用的性能。 -
-m128bit-long-double
: 启用128位长双精度类型。 -
-m96bit-long-double
: 启用96位长双精度类型。 -
-mlong-double-64
: 启用64位长双精度类型。 -
-mlong-double-80
: 启用80位长双精度类型。 -
-mlong-double-128
: 启用128位长双精度类型。 -
-mregparm=num
: 设置函数调用时用于传递函数参数的寄存器数量。默认值为3。 -
-msseregparm
: 函数调用时使用SSE寄存器来传递函数参数。这样可以提高函数调用的性能。 -
-mveclibabi=type
: 指定使用的向量库类型,type可以是auto、svml、或者none,默认为auto。 -
-mvect8-ret-in-mem
: 将8字节或更小的向量类型从寄存器中返回时,将返回值存储在内存中。 -
-mpc32
: 生成32位模式的代码。 -
-mpc64
: 生成64位模式的代码。 -
-mpc80
: 生成80位模式的代码。 -
-mdaz-ftz
: 在数学异常(如除以零或无穷大的算术运算)中执行默认动作,通常是生成NaN结果。当该选项开启时,动作被忽略并产生0结果。 -
-mstackrealign
: 在调用函数之前重新对齐栈指针,以便它与已经对齐的内存区域对齐。 -
-momit-leaf-frame-pointer
: 在不需要栈帧指针的叶子函数中省略栈帧指针。 -
-mno-red-zone
: 禁用红区,即禁止使用位于栈底下方128字节的内存区域。 -
-mno-tls-direct-seg-refs
: 禁用TLS直接寻址。 -
-mcmodel=code-model
: 选择目标代码模型,code-model可以是small、kernel、medium、large、或者默认的small。 -
-mabi=name
: 选择ABI(应用程序二进制接口),name可以是ilp32、ilp32f、lp64、lp64f、或者默认的gnu。 -
-maddress-mode=mode
: 设置寻址模式,mode可以是short、near、或者默认的long。 -
-m32
: 生成32位模式的代码。 -
-m64
: 生成64位模式的代码。 -
-mx32
: 生成32位模式的x86-64代码。 -
-m16
: 生成16位模式的代码。 -
-miamcu
: 生成针对嵌入式MCU的代码。 -
-mlarge-data-threshold=num
: 设置在将数据存储到RODATA中之前,必须达到的最小数据大小(以字节为单位),默认为65535。
-msse2avx
: 在SSE和AVX指令集之间自动转换。默认值为开启。
-mfentry
: 生成一个函数入口,用于跟踪进入函数的次数。默认值为关闭。
-mrecord-mcount
: 生成一个mcount符号,可以用于跟踪调用函数的次数。默认值为关闭。
-mnop-mcount
: 不生成mcount符号。默认值为关闭。
-m8bit-idiv
: 使用8位除法指令来优化除法操作。默认值为关闭。
-minstrument-return=type
: 插入指令来记录函数返回的地址,用于分析。type参数可以是以下值之一:jr
(使用JR指令),jmp
(使用JMP指令),or32
(使用OR指令),call
(使用CALL指令)。默认值为关闭。
-mfentry-name=name
: 使用给定的名称作为mfentry符号的名称。默认为“__cyg_profile_func_enter”。
-mfentry-section=name
: 使用给定的名称作为mfentry符号所在的节的名称。默认为“.text”。
-mavx256-split-unaligned-load
: 启用将不对齐的32位或64位内存读取分解为两个内存操作以利用AVX 256位执行单元。默认值为关闭。
-mavx256-split-unaligned-store
: 启用将不对齐的32位或64位内存存储拆分为两个内存操作以利用AVX 256位执行单元。默认值为关闭。
-malign-data=type
: 设置在内存中对齐数据的方式。type参数可以是以下值之一:function
(按函数对齐数据),common
(按大小对齐数据),string
(按字符串对齐数据),minimum
(按最小对齐数据),maximum
(按最大对齐数据)。默认值为“function”。
-mstack-protector-guard=guard
: 启用堆栈保护器,并使用给定的保护器值。guard参数可以是以下值之一:global
(使用全局保护器),tls
(使用TLS保护器),check
(在运行时检查保护器)。默认值为“check”。
-mstack-protector-guard-reg=reg
: 使用给定的寄存器作为堆栈保护器。默认为“ebx”。
-mstack-protector-guard-offset=offset
: 设置堆栈保护器的偏移量。默认为“0”。
-mstack-protector-guard-symbol=symbol
: 使用给定的符号作为堆栈保护器。默认为“__guard”。
-mgeneral-regs-only
: 仅使用通用寄存器,不使用浮点寄存器。默认为关闭。
-
mcall-ms2sysv-xlogues:在函数调用时使用 Microsoft x64 系统 V 调用规则。默认情况下,GNU 编译器使用 GCC 调用规则。
-
mrelax-cmpxchg-loop:启用松弛循环中的 cmpxchg 指令,以允许更多的指令并行执行。
-
mindirect-branch=choice:指定间接分支跳转的实现方式,choice 可选值为 thunk、jmp、call。
-
mfunction-return=choice:指定函数返回时使用的指令,choice 可选值为 thunks、plain、jumps。
-
mindirect-branch-register:允许在间接分支中使用寄存器作为跳转地址。
-
mharden-sls=choice:启用 Intel 的“软件控制流保护”功能,可选值为 auto、on、off。
-
mindirect-branch-cs-prefix:在每个间接分支前插入 CS 前缀指令。
-
mneeded:标记未使用的静态函数和数据。
-
mno-direct-extern-access:禁止直接访问外部符号。
-
munroll-only-small-loops:仅展开小循环。
-
mlam=choice:启用针对 LAM 程序设计的优化,可选值为 on、off。默认情况下该选项处于关闭状态。