gcc编译选项说明(1) 您所在的位置:网站首页 sha指令集做什么 gcc编译选项说明(1)

gcc编译选项说明(1)

2023-09-25 11:15| 来源: 网络整理| 查看: 265

事情是这样的:

目前在做自驾中系统优化方面的工作,系统优化可以通过几个层面去研究,进行,例如硬件层面,系统层面,算法层面,函数层面,编译层面,以及利用一些工具(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。默认情况下该选项处于关闭状态。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有