Intel oneAPI C/C++ Fortran编译器

简介

Intel oneAPI 版C/C++ Fortran编译器,是主要针对Inetl平台的高性能编译器,可用于开发复杂且要进行大量计算的C/C++、Fortran程序。

注意

Intel从2019年年底开始重点推出oneAPI新编程模型架构,如使用旧编译器架构Intel Parallel Studio XE Cluster版(已被称为Class版),请直接看 Intel Parallel Studio XE Cluster C/C++ Fortran编译器 部分。

备注

本文档基于2025.2版本。

系统当前安装目录为 /opt/intel/oneapi/ 。用户可以采用 module 命令来设置所需的环境,请参看 [设置编译及运行环境]

编译器选项通用规则

  • 编译器选项可能区分大小写,且大小写不同可能导致含义相异。例如,选项 -c 禁止链接,而选项 -C 在运行时检查特定条件。
  • 命令行中指定的选项适用于命令行中列出的所有文件。
  • 选项可接受文件名、字符串、字母或数字形式的参数。若字符串包含空格,必须使用引号括起。
  • 编译器选项的排列顺序不限。
  • 除非指定特定选项,否则命令行将同时编译和链接所指定的文件。
  • 部分选项名称可缩写,只需输入足以唯一标识该选项的字符即可。
  • 某些选项允许在选项名后跟随一个或多个关键字参数。例如,架构选项 -x 支持多个关键字。
  • 要指定多个关键字,通常需重复指定该选项。
  • 若要禁用选项,请使用其否定形式(若存在)。
  • 当命令行同时存在启用版和禁用版选项时,以命令行末尾的版本为准。
  • 编译器选项在整个编译过程中持续生效,除非被编译器指令覆盖。
  • 单个连字符不可组合多个选项。例如: -Ec 形式错误; -E -c 形式正确。

C/C++编译器

Intel OneAPI编译器编译C和C++源程序的编译命令分别为 icxicpxicpx 命令使用与 icx 命令相同的编译器选项,利用 icpx 编译时将后缀为 .c.i 的文件看作为C++文件;而利用 icx 编译时将后缀为 .c.i 的文件则看作为C文件。用 icpx 编译时,总会链接C++库;而用 icx 编译时,只有在编译命令行中包含C++源文件时才链接C++库。

语言

编译命令

选项风格

备注

C

icx

Clang-Style

icx 是Linux下推荐的默认C编译命令。
如用 icx 编译C++文件,将编译为C++文件。用 icx 链接C目标文件。
icx-cc
icx-cc 是Microsoft兼容的变种。

C++

icpx

Clang-Style

icpx 是Linux下推荐的默认C++编译命令。
如用 icpx 编译C文件,将编译为C++文件。用 icpx 链接C++目标文件。

C/C++

icx-cl

MSVC-Style

icx 是Windows下推荐的默认C编译命令。
icx-clc 是Microsoft兼容的变种。
注意:在Linux下 icx-cl 是试验性的,且依赖于Microfoft Visual Studio包。

编译命令格式为: {compiler driver} [option] file1 [file2...]

  • 针对SYCL兼容,采用 -fsycl 选项的C++编译器:

    icpx -fsycl hello-world.cpp

  • 针对不同文件类型,采用 -x 选项:

    icpx -x c file1 -x c++ file2 -x assembler file3

上述命令指明了分别采用C、C++、汇编模式编译文件 file1file2file3

  • 在CMake中使用: cmake -DCMAKE_C_COMPILER=icx -DCMAKE_CXX_COMPILER=icpx ...

支持的最新标准包含:C++ 20、SYCL、绝大多数OpenMP 5.2及一些OpenMP 6.0 TR12特性。

在Intel数学库(Intelmath)中的许多函数针对Intel微处理器相比针对非Intel微处理器做了非常大的优化处理。

为了使用Intel数学库中的函数,需要在程序源文件中包含头文件,例如使用实函数:

// real_math.c
#include <stdio.h>
#include <mathimf.h>

int main() {
    float fp32bits;
    double fp64bits;
    long double fp80bits;
    long double pi_by_four = 3.141592653589793238/4.0;

    // pi/4 radians is about 45 degrees
    fp32bits = (float) pi_by_four; // float approximation to pi/4
    fp64bits = (double) pi_by_four; // double approximation to pi/4
    fp80bits = pi_by_four; // long double (extended) approximation to pi/4

    // The sin(pi/4) is known to be 1/sqrt(2) or approximately .7071067
    printf("When x = %8.8f, sinf(x) = %8.8f \n", fp32bits, sinf(fp32bits));
    printf("When x = %16.16f, sin(x) = %16.16f \n", fp64bits, sin(fp64bits));
    printf("When x = %20.20Lf, sinl(x) = %20.20f \n", fp80bits, sinl(fp80bits));

    return 0;
}

编译:icx real_math.c

编译时错误

C/C++程序编译时的出错信息类似以下:

netlog.c(140): error: identifier "hhh" is undefined
                    for(int hhh=domain_cnt+1;hhh>TMP;hhh--){
                                             ^
netlog.c(156): error: expected an expression
for(int i=0;i<32;i++)for(int j=0;j<256;j++)if(ip1[i][j]!=0)fprintf(fin);
    ^

编译错误的格式为:

  • 源文件名(行数): 错误类型:具体说明
  • 源代码,^指示出错位置

错误类型可为:

  • Warning:警告,报告对编译有效但也许存在问题的语法,请根据信息及程序本身判断,不一定需要处理。
  • Error:存在语法或语义问题,必须要处理。
  • Fatal Error:报告环境错误,如磁盘空间没有了。

文件扩展名

编译时会根据输入的扩展名执行对应的操作,也会根据不同的选项生成对应的扩展名文件。

输入文件扩展名

文件名

解释

动作

file.c

C源文件

传递给编译器

file.C file.CC file.cc file.cpp file.cxx

C++源文件

传递给编译器

file.a file.so

库文件

传递给链接器

file.i

预处理过的文件

传递给编译器

file.o

目标文件

传递给链接器

file.s file.S

汇编文件

传递给汇编器

输出文件扩展名

文件名

解释

file.i

预处理过的文件,编译时利用-E选项生成

file.o

目标文件,编译时利用 -c 选项生成,可利用 -o 选项命名输出文件名

file.s

汇编文件,编译时利用 -s 选项生成,可利用 -o 选项命名输出文件名

a.out

汇编文件,编译时默认选项生成,可利用-o选项命名输出文件名

重要编译选项

优化选项

  • -fast :最大化整个程序的速度,相当于设置 -ipo -O3 -static -fp-model fast 。这里是所谓的最大化,还是需要结合程序本身使用合适的选项。默认不使用此选项。
  • -fbuiltin[-name]-fno-builtin[-name] :启用或取消内在函数的内联展开,如有 [-name] 则仅针对特定名称的内联函数,特定的内联函数名采用“,”分隔。
  • -nolib-inline :启用或取消标准库或内在函数的内联展开。
  • -On:设定优化级别,默认为 -O2 ,在Linux系统上,如带有 -g 选项,则默认采用 -O0 优化,除非有 -O2 等其它更高级优化选项。

    选项

    描述

    -O

    -O2 相同

    -O0

    禁止所有优化

    -O1

    针对速度优化,且禁止了一些会增加代码大小和影响速度的。
    为了控制代码大小,该选项禁止了复制代码,如:自动函数内联、循环展开、函数克隆等。
    -O1 选项也许对有非常大的代码、很多分支、执行时间不受代码内部循环控制等的应用会提升性能。

    -O2

    针对速度进行优化,是通常推荐的优化级别。
    向量优化在O2及之上级别启用。
    该选项还启用了:
    • 内嵌函数的内联

    • 文件内过程间优化,包含:

      • 内联

      • 常数传播

      • 前向替换

      • 例程属性传播

      • 变量地址占用分析

      • 死静态方程消除

      • 未引用变量消除

    • 以下针对性能的能力启用:

      • 常数传播

      • 复制传播

      • 死代码消除

      • 全局注册器分配

      • 全局指令调度和控制指定

      • 循环展开

      • 优化的代码选择

      • 部分冗余消除(PRE)

      • 强度降低/诱导变量简化

      • 变量重命名

      • 尾递归

      • 窥孔优化

      • 结构赋值降低

      • 死存储消除

    在Linux上,如采用了 -O2 及以上级别的优化及调试选项 -g ,则默认也会启用 -debug inline-debug-info 选项。

    -O3

    -O2 基础上启用了更激进的循环变换优化,如:Fusion、Block-Unroll-and-Jam和collapsing IF statements。
    -O3 选项未必会提供更高的性能,除非循环和内存访问变换会占据空间等。甚至有时候相比 -O2 会降低代码速度。
    -O3 选项推荐使用在含有用于大量浮点计算和处理大数据集的循环的应用。
  • -Ofast :设定一定的优化选项提高程序性能,即设定 -O3 -no-prec-div -fp-model fast=2 。在Linux系统上提供与gcc的兼容。
  • -Os :启用不增加代码大小的优化,产生的代码小于 -O2 。默认关闭。如 -O1 启用,则 -Os 默认也启用。

高级优化选项

  • -ffreestanding :确保编译在独立环境中进行。
  • -fjump-tables-fno-jump-tables :确定是否为switch语句生成跳转表。
  • -fvec-allow-scalar-stores-fno-vec-allow-scalar-stores :是否开启明确的SIMD循环中的向量化,如由#pragma omp simd指明的。
  • -fvec-non-loop-argument-load-fno-vec-non-loop-argument-load :是否针对非循环向量结合负载进行优化。
  • -funroll-all-loops :即使在循环次数不确定的情况下也展开所有循环。默认为否。
  • -fvec-peel-loops-fno-vec-peel-loops :是否启用循环剥离向量化技术。
  • -fvec-remainder-loops-fno-vec-remainder-loops :是否启用余数循环向量化。
  • -fvec-with-mask-fno-vec-with-mask :是否启用带掩码的短行程计数循环向量化。
  • -ipp-link[=lib]:控制编译器链接静态或动态线程化的Intel集成性能原件(Intel IPP)运行时库。lib可为:
    • static :静态。
    • dynamic :动态,为默认选项。
  • -mno-gather :禁用自动向量化中聚合指令的生成。
  • -mno-scatter :禁用自动向量化中散发指令的生成。
  • -qactypes-qno-actypes :决定编译器是否包含算法C(AC)数据类型文件夹用于头文件搜索,以及是否链接至AC数据类型库进行CPU编译。
  • -qdaal[=lib]:指示编译器采用并行还是串行链接至Intel oneAPI数据分析库 (oneDAL) 中的特定库。lib可为:
    • parallel:采用并行线程库,为默认。
    • sequential:采用串行。
  • -qipp[=lib]:指示编译器链接至部分或全部Intel集成性能原件(Intel IPP)库。lib可为:
    • common:指示编译器使用主库集进行链接。若未指定库文件,此为默认选项。
    • crypto:指示编译器使用Intel密码学原语库进行链接。
    • nonpic:指示编译器使用不含位置无关代码的库版本进行链接。
    • nonpic_crypto:指示编译器使用Intel加密原语库进行链接。该选项采用不包含位置无关代码的库版本。
  • -qmkl[=lib]:指示编译器链接至Intel oneAPI数学核心库(oneMKL)中的特定库。默认为不启用。lib可为:
    • parallel:采用线程化部分的OneMKL库链接,默认选项。
    • sequential:采用未线程化的串行OneMKL库链接。
    • cluster:采用集群特定库和串行OneMKL链接。
  • -qmkl-ilp64[=lib]:指示编译器链接至Intel oneAPI数学核心库(oneMKL)的ILP64专用版本。lib可为:
    • parallel:采用线程化部分的OneMKL库链接,默认选项。
    • sequential:采用未线程化的串行OneMKL库链接。
    • cluster:采用集群特定库和串行OneMKL链接。
  • -qmkl-sycl-impl=arg[, arg,...]:允许链接到一个或多个特定的Intel oneAPI数学核心库(oneMKL)SYCL库。arg可为:
    • blas:链接至BLAS SYCL库。
    • dft:链接至离散傅里叶变换(DFT)SYCL库。
    • lapack:链接至LAPACK SYCL库。
    • rng:链接至随机数生成器(RNG)SYCL库。
    • sparse:链接至稀疏BLAS SYCL库。
    • stats:链接至摘要统计量SYCL库。
    • vm:链接至向量数学(VM)SYCL库。
  • -qopt-assume-no-loop-carried-dep[=n]:用于设置循环性能调优级别。n]可为:
    • 0:编译器不假设不存在循环传递依赖。若未指定此选项,则默认采用此设置。
    • 1:指示编译器假设最内层循环不存在循环传递依赖。若使用该选项但未指定n值,则默认采用此设置。
    • 2:指示编译器假设所有循环层级均不存在循环传递依赖。
  • -qopt-dword-index-for-array-of-structs[=val]:允许编译器使用双字索引访问结构数组元素(该数组字节数不超过指定值)。val可为16或32。如未指定val,编译器将使用双字索引访问不超过16字节的结构体数组元素。
  • -qopt-dynamic-align-qno-opt-dynamic-align :启用或禁用动态数据对齐优化。
  • -qopt-for-throughput=value:根据程序运行于单任务或多任务模式,确定编译器如何针对吞吐量进行优化。value可为multi-job或single-job。
  • -qopt-mem-layout-trans=n-qno-opt-mem-layout-trans :控制编译器执行的内存布局转换级别。n可为:
    • 0:禁用内存布局转换。此设置等同于指定 -qno-opt-mem-layout-trans
    • 1:启用基本内存布局转换。
    • 2:启用更多内存布局转换。此设置等同于指定 -qopt-mem-layout-trans 且不带参数。
    • 3:启用更多内存布局转换,例如对代码区域的结构体进行复制进/复制出操作。此设置仅适用于目标系统中每个核心拥有超过4GB物理内存的情况。
    • 4:启用更激进的内存布局转换。此设置仅适用于目标系统中每个核心拥有超过4GB物理内存的情况。
  • -qopt-multiple-gather-scatter-by-shuffles-qno-opt-multiple-gather-scatter-by-shuffles :启用或禁用对多个相邻聚合/散发类型向量内存引用的优化。
  • -qopt-prefetch[=n]-qno-opt-prefetch :启用或禁用预取插入优化。n可为:
    • 0:禁用软件预取功能。相当于指定 -qno-opt-prefetch
    • 1至5:启用不同级别的软件预取功能。若未指定n的值,则默认采用 -qopt-prefetch=2 。使用较低数值可减少预取量。
  • -qopt-prefetch-distance[=n]:指定循环内部编译器生成预取操作所使用的预取距离。预取距离以(可能向量化的)迭代次数表示。可能值为非负数,且大于等于0。当n=0时,将关闭编译器发起的所有从内存到L1缓存的预取操作。
  • -qopt-prefetch-loads-only :指定编译器仅对循环内部的加载操作进行预取,忽略任何存储操作。
  • -qopt-streaming-stores[=keyword]-qno-opt-streaming-stores :启用流式存储优化生成。keyword可为:
    • always:启用流式存储生成以实现优化。编译器在假设应用程序受内存限制的前提下进行优化。当指定此选项设置时,您需自行插入必要的内存屏障(fences),以确保线程内部或跨线程的内存顺序正确。
    • never:禁用流式存储生成以实现优化。执行常规存储操作。此设置效果等同于指定 -qno-opt-streaming-stores
    • auto:由编译器自动决定使用何种指令。
  • -qopt-zmm-usage[=keyword]:定义ZMM寄存器使用级别。[=keyword]可为:

    -low:告知编译器编译后的程序不太可能从zmm寄存器的使用中获益。它指定编译器应避免使用zmm寄存器,除非能证明其使用能带来收益。 -high:告知编译器无限制地生成zmm代码。

  • -qtbb :指示编译器链接至Intel oneAPI线程构建模块(oneTBB)库。
  • -simd-no-simd :是否启用SIMD编译指示的编译器解释。
  • -unroll[=n]-funroll-loops :设置循环展开的最大层级[=n]
  • -use-intel-optimized-headers :决定是否将性能优化头文件目录添加到包含路径搜索列表中。
  • -vec-no-vec :启用或禁用循环向量化。
  • -vec-assume-index-overflow-no-vec-assume-index-overflow :在两种模式间切换,默认采用较不保守的模式。
  • -vec-threshold[=n]:为循环向量化设置阈值。n]是用于循环向量化的阈值整数,取值范围为0至100:
    • 0:无论计算工作量大小,循环始终进行向量化。
    • 100:仅当编译器分析数据预测性能提升时才进行向量化。只有在几乎确定能实现有利的向量级并行执行时,才会进行向量化。
    • 1至99:代表获益加速的概率百分比。如,n=50指示编译器仅在代码以向量形式执行时存在50%加速概率的情况下进行向量化。
  • -vecabi[=keyword]:确定编译器创建或调用向量函数时使用的向量函数应用二进制接口(ABI)。keyword可为:
    • cmdtarget:指示编译器生成扩展的向量函数集。针对编译器选项[Q]x和/或[Q]ax指定的所有目标,将创建向量变体。源代码无需修改。
    • gcc:指示编译器使用gcc向量函数ABI。

代码生成选项

  • -axcode:在有性能提高时,生成针对Intel处理器的多特征面向的自动调度代码路径。code可为:
    • 各种CPU代号:ALDERLAKE、AMBERLAKE、ARROWLAKE、ARROWLAKE-S、BROADWELL、CANNONLAKE、CASCADELAKE、CLEARWATERFOREST、COFFEELAKE、COOPERLAKE、DIAMONDRAPIDS、EMERALDRAPIDS、GOLDMONT、GOLDMONT-PLUS、GRANDRIDGE、GRANITERAPIDS、GRANITERAPIDS-D、HASWELL、ICELAKE-CLIENT、ICELAKE、ICELAKE-SERVER、IVYBRIDGE、KABYLAKE、LUNARLAKE、PANTHERLAKE、ROCKETLAKE、SANDYBRIDGE、SAPPHIRERAPIDS、SIERRAFOREST、SILVERMONT、SKYLAKE、SKYLAKE-AVX512、TIGERLAKE、TREMONT、WHISKEYLAKE
    • COMMON-AVX512:生成Intel Advanced Vector Extensions 512 (Intel AVX-512)基础指令、Intel AVX-512 Conflict Detection Instructions(CDI),同CORE-AVX2启用的一样。
    • CORE-AVX512:生成Intel AVX-512基础指令、Intel AVX-512 CDI、Intel AVX-512 Doubleword and Quadword Instructions (DQI), Intel AVX-512 Byte and Word Instructions (BWI) and Intel AVX-512 Vector Length extensions等,同CORE-AVX2启用的一样。
    • CORE-AVX2:生成Intel AVX2、AVX、SSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3指令。
    • CORE-AVX-I:生成Float-16转换指令和RDRND(随机数)指令、Intel AVX、SSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3指令。
    • AVX:生成Intel AVX、SSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3指令。
    • SSE4.2:生成IntelSSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3指令。
    • SSE4.1:生成IntelSSE4.1、SSE3、SSE2、SSE和SSSE3指令
    • ATOM_SSE4.2、ATOM_SSSE3:针对Intel Atom处理器。
    • SSSE3:生成SSSE3指令和IntelSSE3、SSE2和SSE指令。
    • SSE3:生成IntelSSE3、SSE2和SSE指令。
  • -fasynchronous-unwind-tables-fno-asynchronous-unwind-tables :确定在指令边界还是调用边界处,展开信息是否精确。
  • -fcf-protection[=keyword]:启用Intel控制流强制技术(Intel CET)保护功能,可防御利用漏洞实施的特定攻击。keyword可为:
    • return:启用影子堆栈保护。
    • branch:启用结束分支(EB)生成。
    • full:启用影子堆栈保护和结束分支(EB)生成。相当于指定此编译器选项时不带关键词。
    • none:禁用Intel CET保护。
  • -fdata-sections :将每个数据项放置在其各自的COMDAT节中。
  • -fexceptions-fno-exceptions :是否生成异常处理表。默认:对C不成生,对C++生成。
  • -ffunction-sections :将每个函数放置在其各自的COMDAT节中。
  • -fomit-frame-pointer-fno-omit-frame-pointer-fp :确定在优化过程中是否将EBP用作通用寄存器。
  • -m code:需要生成基于CPUID比特微的目标特征的指令集扩展。该选项仅启用特定的基于CPUID比特位的指令集,如需要启用特定CPU架构的全部指令集,请采用-march选项。
  • -m64 :生成Intel 64架构代码。该选项即将被废弃。
  • -m80387-mno-80387 :指定编译器是否可以使用x87指令。
  • -march=processor:生成支持某种处理器特定特征的代码。processor可为:
    • nocona、core2、penryn、bonnell、atom、silvermont、slm、goldmont、goldmont-plus、tremont、gracemont、nehalem、corei7、westmere、sandybridge、corei7-avx、ivybridge、core-avx-i、haswell、core-avx2、broadwell、common-avx512、skylake、skylake-avx512、skx、cascadelake、cooperlake、cannonlake、icelake- client、rocketlake、icelake-server、tigerlake、sapphirerapids、alderlake、raptorlake、meteorlake、sierraforest、grandridge、graniterapids、emeraldrapids
    • x86-64:生成针对具有64位通用扩展CPU的指令代码。
    • x86-64-v2:生成针对具有Intel SSE4.3、SSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3的CPU指令代码。
    • x86-64-v3:生成针对具有Intel AVX2、AVX、SSE4.3、SSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3的CPU指令代码。
    • x86-64-v4:生成针对具有Intel AVX-512基础指令、CDI、DQI、BWI和VLE的CPU指令代码。

    该选项默认不启用,编译器将生成Intel SSE2 and SSE指令。

  • -masm=dialect:指示编译器使用选定的方言生成汇编器输出文件。=dialect可为:
    • att:指示编译器使用AT&T语法生成汇编器输出文件。
    • intel:指示编译器使用Intel语法生成汇编器输出文件。
  • -mauto-arch=value:指示编译器为x86架构处理器生成多个特性特定的自动调度代码路径,以实现性能提升。value是可为 -ax 选项中的值。
  • -mbranches-within-32B-boundaries-mno-branches-within-32B-boundaries :指示编译器将分支和融合分支对齐到32字节边界,以获得更佳性能。
  • -mintrinsic-promote :启用包含对需要特定CPU功能的内置函数调用的功能,使其目标架构自动提升以支持所需功能。
  • -momit-leaf-frame-pointer-mno-omit-leaf-frame-pointer :确定在叶函数中是否省略帧指针。
  • -mtune=processor:针对特定处理器优化,但不启用扩展的指令集(与 -march 不一样)。processor可为:
    • generic、alderlake、broadwell、cannonlake、cascadelake、cooperlake、goldmont、goldmont-plus、haswell、icelake-server、ivybridge、rocketlake、sandybridge、sapphirerapids、silvermont、skylake、skylake-avx512、tigerlake、tremont、core-avx2、core-avx-i、corei7-avx、corei7、atom、core2
  • -regcall :告知编译器,对于未直接指定调用约定的方法,应使用__regcall调用约定。
  • -xcode:告诉编译器何种处理器特性将成为目标,包含哪些指令集和优化将会产生。code可为:
    • 各种CPU代号:ALDERLAKE、AMBERLAKE、ARROWLAKE、ARROWLAKE-S、BROADWELL、CANNONLAKE、CASCADELAKE、CLEARWATERFOREST、COFFEELAKE、COOPERLAKE、DIAMONDRAPIDS、EMERALDRAPIDS、GOLDMONT、GOLDMONT-PLUS、GRANDRIDGE、GRANITERAPIDS、GRANITERAPIDS-D、HASWELL、ICELAKE-CLIENT、ICELAKE、ICELAKE-SERVER、IVYBRIDGE、KABYLAKE、LUNARLAKE、PANTHERLAKE、ROCKETLAKE、SANDYBRIDGE、SAPPHIRERAPIDS、SIERRAFOREST、SILVERMONT、SKYLAKE、SKYLAKE-AVX512、TIGERLAKE、TREMONT、WHISKEYLAKE
    • COMMON-AVX512:生成Intel Advanced Vector Extensions 512 (Intel AVX-512)基础指令、Intel AVX-512 Conflict Detection Instructions(CDI),同CORE-AVX2启用的一样。
    • CORE-AVX512:生成Intel AVX-512基础指令、Intel AVX-512 CDI、Intel AVX-512 Doubleword and Quadword Instructions (DQI), Intel AVX-512 Byte and Word Instructions (BWI) and Intel AVX-512 Vector Length extensions等,同CORE-AVX2启用的一样。
    • CORE-AVX2:生成Intel Advanced Vector Extensions 2 (Intel AVX2)、Intel AVX、SSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3指令。
    • CORE-AVX-I:生成Float-16转换指令和RDRND(随机数)指令、Intel AVX、SSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3指令。
    • AVX:生成Intel AVX、SSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3指令。
    • SSE4.2:生成IntelSSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3指令。
    • SSE4.1:生成IntelSSE4.1、SSE3、SSE2、SSE和SSSE3指令
    • ATOM_SSE4.2、ATOM_SSSE3:针对Intel Atom处理器。
    • SSSE3:生成SSSE3指令和IntelSSE3、SSE2和SSE指令。
    • SSE3:生成IntelSSE3、SSE2和SSE指令。
  • -xHost :生成进行编译时所用的主机处理器能支持的最高指令集。

卸载编译、OpenMP和并行处理选项

  • -device-math-lib=library-no-device-math-lib=library:是否启用某些设备数学库,library:可为fp32或fp64,如想都链接则用 -device-math-lib=fp32,fp64 。默认fp32与fp64都启用。
  • -fiopenmp :启用对OpenMP功能(如parallel、simd和offloading指令)的识别,并指示并行化器根据OpenMP指令生成多线程代码。此选项是 -qopenmp 的别名。默认不启用。

备注

  • -fiopenmp-fopenmp 不一样。
  • 卸载到特定GPU,必需声明选项 -fopenmp-targets
  • -fopenmp :启用对OpenMP特性的识别,并指示并行化器根据OpenMP指令生成多线程代码。此选项会在编译器前端(由LLVM社区实现)进行OpenMP构造的编译器优化,其性能表现预计将逊于使用 -fiopenmp 选项——后者启用Intel实现的OpenMP构造,优化操作在编译器后端完成。此外,此选项不支持向GPU卸载计算任务。
  • -qopenmp-qno-openmp :是否启用对OpenMP特性的识别,如parallel、simd和offloading指令,并指示并行化器根据OpenMP指令生成多线程代码。此选项是 -fiopenmp 的别名。默认为 -qno-openmp
  • -flink-huge-device-code :指示编译器将设备代码放置在链接二进制文件的末尾。当设备代码大于2GB时,此操作可避免相邻可执行文件与可链接格式(ELF)段之间发生32位程序计数器相对重定位。
  • -fno-sycl-libspirv :禁用对libspirv(SPIR-V 工具库)的检查。
  • -foffload-fp32-prec-div :指示编译器强制执行正确舍入。SYCL及其他卸载语言在某些应用场景(如PyTorch)中未遵循IEEE 754精度要求。
  • -foffload-fp32-prec-sqrt :指示编译器强制执行正确舍入。SYCL等卸载语言在某些应用场景(如PyTorch)中未遵循IEEE 754精度规范。
  • -fopenmp-concurrent-host-device-compile :在执行OpenMP卸载编译时启用主机与目标编译步骤的并行编译。此为实验性功能。
  • -fopenmp-declare-target-scalar-defaultmap :确定在目标指令中引用的标量变量应应用哪些隐式数据映射/共享规则。
  • -fopenmp-device-code-split :启用OpenMP卸载提前编译中 SPIR-V内核的并行编译。
  • -fopenmp-device-lib :启用或禁用OpenMP目标的特定设备库。
  • -fopenmp-device-link :决定编译器是否在编译阶段执行设备链接而非链接阶段。启用后,在OpenMP卸载编译中会在生成的胖对象中生成设备二进制文件。
  • -openmp-max-parallel-link-jobs :确定设备链接阶段(适用时)可执行的并行操作最大数量。
  • -fopenmp-offload-mandatory :指示编译器仅生成OpenMP目标区域的设备版本。
  • -fopenmp-target-buffers :提供解决方法,避免当目标对象大于4GB时某些OpenMP卸载SPIR-V*设备生成错误代码的问题。
  • -fopenmp-target-default-sub-group-size :允许全局指定默认子组大小,用于生成基于SPIR64设备的OpenMP目标构造时生成的单程序多数据(SPMD)内核。
  • -fopenmp-target-loopopt :启用循环优化器和自动向量化功能,用于OpenMP卸载设备编译,当选项级别设置或指定为O2或更高时生效。
  • -fopenmp-target-simd :启用OpenMP SIMD循环向量化功能,用于OpenMP卸载设备编译,当选项级别设置或指定为O2或更高时生效。
  • -fopenmp-target-teams-default-vla-alloc-mode :设置是否可更改OpenMP团队和分布式结构中私有化子句(private、firstprivate等)指定的可变长度/预设尺寸数组的本地副本默认分配方式。
  • -fopenmp-targets :启用OpenMP功能时,允许卸载至指定GPU目标。
  • -fsycl :使程序以SYCL程序而非普通C++11程序形式编译。
  • -fsycl-add-default-spec-consts-image :启用或禁用生成每个使用特化常量的设备映像副本,并将所有该特化常量实例替换为相关特化标识符变量中定义的默认值。
  • -fsycl-allow-device-dependencies :决定在拆分设备代码时是否允许设备映像间存在依赖关系。此选项已弃用,将在未来版本中移除。替代选项为 -fsycl-allow-device-image-dependencies
  • -fsycl-allow-device-image-dependencies :决定是否允许设备映像间存在依赖关系
  • -fsycl-dead-args-optimization :启用消除SYCL无效内核参数的功能。
  • -fsycl-device-code-split :指定SYCL设备代码模块的汇编方式。
  • -fsycl-device-lib :启用或禁用SYCL目标的特定设备库。
  • -fsycl-device-obj :允许指定生成的对象文件中存储的设备代码格式。此为实验性功能。
  • -fsycl-device-only :指示编译器生成纯设备二进制文件。
  • -fsycl-early-optimizations :启用SPIR-V生成前的LLVM相关优化。
  • -fsycl-enable-function-pointers :启用函数指针及SYCL内核与设备函数的虚函数支持。此为实验性功能。
  • -fsycl-esimd-force-stateless-mem :决定编译器是否强制目标设备上的ESIMD内核执行无状态内存访问。此为实验性功能。
  • -fsycl-explicit-simd :启用或禁用实验性“显式SIMD”SYCL扩展。此选项已弃用,未来版本可能移除。
  • -fsycl-force-target :强制编译器在从命令行指定对象提取设备代码时使用指定的目标三重设备。
  • -fsycl-fp64-conv-emu :指示编译器对仅含fp64转换操作且无fp64计算操作的内核使用fp64部分仿真。需配备支持fp64部分仿真的Intel GPU。
  • -fsycl-help :使设备编译器后端输出帮助信息。
  • -fsycl-host-compiler :指示编译器使用指定编译器进行整体卸载编译的主机编译。
  • -fsycl-host-compiler-options :向由选项 fsycl-host-compiler 指定的编译器传递选项。
  • -fsycl-id-queries-fit-in-int :指示编译器假设SYCL ID查询值符合MAX_INT范围。
  • -fsycl-instrument-device-code :启用或禁用VTune的ITT设备库链接功能。
  • -fsycl-link :指示编译器对设备二进制文件执行部分链接。
  • -fsycl-max-parallel-link-jobs :告知编译器可同时启动最多指定数量的进程来执行链接SYCL应用程序所需的操作。此为实验性功能。
  • -fsycl-optimize-non-user-code :指示编译器优化SYCL框架实用函数,同时保留内核代码未优化状态以便后续调试。
  • -fsycl-pstl-offload :启用C++标准并行算法向SYCL设备的自动卸载功能。
  • -fsycl-rdc :决定编译器在SYCL卸载目标编译过程中是否生成可重定位设备代码。
  • -fsycl-remove-unused-external-funcs :决定在编译SYCL设备代码时是否移除未使用的SYCL_EXTERNAL函数。
  • -fsycl-targets :指示编译器为指定设备目标生成代码。
  • -fsycl-unnamed-lambda :启用无名SYCL lambda表达式。
  • -fsycl-use-bitcode :指示编译器将设备代码以LLVM中间表示(IR)位码格式生成至fat对象中。
  • -ftarget-compile-fast :指示编译器执行较不激进的优化,以牺牲生成目标代码的优化程度为代价缩短编译时间。此为实验性功能。
  • -ftarget-export-symbols :在生成的目标库中暴露导出符号,使其对其他模块可见。
  • -ftarget-register-register-alloc-mode :为特定硬件指定寄存器分配模式,供支持的目标后端使用。
  • -nolibsycl :禁用SYCL运行时库的链接。
  • -qopenmp :启用对OpenMP特性的识别(如parallel、simd和offloading指令),并指示并行化器根据OpenMP指令生成多线程代码。此选项是编译器参数 -fiopenmp 的别名。
  • -qopenmp-link :控制编译器链接静态或动态OpenMP运行时库。
  • -qopenmp-simd :启用或禁用OpenMP SIMD编译。
  • -qopenmp-stubs :启用OpenMP程序的顺序模式编译。
  • -Wno-sycl-strict :禁用强制严格SYCL语言兼容性的警告。
  • -Xopenmp-target :启用向OpenMP目标设备编译工具链中指定工具传递选项的功能。
  • -Xs :向后端工具传递选项。
  • -Xsycl-target :启用向设备编译工具链中的指定工具传递选项的功能,适用于SYCL目标。

过程间优化选项

  • -flto[=arg]-fno-lto :是否启用整个程序链接时优化(link time optimization,LTO)。arg可为:
    • full:编译器将在ITP前合并所有输入文件为单个模块。如启用了 -flto ,该参数为默认参数。
    • thin:编译器将从摘要中读取信息,然后并行执行LTO。
  • -ipo[n]-no-ipo :是否在多文件中进行过程间优化,非负整数n为可生成的对象文件数。

性能分析引导优化

  • -p :使用gprof编译和链接函数。
  • -fprofile-dwo-dir=dir:设定存储启用 -fprofile-sample-generate-gsplit-dwarf 选项时将要生成的 .dwo 文件目录。
  • -fprofile-ml-use :启用预训练的机器学习模型以用于预测分支执行概率驱动PGO。该选项即将废弃。
  • -fprofile-sample-generate[=level]:设定编译器与链接器针对硬件概要向导优化(Hardware Profile-Guided Optimization,HWPGO)时生成的信息级别。level可为:
    • none:与不启用 -fprofile-sample-generate 选项一样。
    • keep-all-opt:告诉编译器与连接器生成全部并且不禁止任何优化的HWGPO信息,为默认参数。
    • med-fidelity:告诉编译器与连接器生成禁止一些抑制概要保真度的优化的HWGPO信息。
    • max-fidelity:告诉编译器与连接器生成禁止大多数编译器优化的HWGPO信息。这将提供一个面向执行数概要保真度的二进制。
  • -fprofile-sample-use=profile-file-fno-profile-sample-use :设定概要摘要文件名。

优化报告选项

  • -qopt-report[=arg]:设定显示优化报告信息的级别,为每个对象文件生成一个对应的文件。arg为0(不显示)到5(最详细)。
  • -qopqopt-report-file=keyword:设定报告文件名。keyword可为:
    • filename:保存输出的文件名。
    • stderr:输出到标准错误输出。
    • stdout:输出到标准输出。
  • -qopt-report-names=keyword:是否在优化报告中显示重整的或未重整的名字。keyword可为:mangled和unmangled。
  • -qopt-report-phase :对生成的优化报告指明一个或多个优化阶段。phase可为:cg、ipo、loop、openmp、par、pgo、tcollect、vec和all等。
  • -qopt-report-stdout :设定是否生成的报告是否直接输出在标准输出。

浮点数选项

  • -ffp-accuracy=value:设定针对浮点数操作及调用所需要的浮点数精度。value可为:
    • high:设置错误数最大为1个ulp(units in the last place)
    • medium:设置错误数最大为4个ulp
    • low:错误数最大为针对单精度函数11个比特精度(约9192个ulp)及针对双精度函数为26个比特精度
    • sycl:由OpenCL规范决定数学函数精度
    • cuda:由CUDA规范决定数学函数精度
  • -ffp-contract=keyword:控制何时允许编译器进行融合浮点运算,例如融合乘加 (FMA)。
    • fast:跨语句进行融合浮点操作。为默认项,但如设置了 -fp-model=strict 选项,则默认为 -ffp-contract=off
    • on:在同一个语句内进行融合浮点操作。
    • off:不进行融合浮点操作。
  • -fimf-absolute-error=value[:funclist]:定义数学库函数结果的最大允许绝对误差。
    • value:是一个正浮点数。如果绝对误差小于或等于值,则数学库函数结果中的误差可能会超过最大相对误差 (max-error) 设置。格式为[digits] [.digits] [ { e | E }[sign]digits]
    • funclist:是一个或多个应应用该属性的数学库函数的可选列表。如果指定多个函数,则必须用“,”分隔。

    如: -fimf-absolute-error=0.00001:sin,sinf

  • -fimf-accuracy-bits=bits[:funclist]:定义数学函数返回值的相对误差,包含除法及开方。bits为正浮点数,指明编译器应该使用的正确位数,funclist为函数名列表。如: -fimf-accuracy-bits=23:sin,sinf 。bits与ulps之间的变换关系为:\(ulps=2^{p-1-bits}\),其中p为目标格式尾数bits的位数(对应单精度、双精度和长双精度分别为23、53和64)。
  • -fimf-arch-consistency=value[:funclist]
  • -fimf-domain-exclusion=classlist[:funclist]:设定数学函数必须提供正确结果的输入参数域。如: -fimf-domain-exclusion=23:log,logf,/,sin,cosf
  • -fimf-max-error=ulps[:funclist]:定义对于数学函数返回值的最大允许相对误差,包含除法及开方。value为正浮点数,指定编译器可以使用的最大相对误差,funclist为函数名列表,如: -fimf-max-error=4.0:sin,sinf
  • -fimf-precision[=value[:funclist]]:当设定使用何种数学库函数时,定义编译器应该使用的精度。value可为:
    • high:等价于 -fimf-max-error=1.0
    • medium:等价于 -fimf-max-error=4
    • low:等价于 -fimf-accuracy-bits=11 (对单精度)和 accuracy-bits=26 (对双精度)

    funclist为函数名列表,如: -fimf-precision=high:sin,sinf

  • -fimf-use-svml=value[:funclist]:指示编译器使用短向量数学库(SVML)而不是Intel oneAPI DPC++/C++编译器数学库(LIBM)来实现数学库函数。
  • -fma、-no-fma` :是否对存在融合乘加(fused multiply-add,FMA)的目标处理器启用融合乘加。此选项只有在 -x-march 参数设定CORE-AVX2或更高时才有效。
  • -fp-modelkeyword:控制浮点计算的语义,keyword可为:
    • precise:取消浮点数据的非值安全优化。
    • fast[=1|2]:对浮点数据启用更加激进的优化。
    • consistent:禁用对浮点数据不值安全的优化,禁用收缩(FMA),并选择能在相同架构的不同微架构实现中产生一致结果的数学库函数。
    • strict:启用精确模式,禁用缩写,并启用pragma stdc fenv_access。
  • -fp-speculation=mode:设定推测浮点操作时使用的模式。mode可为:
    • fast:让编译器推测浮点操作。
    • safe:让编译器在推测浮点操作有可能存在浮点异常时停止推测。
    • strict:让编译器禁止浮点操作时推测。
  • -ftz :将非规范化结果清为0。
  • -pcn:启用浮点数有效数字精度的控制。n可为:
    • 32:四舍五入尾数到24位(单精度)。
    • 64:四舍五入尾数到53位(双精度)。
    • 80:四舍五入尾数到64位(扩展精度)。

内联选项

  • -gnu89-inline :设定编译器在C99模式时使用C89语义处理内联函数。
  • -finline-fno-inline :是否对__inline声明的函数进行内联并执行C++内联。
  • -finline-functions-fno-inline-functions :对单个文件编译时启用函数内联。
  • -inline-forceinline :指示编译器将内联例程视为强制内联。

输出、调试及预编译头文件选项

  • -c :仅编译成对象文件( .o 文件)。
  • -debug [keyword]:设定是否生成调试信息。keyword可为:
    • none:不生成调试信息。
    • full或all:生成完全调试信息。
    • minimal:生成最少调试信息。
    • emit_column:生成用于调试的列号信息。
    • extended:设定关键字值semantic-stepping和variable-locations。
    • parallel:设定编译器生成并行调试代码指令以有助于线程数据共享和可重入调用探测。
  • -fasm-blocks :允许在C或C++文件中使用汇编代码的块和完整函数。
  • -fsystem-debug-fno-system-debug :启用或禁用系统头文件中声明的调试信息生成。
  • -fverbose-asm-fno-verbose-asm :生成包含编译器注释的程序集列表,其中包含选项和版本信息。
  • -g[n]:包含调试信息。n为生成的调试信息级别,可为:
    • 0:禁止生成符号调试信息。
    • 1:生成用于执行堆栈跟踪的最小调试信息。
    • 2:生成完整的调试信息。相当于指定-g选项而不带n参数。
    • 3:生成额外信息,这些信息可能对某些工具有用。
  • -gdwarf-n:设定生成调试信息时的DWARF版本号,n可为2、3、4、5。
  • -grecord-gcc-switches :将用于调用编译器的命令行选项附加到DWARF调试信息中的DW_AT_producer属性。
  • -gsplit-dwarf :创建一个单独的对象文件,其中包含DWARF调试信息。
  • -o file :指定生成的文件名。
  • -S :设定编译器只是生成汇编文件但并不进行链接。
  • -use-msasm :允许在C或C++文件中使用汇编代码的块和完整函数。

预处理选项

  • -Bdir:设定头文件、库文件及可执行文件的搜索路径。
  • -Dname[=value]:设定编译时的宏及其值。
  • -dD :输出预处理的源文件中的#define指令。
  • -dM :输出预处理后的宏定义。
  • -dN :与 -dD 类似,但只输出的#define指令的宏名。
  • -E :设定预处理时输出到标注输出。
  • -EP :设定预处理时输出到标注输出,忽略#line指令。
  • -H :编译时显示头文件顺序并继续编译。
  • -I :设定头文件附加搜索路径。
  • -idirafterdir:设定dir路径到第二个头文件搜索路径中(在 -I 之后)。
  • -imacros filename:允许一个头文件在编译时在其它头文件前面。
  • -iprefix prefix:指定包含头文件的参考目录的前缀。
  • -iquote dir:在搜索的头文件路径前面增加dir目录以供那些使用引号而不是尖括号的文件使用。
  • -isystem dir:附加dir目录到系统头文件的开始。
  • -iwithprefixdir:附加dir目录到通过 -iprefix 引入的前缀后,并将其放在头文件目录末尾的头文件搜索路径中。
  • -iwithprefixbeforedir:除头文件目录dir放置的位置与 -I 声明的一样外,与 -iwithprefix 类似。
  • -M :让编译器针对各源文件生成makefile依赖行。
  • -MD :预处理和编译,生成后缀为.d包含依赖关系的输出文件。
  • -MFfilename:让编译器在一个文件中生成makefile依赖信息。
  • -MG :让编译器针对各源文件生成makefile依赖行。与 -M 类似,但将缺失的头文件作为生成的文件。
  • -MM :让编译器针对各源文件生成makefile依赖行。与 -M 类似,但不包含系统头文件。
  • -MMD :预处理和编译,生成后缀为 .d 包含依赖关系的输出文件。与 -M 类似,但不包含系统头文件。
  • -MP :让编译器对每个依赖生成伪目标。
  • -MQtarget:对依赖生成改变默认目标规则。target是要使用的目标规则。与 -MT 类似,但引用特定Make字符。
  • -MTtarget:对依赖生成改变默认目标规则。target是要使用的目标规则。
  • -nostdinc++ :对C++不搜索标准目录下的头文件,而搜索其它标准目录。
  • -P :停止编译处理,并将结果写入文件。
  • -pragma-optimization-level=interpretation:指定如没有前缀指定时,采用何种优化级别编译指令解释。interpretation可为:
    • Intel:Intel解释。
    • GCC:GCC解释。
  • -Uname:取消某个预定义的宏。
  • -undef :取消所有预定义的宏。
  • -X :从搜索路径中去除标准搜索路径。

组件控制选项

  • -Qoption,string,options :将选项传递给指定工具。
  • string:工具名,可为:
  • cpp:指示编译器的预处理器
  • c:指示Intel oneAPI DPC++/C++编译器
  • asm:指示汇编器
  • as:指示汇编器
  • gas:指示GNU链接器
  • link:指示链接器
  • ld:指示加载器
  • gld:指示GNU加载器
  • lib:指示特定库
  • crt:指示链接到可执行文件中的 crt%.o 文件包含开始执行的位置
  • options:以“,”分隔的传递给他工具的选项

语言选项

  • -ansi :启用与gcc选项ansi的语言兼容性。
  • -fno-gnu-keywords :指示编译器不将 typeof 识别为关键字。
  • -fno-operator-names :禁用对标准中指定的运算符名称的支持。
  • -fno-rtti :禁用运行时类型信息(RTTI)支持。
  • -fpermissive :指示编译器允许编写不符合标准的代码。
  • -fshort-enums :指示编译器为枚举类型分配所需字节数。
  • -fsyntax-only :指示编译器仅检查语法正确性。
  • -funsigned-char :将默认字符类型设为无符号。
  • -std=val:指示编译器遵循特定语言标准。val可为c++2b、c++20、c++17、c++14、c18 and c17、c11、c++11、c++98 and c++03、c2x、c99、c90 and c89、gnu++2b、gnu++20、gnu++17、gnu++14、gnu++11、gnu++98 and gnu++03、gnu2x、gnu18 and gnu17、gnu11、gnu99、gnu90 and gnu89。默认为c++17或c17,分别对应C++与C。
  • -strict-ansi :指示编译器实现严格的ANSI兼容方言。
  • -xtype:指示编译器将-x类型之后的所有源文件识别为特定类型。type可为c++、c++-header、c++-cpp-output、c、c-header、cpp-output、assembler、assembler-with-cpp、none,分别表示c源文件等,以使所有源文件都被认为是此类型的。
  • Zp[n]:指定结构体在字节边界上的对齐方式。n是字节大小边界,可为1、2、4、8和16。

数据选项

  • -fcommon-fno-common :决定编译器是否将公共符号视为全局定义。
  • -fkeep-static-consts-fno-keep-static-consts :指示编译器保留源代码中未被引用的变量分配。
  • -fmaintain-32-byte-stack-align-fno-maintain-32-byte-stack-align :指示编译器是否:若外部链接函数的栈对齐状态不确定,则重新对齐至32字节;其他函数保持32字节对齐。
  • -fmath-errno-fno-math-errno :告知编译器:调用标准数学库函数后可可靠检测errno状态。
  • -fpack-struct :指定结构体成员应紧凑排列。
  • -fpic、-fno-pic :决定编译器是否生成位置无关代码。也可为 -fPIC 。构建共享对象时必须使用选项 -fpic
  • -fpie :指示编译器生成位置无关代码。生成的代码仅可链接至可执行文件。与 -fpic 类似,但 -fpie 生成的代码只能链接到可执行文件中。由于对象链接到可执行文件中,因此此选项可以更好地优化某些符号引用。
  • -fstack-security-check-fno-stack-security-check :决定编译器是否生成检测缓冲区溢出的代码。
  • -fvisibility :指定全局符号的默认可见性,或声明、函数、变量中符号的可见性。
  • -fzero-initialized-in-bss-fno-zero-initialized-in-bss :决定编译器是否将显式初始化为零的变量放置在DATA段。
  • -ftls-model=local-exec :启用对特定线程局部存储(TLS)变量的快速访问。
  • -mcmodel=mem_model:指示编译器使用特定内存模型生成代码并存储数据。mem_model可为:
    • small:告诉编译器将代码和数据限制在前2GB 地址空间内。所有代码和数据的访问都可以通过指令指针(IP)相对寻址来完成。
    • medium:告诉编译器将代码限制为前2GB;它对数据没有内存限制。代码的访问可以使用IP相对寻址来完成,但是数据的访问必须使用绝对寻址来完成。
    • large:对代码或数据没有内存限制。所有代码和数据的访问都必须使用绝对寻址来完成。

编译器诊断选项

  • -qunknown-option-as-warning-qno-unknown-option-as-warning :指示编译器在Linux系统上将未知编译器选项视为警告而非错误。
  • -w :禁用所有警告信息。
  • -Wabi、-Wno-abi :确定当生成的代码不符合C++ ABI规范时是否发出警告。
  • -Wall :启用警告和错误诊断。
  • -Wcheck-unicode-security-Wno-check-unicode-security :决定编译器是否执行源代码检查以检测Unicode漏洞。
  • -Wcomment-Wno-comment :决定当/*出现在/**/注释中间时是否发出警告。
  • -Wdeprecated-Wno-deprecated :决定是否对已弃用的C++头文件发出警告。
  • -Werror :将所有警告转换为错误。
  • -Werror-all :将所有警告和当前启用的注释报告为错误。
  • -Wextra-tokens-Wno-extra-tokens :决定是否对预处理指令末尾的额外标记发出警告。
  • -Wformat-Wno-format :决定是否启用对printf、scanf等函数调用的参数检查。
  • -Wformat-security-Wno-format-security :决定当格式函数的使用可能引发安全问题时,编译器是否发出警告。
  • -Wmain-Wno-main :决定是否在main函数返回类型不符合预期时发出警告。
  • -Wmissing-declarations-Wno-missing-declarations :决定是否对未事先声明的全局函数和变量发出警告。
  • -Wmissing-prototypes-Wno-missing-prototypes :决定是否对缺少原型的函数发出警告。
  • -Wpointer-arith-Wno-pointer-arith :决定是否对可疑的指针运算发出警告。
  • -Wreorder-Wreorder :指示编译器在成员初始化器的顺序与必须执行的顺序不匹配时发出警告。
  • -Wreturn-type-Wno-return-type :决定在以下情况是否发出警告:
    • 函数声明时未指定返回类型;
    • 返回void的函数定义中包含带有表达式的return语句;
    • 遇到返回非void类型的函数的闭合大括号时。
  • -Wshadow-Wno-shadow :当变量声明覆盖先前声明时,决定是否发出警告。
  • -Wsign-compare-Wno-sign-compare :当有符号值转换为无符号值时,若有符号与无符号值的比较可能产生错误结果,决定是否发出警告。
  • -Wstrict-aliasing-Wno-strict-aliasing :对于可能违反优化器严格别名规则的代码,决定是否发出警告。
  • -Wstrict-prototypes-Wno-strict-prototypes :决定是否对未指定参数类型的函数声明或定义发出警告。
  • -Wtrigraphs-Wno-trigraphs :决定是否在遇到可能改变程序含义的三字符序列时发出警告。
  • -Wuninitialized-Wno-uninitialized :决定是否在变量初始化前使用时发出警告。
  • -Wunknown-pragmas-Wno-unknown-pragmas :决定是否在使用未知#pragma指令时发出警告。
  • -Wunused-function-Wno-unused-function :决定是否在声明的函数未被使用时发出警告。
  • -Wunused-variable-Wno-unused-variable :决定是否在局部变量或非常量静态变量声明后未被使用时发出警告。
  • -Wwrite-strings :当const char * 被转换为(non-const) char * 时发出诊断信息。

兼容性选项

  • --gcc-toolchain=dir:设定基本gcc工具链的位置。

链接或链接器选项

  • -fortlib :指示C/C++编译器驱动程序链接至Fortran库。该选项主要用于C/C++混合语言编程。
  • -fuse-ld=keyword:指示编译器使用替代默认ld链接器。keyword可为:
    • bfd:指示编译器使用bfd链接器。
    • gold:指示编译器使用gold链接器。
    • lld:指示编译器使用lld链接器。
  • -lstring:指示链接器在链接时搜索指定库文件。如库文件名为 libstring.so ,则用 -lstring 指定(去掉lib及.so)。
  • -Ldir:指示链接器在搜索标准目录前优先搜索指定目录dir中的库文件。
  • -nodefaultlibs :禁止编译器在链接时使用标准库。
  • -no-intel-lib[=library]:禁用与指定Intel库或所有Intel库的链接。library可为:
    • libirc:Intel C/C++库。
    • libimf:Intel oneAPI DPC++/C++编译器数学库。
    • libsvml:Intel短向量数学库。
    • libirng:随机数生成器库。
  • -nostartfiles :禁止编译器在链接时使用标准启动文件。
  • -nostdlib :禁止编译器在链接时使用标准库和启动文件。
  • -pie-no-pie :确定编译器是否生成将被链接到可执行文件中的位置无关代码。
  • -pthread :指示编译器使用pthread库提供多线程支持。设置后同时启用: -fiopenmp -qmkl -debug=parallel -fortlib
  • -shared :指示编译器生成动态共享对象而非可执行文件。
  • -shared-intel-i-dynamic :动态方式链接Intel提供的库。
  • -shared-libgcc :动态链接GNU libgcc库。
  • -static :禁止与共享库进行链接。
  • -static-intel-i-static :静态方式链接Intel提供的库。
  • -static-libgcc :静态链接GNU libgcc库。
  • -static-libstdc++ :静态链接GNU libstdc++库。
  • -Tfilename:指示链接器从文件 filename 中读取链接命令。
  • -usymbol:告知编译器指定符号未定义。
  • -v :指定应显示并执行驱动工具命令。
  • -Wa ,option1[,option2,...]:将选项传递给汇编器进行处理。此,option1[,option2,...]选项不经由驱动程序处理,而是直接传递给汇编器。
  • -Wl,option1[,option2,...]:将选项传递给链接器进行处理。此,option1[,option2,...]选项不经由驱动程序处理,而是直接传递给链接器。
  • -Wp,option1[,option2,...]:将选项传递给预处理器。此,option1[,option2,...]选项不经由驱动程序处理,而是直接传递给预处理器。
  • -Xlinker option:将链接器选项直接传递给链接器。

杂项选项

  • -dryrun :指定应显示驱动程序工具命令但不执行。
  • -dumpmachine :显示目标机器和操作系统配置。
  • -dumpversion :显示编译器的版本号。
  • -fpreview-breaking-changes :允许用户告知编译器其愿意放弃向后兼容性保证,并使编译器启用将在下个主要版本中出现的新向后兼容性破坏性变更。
  • -help :按字母顺序显示支持的编译器选项列表。也可显示某一类选项,如显示诊断选项: -help diagnostics
  • -save-temps-no-save-temps :指示编译器保存编译过程中生成的中间文件。
  • -sox[=keyword[,keyword]]-no-sox :指示编译器将编译选项保存至可执行文件。keyword可为:
    • inline:包含每个对象中被内联的函数列表。
    • profile:包含使用性能分析功能的函数数据,这些函数通过启用性能分析引导优化(PGO)的Clang选项编译,例如 -fprofile-use-fprofile-instr-use
    • secure:移除目录名称及其相关选项。
    • secure-defines:移除命令行中列出的定义( -D )。
  • --sysroot=dir:指定头文件和库文件所在的根目录。
  • -version :指示编译器显示GCC风格的版本信息。

过时及废弃的选项

过时的选项

过时项

建议代替项

fsycl-explicit-simd

daal

qdaal

device-math-lib

tbb

qtbb

废弃的选项

过时项

建议代替项

c99

std=c99

check-uninit

check=uninit

foffload-static-lib

fsycl-add-targets

fsycl-link-huge-device-code

flink-huge-device-code

fsycl-link-targets

gcc-name、gxx-name

无精确代替,采用gcc-toolchain

std=c9x

std=c99

syntax

fsyntax-only

可移植性与GCC兼容警告选项

以下选项Intel编译器与GCC编译器都支持:

  • -ansi
  • -B
  • -C
  • -c
  • -D
  • -dD
  • -dM
  • -E
  • -fargument-noalias-fargument-noalias-global
  • -fcf-protection
  • -fdata-sections
  • -ffunction-sections
  • -f[no-]builtin
  • -f[no-]common
  • -f[no-]freestanding
  • -f[no-]gnu-keywords
  • -f[no-]inline-f[no-]inline-functions
  • -f[no-]math-errno
  • -f[no-]operator-names
  • -f[no-]stack-protector
  • -f[no-]unsigned-bitfields
  • -fpack-struct
  • -fpermissive
  • -fPIC-fpic
  • -fshort-enums
  • -fsyntax-only
  • -funroll-loops
  • -funsigned-char
  • -fverbose-asm
  • -H
  • -help
  • -I
  • -idirafter
  • -imacros
  • -iprefix-iwithprefix-iwithprefixbefore
  • -l-L
  • -M
  • -march-mcpu
  • -MD-MF-MG-MM-MMD
  • -m[no-]ieee-fp
  • -MP-MQ
  • -msse-msse2-msse3
  • -MT
  • -nodefaultlibs-nostartfiles-nostdinc-nostdinc++-nostdlib
  • -o
  • -O-O0-O1-O2-O3-Os
  • -p
  • -P
  • -S
  • -shared-static
  • -std
  • -trigraphs
  • -U
  • -u
  • -v
  • -V
  • -Wall
  • -Werror
  • -W[no-]cast-qual
  • -W[no-]comment-W[no-]comments
  • -W[no-]deprecated
  • -W[no-]fatal-errors
  • -W[no-]format-security
  • -W[no-]main
  • -W[no-]missing-declarations-W[no-]missing-prototypes
  • -W[no-]overflow-W[no-]overloaded-virtual
  • -W[no-]pointer-arith
  • -W[no-]return-type
  • -W[no-]strict-prototypes
  • -W[no-]trigraphs
  • -W[no-]uninitialized-W[no-]unknown-pragmas-W[no-]unused-function-W[no-]unused-variable
  • -X
  • -Xlinker
  • -x assembler-with-cpp-x c-x c++

Fortran编译器

Intel OneAPI编译器编译Fortran源程序的命令为ifx

编译时错误

Fortran程序编译时的出错信息类似以下:

NOlihm.f90(146): error #6404: This name does not have a type, and must
have an explicit type.   [NPR]
  n2nd=0;  npr=0
-----------^
NOlihm.f90(542): remark #8290: Recommended relationship between field width
'W' and the number of fractional digits 'D' in this edit descriptor is 'W>=D+3'.
6060 format(/i2,'-th layer',i2,'-th element: z=',i3,' a=',f9.5/' Ef=',f7.5)
-----------------------------------------------------------------------^

编译错误的格式为:

  • 源文件名(行数): 错误类型:具体说明
  • 源代码,^指示出错位置

错误类型可为:

  • Warning:警告,报告对编译有效但也许存在问题的语法,请根据信息及程序本身判断,不一定需要处理。
  • Error:存在语法或语义问题,必须要处理。
  • Fatal Error:报告环境错误,如磁盘空间没有了。

Fortran程序运行时错误

根据运行时错误代码可以在官方手册中查找对应错误解释。

输入文件后缀

文件扩展名决定文件将传递给编译器还是链接器。以下文件类型用于编译器:

  • 传递给编译器的文件: .f90.for.f.fpp.i.i90.ftn

    典型的Fortran源文件扩展名为 .f90.for.f 。编辑源文件时,需选择源代码格式:自由格式或固定格式(或称为制表符格式的固定格式变体)。可通过编译器选项指定源文件格式,也可在创建或重命名文件时使用特定扩展名。例如,编译器默认将以下扩展名的文件视为:

    • .f90.i90 :自由格式源文件
    • .f.for.ftn.i :固定格式(或制表符格式)文件
  • 传递给链接器的文件: .a.o.so

文件名

解释

动作

file.f file.for file.ftn file.i

Fortran固定格式源文件

编译器进行编译

file.fpp file.FPP file.F file.FOR file.FTN

Fortran固定格式源文件

由Intel编译器利用fpp命令自动进行预处理后进行编译

file.f90 file.i90

Fortran自由格式源文件

编译器进行编译

file.F90

Fortran自由格式源文件

由Intel编译器利用fpp命令自动进行预处理后进行编译

file.a file.so

库文件

传递给链接器

file.s

汇编文件

传递给汇编器

file.o

目标文件

传递给链接器

输出文件后缀

文件名

解释

file.i

预处理过的文件,编译时利用 -E 选项生成

file.o

目标文件,编译时利用 -c 选项生成,可利用 -o 选项命名输出文件名

file.s

汇编文件,编译时利用 -s 选项生成,可利用 -o 选项命名输出文件名

a.out

汇编文件,编译时默认选项生成,可利用 -o 选项命名输出文件名

编译器限制

数据存储量、数组大小以及可执行程序的总大小仅受可用进程虚拟地址空间的限制,该空间由系统参数决定。

下表显示了单个Intel Fortran程序单元及其内部单个语句的大小和复杂度限制:

语言

限制

每次调用或函数引用实际传递的参数数量

仅受内存限制约束

规范表达式中函数引用的参数

255

数组维数

31(Fortran 2018标准支持最大数组维数为15。)

每维数组元素数

基于Intel 64架构的系统:\(2^{63}-1\) 受当前内存配置限制。

字符长度基于

Intel 64架构的系统:\(2^{63}-1\)

常量:字符与霍勒里斯字符

7198

常量:列表导向

I/O中读取的字符数2048个字符

续行

  • 自由格式行最多可包含10,000个字符。
  • 固定格式或自由格式语句最多可包含1,000,000个字符。
  • 更长的行可能减少允许的续行数量,具体取决于每条语句的词法标记限制。

数据与I/O隐含的DO嵌套

31

DO、CASE、FORALL、WHERE
及块IF语句嵌套(合并计算)

512

DO循环索引变量

9,223,372,036,854,775,807= \(2^{63}-1\)

格式组嵌套

8

Fortran源代码行长度

  • 固定格式:72字符(启用-extend_source时为132字符)
  • 自由格式:10,000字符

INCLUDE文件嵌套

20层

计算或赋值GOTO列表中的标签

仅受内存限制

每条语句的词法标记

41,000

命名公共块

仅受内存限制

数组构造器隐含DO的嵌套

31

输入/输出隐含DO的嵌套

31

接口块嵌套

仅受内存限制

DO、IF或CASE结构嵌套

仅受内存限制

括号格式嵌套

仅受内存限制

MIN和MAX的参数数量

仅受内存限制

数值常量的位数

受语句长度限制

表达式中的括号嵌套层级

仅受内存限制

结构嵌套层级

30

符号名称长度

63个字符

数值编辑描述符的宽度字段

在采用Intel 64架构的系统上为\(2^{31}-1\), 其他编辑描述符字段的限制请参阅《数据编辑描述符格式》。

重要编译选项

优化选项

  • -falias-fno-alias :指定过程调用是否可能包含未作为实际参数提供的局部变量的隐藏别名。
  • -fast :最大化整个程序的速度,相当于设置 -ipo -O3 -static -fp-model fast 。这里是所谓的最大化,还是需要结合程序本身使用合适的选项。默认不使用此选项。
  • -foptimize-sibling-calls-fno-optimize-sibling-calls :确定编译器是否优化尾递归调用。
  • -fprotect-parens-fno-protect-parens :确定优化器在评估浮点表达式时是否遵循括号的优先级。
  • -nolib-inline :启用或取消标准库或内在函数的内联展开。
  • -On:设定优化级别,默认为 -O2 ,在Linux系统上,如带有 -g 选项,则默认采用 -O0 优化,除非有 -O2 等其它更高级优化选项。

    选项

    描述

    -O

    -O2 相同

    -O0

    禁止所有优化

    -O1

    针对速度优化,且禁止了一些会增加代码大小和影响速度的。
    为了控制代码大小,该选项禁止了复制代码,如:自动函数内联、循环展开、函数克隆等。
    -O1 选项也许对有非常大的代码、很多分支、执行时间不受代码内部循环控制等的应用会提升性能。

    -O2

    针对速度进行优化,是通常推荐的优化级别。
    向量优化在O2及之上级别启用。
    该选项还启用了:
    • 内嵌函数的内联
    • 文件内过程间优化,包含:
      • 内联
      • 常数传播
      • 前向替换
      • 例程属性传播
      • 变量地址占用分析
      • 死静态方程消除
      • 未引用变量消除
    • 以下针对性能的能力启用:
      • 常数传播
      • 复制传播
      • 死代码消除
      • 全局注册器分配
      • 全局指令调度和控制指定
      • 循环展开
      • 优化的代码选择
      • 部分冗余消除(PRE)
      • 强度降低/诱导变量简化
      • 变量重命名
      • 尾递归
      • 窥孔优化
      • 结构赋值降低
      • 死存储消除
    在Linux上,如采用了 -O2 及以上级别的优化及调试选项 -g ,则默认也会启用 -debug inline-debug-info 选项。

    -O3

    -O2 基础上启用了更激进的循环变换优化,如:Fusion、Block-Unroll-and-Jam和collapsing IF statements。
    -O3 选项未必会提供更高的性能,除非循环和内存访问变换会占据空间等。甚至有时候相比 -O2 会降低代码速度。
    -O3 选项推荐使用在含有用于大量浮点计算和处理大数据集的循环的应用。
  • -Ofast :设定一定的优化选项提高程序性能,即设定 -O3 -no-prec-div -fp-model fast=2 。在Linux系统上提供与gcc的兼容。
  • -Os :启用不增加代码大小的优化,产生的代码小于 -O2 。默认关闭。如 -O1 启用,则 -Os 默认也启用。

高级优化选项

  • -ansi-alias-no-ansi-alias :告知编译器采用Fortran标准中关于别名和数组边界的一些特定规则。
  • -coarray[=keyword]:启用协数组功能。keyword可为:
    • shared:表示将创建多个映像。此为默认设置。
    • single:表示映像不包含自我复制代码的配置。这将生成仅包含单个运行映像的可执行文件。此配置可用于调试目的,尽管映像之间不存在交互。
  • -coarray-config-file=filename:指定消息传递接口(MPI)配置文件的名称。
  • -coarray-num-images=n:指定运行共阵列可执行文件时可使用的默认映像数量。
  • -fvec-allow-scalar-stores-fno-vec-allow-scalar-stores :是否开启明确的SIMD循环中的向量化,如由#pragma omp simd指明的。
  • -fvec-non-loop-argument-load-fno-vec-non-loop-argument-load :是否针对非循环向量结合负载进行优化。
  • -fvec-peel-loops-fno-vec-peel-loops :是否启用循环剥离向量化技术。
  • -fvec-remainder-loops-fno-vec-remainder-loops :是否启用余数循环向量化。
  • -fvec-with-mask-fno-vec-with-mask :是否启用带掩码的短行程计数循环向量化。
  • -heap-arrays [size]-no-heap-arrays :将自动数组和临时计算创建的数组放在堆上而非栈上。size是一个整数值,表示数组的大小(以千字节KB为单位),小于该大小的数组将被放置在栈上。
  • -mno-gather :禁用自动向量化中聚合指令的生成。
  • -mno-scatter :禁用自动向量化中散发指令的生成。
  • -pad-nopad :允许更改变量和数组的内存布局。此选项在应用于结构体和派生类型时,实际上与 -align 选项并无区别。然而 -pad 选项的作用范围更广,因为它同样适用于公共块、派生类型、序列类型和结构体。
  • -qmkl[=lib]:指示编译器链接至Intel oneAPI数学核心库(oneMKL)中的特定库。默认为不启用。lib可为:
    • parallel:采用线程化部分的OneMKL库链接,默认选项。
    • sequential:采用未线程化的串行OneMKL库链接。
    • cluster:采用集群特定库和串行OneMKL链接。
  • -qmkl-ilp64[=lib]:指示编译器链接至Intel oneAPI数学核心库(oneMKL)的ILP64专用版本。lib可为:
    • parallel:采用线程化部分的OneMKL库链接,默认选项。
    • sequential:采用未线程化的串行OneMKL库链接。
    • cluster:采用集群特定库和串行OneMKL链接。
  • -qmkl-sycl-impl=arg[, arg,...]:允许链接到一个或多个特定的Intel oneAPI数学核心库(oneMKL)SYCL库。arg可为:
    • blas:链接至BLAS SYCL库。
    • dft:链接至离散傅里叶变换(DFT)SYCL库。
    • lapack:链接至LAPACK SYCL库。
    • rng:链接至随机数生成器(RNG)SYCL库。
    • sparse:链接至稀疏BLAS SYCL库。
    • stats:链接至摘要统计量SYCL库。
    • vm:链接至向量数学(VM)SYCL库。
  • -qopt-dword-index-for-array-of-structs[=val]:允许编译器使用双字索引访问结构数组元素(该数组字节数不超过指定值)。val可为16或32。如未指定val,编译器将使用双字索引访问不超过16字节的结构体数组元素。
  • -qopt-dynamic-align-qno-opt-dynamic-align :启用或禁用动态数据对齐优化。
  • -qopt-for-throughput=value:根据程序运行于单任务或多任务模式,确定编译器如何针对吞吐量进行优化。value可为multi-job或single-job。
  • -qopt-matmul-qno-opt-matmul :启用或禁用编译器生成的矩阵乘法(matmul)库调用。
  • -qopt-mem-layout-trans=n-qno-opt-mem-layout-trans :控制编译器执行的内存布局转换级别。n可为:
    • 0:禁用内存布局转换。此设置等同于指定 -qno-opt-mem-layout-trans
    • 1:启用基本内存布局转换。
    • 2:启用更多内存布局转换。此设置等同于指定 -qopt-mem-layout-trans 且不带参数。
    • 3:启用更多内存布局转换,例如对代码区域的结构体进行复制进/复制出操作。此设置仅适用于目标系统中每个核心拥有超过4GB物理内存的情况。
    • 4:启用更激进的内存布局转换。此设置仅适用于目标系统中每个核心拥有超过4GB物理内存的情况。
  • -qopt-multiple-gather-scatter-by-shuffles-qno-opt-multiple-gather-scatter-by-shuffles :启用或禁用对多个相邻聚合/散发类型向量内存引用的优化。
  • -qopt-prefetch[=n]-qno-opt-prefetch :启用或禁用预取插入优化。n可为:
    • 0:禁用软件预取功能。相当于指定 -qno-opt-prefetch
    • 1至5:启用不同级别的软件预取功能。若未指定n的值,则默认采用 -qopt-prefetch=2 。使用较低数值可减少预取量。
  • -qopt-prefetch-distance[=n]:指定循环内部编译器生成预取操作所使用的预取距离。预取距离以(可能向量化的)迭代次数表示。可能值为非负数,且大于等于0。当n=0时,将关闭编译器发起的所有从内存到L1缓存的预取操作。
  • -qopt-prefetch-loads-only :指定编译器仅对循环内部的加载操作进行预取,忽略任何存储操作。
  • -qopt-streaming-stores[=keyword]-qno-opt-streaming-stores :启用流式存储优化生成。keyword可为:
    • always:启用流式存储生成以实现优化。编译器在假设应用程序受内存限制的前提下进行优化。当指定此选项设置时,您需自行插入必要的内存屏障(fences),以确保线程内部或跨线程的内存顺序正确。
    • never:禁用流式存储生成以实现优化。执行常规存储操作。此设置效果等同于指定 -qno-opt-streaming-stores
    • auto:由编译器自动决定使用何种指令。
  • -qopt-zmm-usage[=keyword]:定义ZMM寄存器使用级别。[=keyword]可为:
    • low:告知编译器编译后的程序不太可能从zmm寄存器的使用中获益。它指定编译器应避免使用zmm寄存器,除非能证明其使用能带来收益。
    • high:告知编译器无限制地生成zmm代码。
  • -qoverride-limits :允许您覆盖某些内部编译器限制,这些限制旨在防止超大、复杂编译单元出现过高的内存使用量或编译时间。
  • -reentrancy keyword-noreentrancy :指示编译器生成可重入代码以支持多线程应用程序。keyword可为:
    • none:告知运行时库(RTL)该程序不依赖于线程或异步重入机制。RTL不会在其自身关键区域内防范此类中断。与指定 -noreentrancy 效果相同。
    • async:告知运行时库(RTL)程序可能包含会调用RTL的异步处理程序(AST)。将导致RTL在其自身关键区域内防范AST中断。
    • threaded:告知运行时库(RTL)程序采用多线程模式,例如使用POSIX线程库的程序。将导致RTL使用线程锁定机制来保护其自身关键区域。
  • -safe-cray-ptr :告知编译器,Cray指针不会别名其他变量。
  • -unroll [=n]-funroll-loops :设置循环展开的最大层级[=n]
  • -vec-no-vec :启用或禁用循环向量化。
  • -vec-assume-index-overflow-no-vec-assume-index-overflow :在两种模式间切换,默认采用较不保守的模式。
  • -vec-threshold[=n]:为循环向量化设置阈值。n]是用于循环向量化的阈值整数,取值范围为0至100:
    • 0:无论计算工作量大小,循环始终进行向量化。
    • 100:仅当编译器分析数据预测性能提升时才进行向量化。只有在几乎确定能实现有利的向量级并行执行时,才会进行向量化。
    • 1至99:代表获益加速的概率百分比。如,n=50指示编译器仅在代码以向量形式执行时存在50%加速概率的情况下进行向量化。
  • -vecabi[=keyword]:确定编译器创建或调用向量函数时使用的向量函数应用二进制接口(ABI)。keyword可为:
    • cmdtarget:指示编译器生成扩展的向量函数集。针对编译器选项 -x 和/或 -ax 指定的所有目标,将创建向量变体。源代码无需修改。
    • gcc:指示编译器使用gcc向量函数ABI。

代码生成选项

  • -arch code:告知编译器其可支持的功能,包括可生成的指令集。code可为:
    • 各种CPU代号:ALDERLAKE、AMBERLAKE、ARROWLAKE、ARROWLAKE-S、BROADWELL、CANNONLAKE、CASCADELAKE、CLEARWATERFOREST、COFFEELAKE、COOPERLAKE、DIAMONDRAPIDS、EMERALDRAPIDS、GOLDMONT、GOLDMONT-PLUS、GRANDRIDGE、GRANITERAPIDS、GRANITERAPIDS-D、HASWELL、ICELAKE-CLIENT、ICELAKE、ICELAKE-SERVER、IVYBRIDGE、KABYLAKE、LUNARLAKE、PANTHERLAKE、ROCKETLAKE、SANDYBRIDGE、SAPPHIRERAPIDS、SIERRAFOREST、SILVERMONT、SKYLAKE、SKYLAKE-AVX512、TIGERLAKE、TREMONT、WHISKEYLAKE
    • COMMON-AVX512:生成Intel Advanced Vector Extensions 512 (Intel AVX-512)基础指令、Intel AVX-512 Conflict Detection Instructions(CDI),同CORE-AVX2启用的一样。
    • CORE-AVX512:生成Intel AVX-512基础指令、Intel AVX-512 CDI、Intel AVX-512 Doubleword and Quadword Instructions (DQI), Intel AVX-512 Byte and Word Instructions (BWI) and Intel AVX-512 Vector Length extensions等,同CORE-AVX2启用的一样。
    • CORE-AVX2:生成Intel AVX2、AVX、SSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3指令。
    • CORE-AVX-I:生成Float-16转换指令和RDRND(随机数)指令、Intel AVX、SSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3指令。
    • AVX:生成Intel AVX、SSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3指令。
    • SSE4.2:生成IntelSSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3指令。
    • SSE4.1:生成IntelSSE4.1、SSE3、SSE2、SSE和SSSE3指令
    • ATOM_SSE4.2、ATOM_SSSE3:针对Intel Atom处理器。
    • SSSE3:生成SSSE3指令和IntelSSE3、SSE2和SSE指令。
    • SSE3:生成IntelSSE3、SSE2和SSE指令。
  • -axcode:在有性能提高时,生成针对Intel处理器的多特征面向的自动调度代码路径。code可为:
    • 各种CPU代号:ALDERLAKE、AMBERLAKE、ARROWLAKE、ARROWLAKE-S、BROADWELL、CANNONLAKE、CASCADELAKE、CLEARWATERFOREST、COFFEELAKE、COOPERLAKE、DIAMONDRAPIDS、EMERALDRAPIDS、GOLDMONT、GOLDMONT-PLUS、GRANDRIDGE、GRANITERAPIDS、GRANITERAPIDS-D、HASWELL、ICELAKE-CLIENT、ICELAKE、ICELAKE-SERVER、IVYBRIDGE、KABYLAKE、LUNARLAKE、PANTHERLAKE、ROCKETLAKE、SANDYBRIDGE、SAPPHIRERAPIDS、SIERRAFOREST、SILVERMONT、SKYLAKE、SKYLAKE-AVX512、TIGERLAKE、TREMONT、WHISKEYLAKE
    • COMMON-AVX512:生成Intel Advanced Vector Extensions 512 (Intel AVX-512)基础指令、Intel AVX-512 Conflict Detection Instructions(CDI),同CORE-AVX2启用的一样。
    • CORE-AVX512:生成Intel AVX-512基础指令、Intel AVX-512 CDI、Intel AVX-512 Doubleword and Quadword Instructions (DQI), Intel AVX-512 Byte and Word Instructions (BWI) and Intel AVX-512 Vector Length extensions等,同CORE-AVX2启用的一样。
    • CORE-AVX2:生成Intel AVX2、AVX、SSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3指令。
    • CORE-AVX-I:生成Float-16转换指令和RDRND(随机数)指令、Intel AVX、SSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3指令。
    • AVX:生成Intel AVX、SSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3指令。
    • SSE4.2:生成IntelSSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3指令。
    • SSE4.1:生成IntelSSE4.1、SSE3、SSE2、SSE和SSSE3指令
    • ATOM_SSE4.2、ATOM_SSSE3:针对Intel Atom处理器。
    • SSSE3:生成SSSE3指令和IntelSSE3、SSE2和SSE指令。
    • SSE3:生成IntelSSE3、SSE2和SSE指令。
  • -fasynchronous-unwind-tables-fno-asynchronous-unwind-tables :确定在指令边界还是调用边界处,展开信息是否精确。
  • -fcf-protection[=keyword]:启用Intel控制流强制技术(Intel CET)保护功能,可防御利用漏洞实施的特定攻击。keyword可为:
    • return:启用影子堆栈保护。
    • branch:启用结束分支(EB)生成。
    • full:启用影子堆栈保护和结束分支(EB)生成。相当于指定此编译器选项时不带关键词。
    • none:禁用Intel CET保护。
  • -fexceptions-fno-exceptions :是否生成异常处理表。默认:对C不成生,对C++生成。
  • -fomit-frame-pointer-fno-omit-frame-pointer-fp :确定在优化过程中是否将EBP用作通用寄存器。
  • -mcode:需要生成基于CPUID比特微的目标特征的指令集扩展。该选项仅启用特定的基于CPUID比特位的指令集,如需要启用特定CPU架构的全部指令集,请采用 -march选项。
  • -m64 :生成Intel 64架构代码。该选项即将被废弃。
  • -m80387-mno-80387 :指定编译器是否可以使用x87指令。
  • -march=processor:生成支持某种处理器特定特征的代码。processor可为:
    • nocona、core2、penryn、bonnell、atom、silvermont、slm、goldmont、goldmont-plus、tremont、gracemont、nehalem、corei7、westmere、sandybridge、corei7-avx、ivybridge、core-avx-i、haswell、core-avx2、broadwell、common-avx512、skylake、skylake-avx512、skx、cascadelake、cooperlake、cannonlake、icelake- client、rocketlake、icelake-server、tigerlake、sapphirerapids、alderlake、raptorlake、meteorlake、sierraforest、grandridge、graniterapids、emeraldrapids
    • x86-64:生成针对具有64位通用扩展CPU的指令代码。
    • x86-64-v2:生成针对具有Intel SSE4.3、SSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3的CPU指令代码。
    • x86-64-v3:生成针对具有Intel AVX2、AVX、SSE4.3、SSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3的CPU指令代码。
    • x86-64-v4:生成针对具有Intel AVX-512基础指令、CDI、DQI、BWI和VLE的CPU指令代码。

    该选项默认不启用,编译器将生成Intel SSE2 and SSE指令。

  • -masm=dialect:指示编译器使用选定的方言生成汇编器输出文件。=dialect可为:
    • att:指示编译器使用AT&T语法生成汇编器输出文件。
    • intel:指示编译器使用Intel语法生成汇编器输出文件。
  • -mauto-arch=value:指示编译器为x86架构处理器生成多个特性特定的自动调度代码路径,以实现性能提升。 value是可为 -ax 选项中的值。
  • -mbranches-within-32B-boundaries-mno-branches-within-32B-boundaries :指示编译器将分支和融合分支对齐到32字节边界,以获得更佳性能。
  • -mintrinsic-promote :启用包含对需要特定CPU功能的内置函数调用的功能,使其目标架构自动提升以支持所需功能。
  • -momit-leaf-frame-pointer-mno-omit-leaf-frame-pointer :确定在叶函数中是否省略帧指针。
  • -mtune= processor:针对特定处理器优化,但不启用扩展的指令集(与 -march 不一样)。processor可为:
    • generic、alderlake、broadwell、cannonlake、cascadelake、cooperlake、goldmont、goldmont-plus、haswell、icelake-server、ivybridge、rocketlake、sandybridge、sapphirerapids、silvermont、skylake、skylake-avx512、tigerlake、tremont、core-avx2、core-avx-i、corei7-avx、corei7、atom、core2
  • -regcall :告知编译器,对于未直接指定调用约定的方法,应使用__regcall调用约定。
  • -xcode:告诉编译器何种处理器特性将成为目标,包含哪些指令集和优化将会产生。code可为:
    • 各种CPU代号:ALDERLAKE、AMBERLAKE、ARROWLAKE、ARROWLAKE-S、BROADWELL、CANNONLAKE、CASCADELAKE、CLEARWATERFOREST、COFFEELAKE、COOPERLAKE、DIAMONDRAPIDS、EMERALDRAPIDS、GOLDMONT、GOLDMONT-PLUS、GRANDRIDGE、GRANITERAPIDS、GRANITERAPIDS-D、HASWELL、ICELAKE-CLIENT、ICELAKE、ICELAKE-SERVER、IVYBRIDGE、KABYLAKE、LUNARLAKE、PANTHERLAKE、ROCKETLAKE、SANDYBRIDGE、SAPPHIRERAPIDS、SIERRAFOREST、SILVERMONT、SKYLAKE、SKYLAKE-AVX512、TIGERLAKE、TREMONT、WHISKEYLAKE
    • COMMON-AVX512:生成Intel Advanced Vector Extensions 512 (Intel AVX-512)基础指令、Intel AVX-512 Conflict Detection Instructions(CDI),同CORE-AVX2启用的一样。
    • CORE-AVX512:生成Intel AVX-512基础指令、Intel AVX-512 CDI、Intel AVX-512 Doubleword and Quadword Instructions (DQI), Intel AVX-512 Byte and Word Instructions (BWI) and Intel AVX-512 Vector Length extensions等,同CORE-AVX2启用的一样。
    • CORE-AVX2:生成Intel Advanced Vector Extensions 2 (Intel AVX2)、Intel AVX、SSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3指令。
    • CORE-AVX-I:生成Float-16转换指令和RDRND(随机数)指令、Intel AVX、SSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3指令。
    • AVX:生成Intel AVX、SSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3指令。
    • SSE4.2:生成IntelSSE4.2、SSE4.1、SSE3、SSE2、SSE和SSSE3指令。
    • SSE4.1:生成IntelSSE4.1、SSE3、SSE2、SSE和SSSE3指令
    • ATOM_SSE4.2、ATOM_SSSE3:针对Intel Atom处理器。
    • SSSE3:生成SSSE3指令和IntelSSE3、SSE2和SSE指令。
    • SSE3:生成IntelSSE3、SSE2和SSE指令。
  • -xHost :生成进行编译时所用的主机处理器能支持的最高指令集。

卸载编译、OpenMP和并行处理选项

  • -device-math-lib=library-no-device-math-lib=library:是否启用某些设备数学库,library:可为fp32或fp64,如想都链接则 -device-math-lib=fp32,fp64 。默认fp32与fp64都启用。
  • -fiopenmp :启用对OpenMP功能(如parallel、simd和offloading指令)的识别,并指示并行化器根据OpenMP指令生成多线程代码。此选项是 -qopenmp 的别名。默认不启用。

    备注

    • -fiopenmp-fopenmp 不一样。
    • 卸载到特定GPU,必需声明选项 -fopenmp-targets
  • -fopenmp :启用对OpenMP特性的识别,并指示并行化器根据OpenMP指令生成多线程代码。此选项会在编译器前端(由LLVM社区实现)进行OpenMP构造的编译器优化,其性能表现预计将逊于使用 -fiopenmp 选项——后者启用Intel实现的OpenMP构造,优化操作在编译器后端完成。此外,此选项不支持向GPU卸载计算任务。
  • -qopenmp-qno-openmp :是否启用对OpenMP特性的识别,如parallel、simd和offloading指令,并指示并行化器根据OpenMP指令生成多线程代码。此选项是 -fiopenmp 的别名。默认为 -qno-openmp
  • -flink-huge-device-code :指示编译器将设备代码放置在链接二进制文件的末尾。当设备代码大于2GB时,此操作可避免相邻可执行文件与可链接格式(ELF)段之间发生32位程序计数器相对重定位。
  • -fopenmp-fno-openmp :启用对OpenMP特性的识别,并指示并行化工具根据OpenMP指令生成多线程代码。
  • -fopenmp-concurrent-host-device-compile :在执行OpenMP卸载编译时启用主机与目标编译步骤的并行编译。此为实验性功能。
  • -fopenmp-declare-target-scalar-defaultmap :确定在目标指令中引用的标量变量应应用哪些隐式数据映射/共享规则。
  • -fopenmp-default-allocator[=keyword]:告知编译器所有ALLOCATE语句都应被视为其前存在显式OpenMP ALLOCATE指令。
  • -fopenmp-device-code-split :启用OpenMP卸载提前编译中SPIR-V内核的并行编译。
  • -fopenmp-device-lib :启用或禁用OpenMP目标的特定设备库。
  • -fopenmp-device-link :决定编译器是否在编译阶段执行设备链接而非链接阶段。启用后,在OpenMP卸载编译中会在生成的胖对象中生成设备二进制文件。
  • -fopenmp-do-concurrent-maptype-modifier[=modifier]:允许您指定在自动卸载时,DO CONCURRENT区域内部引用的变量的数据移动方式。[=modifier]可为:
    • always:告知编译器数据必须在设备间进行传输。
    • present:告知编译器数据已存在于设备中,无需额外传输。
    • none:告知编译器若运行时无法确定数据是否已存在,则需将数据传输至设备后再返回。此为未指定修饰符时的默认行为。
  • -fopenmp-max-parallel-link-jobs :确定设备链接阶段(适用时)可执行的并行操作最大数量。
  • -fopenmp-offload-mandatory :指示编译器仅生成OpenMP目标区域的设备版本。
  • -fopenmp-target-buffers :提供解决方法,避免当目标对象大于4GB时某些OpenMP卸载SPIR-V设备生成错误代码的问题。
  • -fopenmp-target-default-sub-group-size :允许全局指定默认子组大小,用于生成基于SPIR64设备的OpenMP目标构造时生成的单程序多数据(SPMD)内核。
  • -fopenmp-target-do-concurrent-fno-openmp-target-do-concurrent :确定是否将DO CONCURRENT结构自动转换为OpenMP TARGET区域。
  • -fopenmp-target-loopopt :启用循环优化器和自动向量化功能,用于OpenMP卸载设备编译,当选项级别设置或指定为O2或更高时生效。
  • -fopenmp-target-simd :启用OpenMP SIMD循环向量化功能,用于OpenMP卸载设备编译,当选项级别设置或指定为O2或更高时生效。
  • -fopenmp-target-teams-default-vla-alloc-mode :设置是否可更改OpenMP团队和分布式结构中私有化子句(private、firstprivate等)指定的可变长度/预设尺寸数组的本地副本默认分配方式。
  • -fopenmp-targets :启用OpenMP功能时,允许卸载至指定GPU目标。
  • -fsycl :使程序以SYCL程序而非普通C++11程序形式编译。
  • -fsycl-dead-args-optimization :启用消除SYCL死内核参数的功能。
  • -fsycl-device-code-split :指定SYCL设备代码模块的汇编。
  • -fsycl-device-lib :启用或禁用SYCL目标的特定设备库。
  • -fsycl-instrument-device-code :启用或禁用为VTune链接仪器与追踪技术(ITT)设备库的功能。
  • -fsycl-targets :指示编译器为指定设备目标生成代码。此选项仅适用于链接基于SYCL的对象。
  • -ftarget-compile-fast :指示编译器执行较不激进的优化,以牺牲生成目标代码的优化程度为代价缩短编译时间。此为实验性功能。
  • -ftarget-register-register-alloc-mode :为特定硬件指定寄存器分配模式,供支持的目标后端使用。
  • -nolibsycl :禁用SYCL运行时库的链接。
  • -qopenmp :启用对OpenMP特性的识别(如parallel、simd和offloading指令),并指示并行化器根据OpenMP指令生成多线程代码。此选项是编译器参数 -fiopenmp 的别名。
  • -qopenmp-link :控制编译器链接静态或动态OpenMP运行时库。
  • -qopenmp-simd :启用或禁用OpenMP SIMD编译。
  • -qopenmp-stubs :启用OpenMP程序的顺序模式编译。
  • -Xopenmp-target :启用向OpenMP目标设备编译工具链中指定工具传递选项的功能。
  • -Xsycl-target :启用向设备编译工具链中的指定工具传递选项的功能,适用于SYCL目标。

过程间优化选项

  • -flto[=arg]-fno-lto :是否启用整个程序链接时优化(link time optimization,LTO)。arg可为:
    • full:编译器将在ITP前合并所有输入文件为单个模块。如启用了 -flto ,该参数为默认参数。
    • thin:编译器将从摘要中读取信息,然后并行执行LTO。
  • -ipo[n]-no-ipo :是否在多文件中进行过程间优化,非负整数n为可生成的对象文件数。

性能分析引导优化

  • -finstrument-functions-fno-instrument-functions :确定常规入口和出口点是否已实现插桩化。
  • -fprofile-ml-use :启用预训练的机器学习模型以用于预测分支执行概率驱动PGO。该选项即将废弃。

优化报告选项

  • -qopt-report[=arg]:设定显示优化报告信息的级别,为每个对象文件生成一个对应的文件。arg为0(不显示)到5(最详细)。
  • -qopqopt-report-file=keyword:设定报告文件名。keyword可为:
    • filename:保存输出的文件名。
    • stderr:输出到标准错误输出。
    • stdout:输出到标准输出。
  • -qopt-report-names=keyword:是否在优化报告中显示重整的或未重整的名字。keyword可为:mangled和unmangled。
  • -qopt-report-phase :对生成的优化报告指明一个或多个优化阶段。phase可为:cg、ipo、loop、openmp、par、pgo、tcollect、vec和all等。
  • -qopt-report-stdout :设定是否生成的报告是否直接输出在标准输出。

浮点数选项

  • -ffp-accuracy=value:设定针对浮点数操作及调用所需要的浮点数精度。value可为:
    • high:设置错误数最大为1个ulp(units in the last place)
    • medium:设置错误数最大为4个ulp
    • low:错误数最大为针对单精度函数11个比特精度(约9192个ulp)及针对双精度函数为26个比特精度
    • sycl:由OpenCL规范决定数学函数精度
    • cuda:由CUDA规范决定数学函数精度
  • -fimf-absolute-error=value[:funclist]:定义数学库函数结果的最大允许绝对误差。
    • value:是一个正浮点数。如果绝对误差小于或等于值,则数学库函数结果中的误差可能会超过最大相对误差(max-error)设置。格式为[digits] [.digits] [ { e | E }[sign]digits]
    • funclist:是一个或多个应应用该属性的数学库函数的可选列表。如果指定多个函数,则必须用“,”分隔。

    如: -fimf-absolute-error=0.00001:sin,sinf

  • -fimf-accuracy-bits=bits[:funclist]:定义数学函数返回值的相对误差,包含除法及开方。bits为正浮点数,指明编译器应该使用的正确位数,funclist为函数名列表。如: -fimf-accuracy-bits=23:sin,sinf 。bits与ulps之间的变换关系为:\(ulps=2^{p-1-bits}\),其中p为目标格式尾数bits的位数(对应单精度、双精度和长双精度分别为23、53和64)。
  • -fimf-arch-consistency=value[:funclist]
  • -fimf-domain-exclusion=classlist[:funclist]:设定数学函数必须提供正确结果的输入参数域。如: -fimf-domain-exclusion=23:log,logf,/,sin,cosf
  • -fimf-max-error=ulps[:funclist]:定义对于数学函数返回值的最大允许相对误差,包含除法及开方。value为正浮点数,指定编译器可以使用的最大相对误差,funclist为函数名列表,如: -fimf-max-error=4.0:sin,sinf
  • -fimf-precision[=value[:funclist]]:当设定使用何种数学库函数时,定义编译器应该使用的精度。value可为:
    • high:等价于 -fimf-max-error=1.0
    • medium:等价于 -fimf-max-error=4
    • low:等价于 -fimf-accuracy-bits=11 (对单精度)和 accuracy-bits=26 (对双精度)

    funclist为函数名列表,如: -fimf-precision=high:sin,sinf

  • -fimf-use-svml=value[:funclist]:指示编译器使用短向量数学库(SVML)而不是Intel oneAPI DPC++/C++编译器数学库(LIBM)来实现数学库函数。
  • -fma-no-fma :是否对存在融合乘加(fused multiply-add,FMA)的目标处理器启用融合乘加。此选项只有在 -x-march 参数设定CORE-AVX2或更高时才有效。
  • -fltconsistency-nofltconsistency :启用改进的浮点一致性。
  • -fp-model keyword:控制浮点计算的语义,keyword可为:
    • precise:取消浮点数据的非值安全优化。
    • fast[=1|2]:对浮点数据启用更加激进的优化。
    • consistent:禁用对浮点数据不值安全的优化,禁用收缩(FMA),并选择能在相同架构的不同微架构实现中产生一致结果的数学库函数。
    • strict:启用精确模式,禁用缩写,并启用#pragma stdc fenv_access。
  • -fpen:允许在运行时对主程序的浮点异常处理进行部分控制。n可为:
    • 0:当主程序使用此值编译时,整个应用程序中将启用浮点无效、除以零和溢出异常。若发生此类异常,程序执行将终止。此选项会将次常数浮点结果设为零。下溢结果同样会被设为零,除非您通过显式指定选项 -no-ftz-fp-model precise 覆盖此行为。

      SSE指令与x87指令产生的下溢结果均将归零。相比之下,选项 -ftz 仅将SSE下溢结果设为零。

      为使用 -fpe0 编译的程序单元设置选项 -fp-speculation=strict 。此设置在浮点运算的投机执行可能导致浮点异常(若无投机执行则不会发生)的情况下禁用特定优化。如,这可能阻止对包含条件语句的某些循环进行向量化处理。

      禁用某些会调用短向量数学库的优化操作,这些操作在极端输入参数下可能引发浮点异常(若改用libm则不会发生)。例如,这可能阻止对包含超越数学函数调用的某些循环进行向量化处理。

      要获取更详细的错误发生位置信息,请使用 -traceback 选项。

    • 1:所有浮点异常均已禁用。SSE指令及x87指令产生的下溢结果将被设置为零。
    • 3:所有浮点异常均已禁用。浮点下溢将逐步发生,除非您显式指定启用清零的编译器选项(如 -ftz-O3-O2 )。此设置提供完整的IEEE支持。
  • -fp-speculation=mode:设定推测浮点操作时使用的模式。mode可为:
    • fast:让编译器推测浮点操作。
    • safe:让编译器在推测浮点操作有可能存在浮点异常时停止推测。
    • strict:让编译器禁止浮点操作时推测。
  • -fpe-all=n:允许在运行时对程序中每个例程的浮点异常处理进行一定程度的控制。n可为:
    • 0:启用浮点无效、除以零和溢出异常。若发生此类异常,则终止执行。此选项设置 -ftz 选项;因此除非显式指定 -no-ftz ,否则下溢结果将被设为零。要获取更详细的错误发生位置信息,请使用 -traceback 选项。
    • 1:禁用所有浮点异常。SSE指令及x87指令导致的下溢结果将被设为零。
    • 3:禁用所有浮点异常。浮点下溢将逐步发生,除非显式启用清零编译器选项(如 -ftz-O3-O2 )。此设置提供完整的IEEE标准支持。
  • -ftz :将非规范化结果清为0。
  • -pc n:启用浮点数有效数字精度的控制。n可为:
    • 32:四舍五入尾数到24位(单精度)。
    • 64:四舍五入尾数到53位(双精度)。
    • 80:四舍五入尾数到64位(扩展精度)。
  • -prec-div-no-prec-div :提高浮点除法的精度。
  • -recursive-norecursive :告知编译器所有例程都应为可能的递归执行进行编译。

内联选项

  • -finline-fno-inline :是否对__inline声明的函数进行内联并执行C++内联。
  • -finline-functions-fno-inline-functions :对单个文件编译时启用函数内联。
  • -inline-forceinline :指示编译器将内联例程视为强制内联。
  • -inline-level=n:指定内联函数展开的级别。n可为0、1、2。

输出、调试及预编译头文件选项

  • -c :仅编译成对象文件( .o 文件)。
  • -debug [keyword]:设定是否生成调试信息。keyword可为:
    • none:不生成调试信息。
    • full或all:生成完全调试信息。
    • minimal:生成最少调试信息。
    • emit_column:生成用于调试的列号信息。
    • extended:设定关键字值semantic-stepping和variable-locations。
    • parallel:设定编译器生成并行调试代码指令以有助于线程数据共享和可重入调用探测。
  • -debug-parameters [keyword]-nodebug-parameters :指示编译器为程序中使用的PARAMETER生成调试信息。[keyword]可为:
    • none:不为程序中使用的任何参数生成调试信息。与指定 -nodebug-parameters 相同。
    • used:仅为程序中实际被引用的参数生成调试信息。若未指定关键字,为默认行为。
    • all:为程序中定义的所有参数生成调试信息。
  • -Fa[filename|dir]:指定应生成一个程序汇编列表文件。filename:汇编列表文件名;dir:目录名。
  • -fmerge-debug-strings-fno-merge-debug-strings :使编译器将调试信息中使用的字符串进行池化。
  • -ftrapuv :将栈局部变量初始化为异常值,以辅助错误检测。
  • -fverbose-asm-fno-verbose-asm :生成包含编译器注释的程序集列表,其中包含选项和版本信息。
  • -g[n]:包含调试信息。n为生成的调试信息级别,可为:
    • 0:禁止生成符号调试信息。
    • 1:生成用于执行堆栈跟踪的最小调试信息。
    • 2:生成完整的调试信息。相当于指定 -g 选项而不带n参数。
    • 3:生成额外信息,这些信息可能对某些工具有用。
  • -gdwarf-n:设定生成调试信息时的DWARF版本号,n可为2、3、4、5。
  • -grecord-gcc-switches :将用于调用编译器的命令行选项附加到DWARF调试信息中的DW_AT_producer属性。
  • -gsplit-dwarf :创建一个单独的对象文件,其中包含DWARF调试信息。
  • -list[=filename]-nolist :指示编译器为源文件生成列表。
  • -list-line-len=* n*:指定使用list选项时生成的列表的行长度。默认为80。
  • -list-page-len :指定使用list选项时生成的列表的页长度。默认为每页60行。
  • -o file :指定生成的文件名。
  • -show keyword[, keyword...]:控制指定选项列表时生成的列表内容。[keyword]可为:
    • [no]include:控制生成列表时是否包含通过INCLUDE语句添加的文件内容。
    • [no]map:控制生成列表时是否包含带行号交叉引用的符号列表(每个例程对应一份)。
    • [no]options:控制生成列表时是否包含编译过程中使用的编译器选项列表。
  • -S :设定编译器只是生成汇编文件但并不进行链接。
  • -use-msasm :允许在C或C++文件中使用汇编代码的块和完整函数。

预处理选项

  • -Bdir:设定头文件、库文件及可执行文件的搜索路径。
  • -Dname[=value]:设定编译时的宏及其值。
  • -d-lines-nod-lines :是否启用编译调试语句。
  • -E :设定预处理时输出到标注输出。
  • -EP :设定预处理时输出到标注输出,忽略#line指令。
  • -fpp-nofpp :在编译前对源文件运行Fortran预处理器。
  • -fpp-name=name:允许您指定用于Fortran的替代预处理器。
  • -gen-dep[=filename]-no-gen-dep :指示编译器为当前编译生成构建依赖关系。filename为输出文件的名称,可包含路径。
  • -gen-depformat=form:指定在指定选项 -gen-dep 时生成的输出形式。form可为make或nmake。
  • -gen-depshow=keyword:确定某些功能是否被排除在依赖分析之外。目前仅适用于内置模块。
  • -I :设定头文件附加搜索路径。
  • -idirafterdir:设定dir路径到第二个头文件搜索路径中(在 -I 之后)。
  • -isystem dir:附加dir目录到系统头文件的开始。
  • -module dir:指定模块文件创建时应放置的位置,以及搜索这些文件时应查找的目录。
  • -preprocess-only :使Fortran预处理器将输出发送到文件,但源文件不被编译。
  • -Uname:取消某个预定义的宏。
  • -undef :取消所有预定义的宏。
  • -X :从搜索路径中去除标准搜索路径。

组件控制选项

  • -Qinstall dir:指定编译器安装的根目录dir
  • -Qlocation ,string,dir:指定辅助工具的目录。
    • string:工具名,可为:
      • f:指示Intel Fortran编译器
      • fpp:指示编译器的预处理器
      • asm:指示汇编器
      • as:指示汇编器
      • gas:指示GNU链接器
      • link:指示链接器
      • ld:指示加载器
      • gld:指示GNU加载器
      • lib:指示特定库
      • crt:指示链接到可执行文件中的 crt%.o 文件包含开始执行的位置
  • -Qoption,string,options :将选项传递给指定工具。
    • string:工具名,可为:
      • cpp:指示编译器的预处理器
      • c:指示Intel oneAPI DPC++/C++编译器
      • asm:指示汇编器
      • as:指示汇编器
      • gas:指示GNU链接器
      • link:指示链接器
      • ld:指示加载器
      • gld:指示GNU加载器
      • lib:指示特定库
      • crt:指示链接到可执行文件中的 crt%.o 文件包含开始执行的位置
    • options:以“,”分隔的传递给他工具的选项

语言选项

  • -allow keyword:决定编译器是否允许某些行为。keyword可为[no]fpp_comments,决定fpp预处理器如何处理预处理指令行中的Fortran行尾注释。
  • -altparam-noaltparam :允许在PARAMETER语句中使用替代语法(不带括号)。
  • -assumekeyword[, keyword...]:指示编译器进行特定假设。keyword[, keyword...]可为:
    • [no]assume_all:禁用所有默认选项。
    • [no]bscc:决定反斜杠字符在字符字面量中是否按C语言风格控制字符语法处理。
    • [no]buffered_io:决定数据是立即读写到磁盘还是累积在缓冲区中。对于可变长度、无格式文件,决定数据在输入时是否缓冲,或直接从磁盘读取到用户变量。
    • [no]buffered_stdout:决定数据是否立即写入标准输出设备,或累积在缓冲区中。
    • [no]byterecl:决定在未格式化文件中,OPEN语句的RECL(记录长度)指定符值采用字节还是长字(四字节单位)作为单位。
    • [no]cc_omp:决定是否启用或禁用OpenMP Fortran API定义的条件编译功能。
    • [no]contiguous_assumed_shape:决定是否假定假设形状的虚拟参数具有连续性。
    • [no]contiguous_pointer:决定是否假定指针具有连续性。
    • [no]dummy_aliases:决定编译器是否假定过程的虚拟参数与其他虚拟参数或已赋值的COMMON变量共享内存位置。
    • [no]failed_images:决定运行时系统在执行未带STAT=指定符的映像控制语句时,或执行未指定STAT参数的MOVE_ALLOC调用、集体子程序或原子子程序时,是否检查映像组中的失败映像。
    • [no]fpe_summary:确定在遇到STOP或ERROR STOP语句时是否显示浮点异常摘要。
    • [no]ieee_compares:确定浮点比较运算是否作为IEEE信号运算执行。
    • [no]ieee_fpe_flags:决定是否在例程入口处保存浮点异常和状态标志,并在例程退出时恢复。
    • [no]ieee_mode_restore:决定当过程更改浮点模式时,是否在过程调用点保存和恢复IEEE浮点模式。
    • [no]inline_cloc:决定在内置模块ISO_C_BINDING中对C_LOC函数的调用是否被视为外部模块过程调用,或者是否为其生成内联代码。
    • [no]minus0:决定编译器在SIGN内置函数中处理-0.0和+0.0为0.0时采用Fortran 2003还是Fortran 90/77标准语义,以及在格式化输出中如何写入该值。
    • [no]nan_compares:决定是否生成涉及NaN的浮点比较操作代码,或因编译器假设不会遇到NaN而生成更快的代码序列。
    • [no]old_boz:决定在内置函数INT、REAL、DBLE和CMPLX中,二进制、八进制和十六进制常量参数是否被视为带符号整数常量。
    • [no]old_e0g0_format:决定是否采用Fortran 2018规则格式化具有G0.0、E0或ES0格式编辑描述符的浮点数。
    • [no]old_inquire_recl:决定INQUIRE语句中RECL=指定符对未连接单元或连接为流访问的单元的取值。在Fortran 2018之前,此行为未定义。Fortran 2018规定:若文件未连接,RECL=指定符中的标量整型变量取值为-1;若文件连接用于流访问,则取值为-2。
    • [no]old_ldout_format:决定列表导向输出和名称列表导向输出中整型与实型值的输出格式。
    • [no]old_ldout_zero:决定列表导向输出中浮点零的表示格式。 -old_ldout_zero 采用指数格式; -noold_ldout_zero 采用分数格式。
    • [no]old_logical_assign:确定在赋值语句中,逻辑值赋给数值变量以及数值赋给逻辑变量的行为。
    • [no]old_logical_ldio:确定名称列表和列表引导输入是否接受逻辑值作为数值输入输出列表项,以及数值作为逻辑输入输出列表项。
    • [no]old_maxminloc:决定内置函数MAXLOC和MINLOC在接收空数组作为参数或掩码所有元素为假时的返回结果。
    • [no]old_unit_star:决定单位*是否与单位5和6等同,或具有独立含义。
    • [no]old_xor:决定编译器是否将.XOR.定义为内置运算符。
    • [no]protect_allocates:决定是否使用关键段保护ALLOCATE语句的内存分配请求,以避免多线程环境中的随机时序问题。
    • [no]protect_constants:决定向被调用例程传递常量实际参数还是其副本。
    • [no]protect_parens:决定优化器在评估REAL和COMPLEX表达式时是否尊重括号,即不重新关联运算符。
    • [no]realloc_lhs:决定编译器在解释赋值语句时采用当前Fortran标准规则还是旧版Fortran 2003规则。
    • [no]recursion:决定程序默认是否支持递归编译。
    • [no]source_include:决定编译器在默认目录还是源文件所在目录中搜索USE模块和INCLUDE文件。
    • [no]std_expon_output:决定当浮点数使用格式编辑描述符E、EN、ES、EX或D输出,且字段宽度为零时,若该数的指数绝对值在0-99范围内,是否省略指数字母E。
    • [no]std_intent_in:决定编译器是否遵循Fortran标准,假定被调用过程中的INTENT(IN)属性虚拟参数在调用过程中不被修改。
    • [no]std_minus0_rounding:决定是否在输出时为非零但四舍五入为零的负值添加负号。
    • [no]std_mod_proc_name:决定是否允许模块过程名称与用户外部符号名称冲突。
    • [no]std_value:决定VALUE属性是否产生如下效果:实际参数被赋值给一个临时变量,该临时变量随后传递给被调用过程,从而使后续对虚拟参数值的修改不影响实际参数,符合Fortran标准。
    • [no]underscore:决定编译器是否在外部用户定义名称后附加下划线字符。
    • [no]2underscores:决定编译器是否在外部用户定义名称后附加两个下划线字符。
    • [no]writeable-strings:决定字符常量是否存入非只读内存。
  • -ccdefaultkeyword:指定文件在终端屏幕显示时使用的换行控制类型。keyword可为:
    • none:指示编译器不使用换行控制处理。
    • default:指示编译器使用默认换行控制设置。
    • fortran:指示编译器使用标准Fortran对首字符的解释。例如,字符0将导致在记录前输出空行。
    • list:指示编译器在记录间输出一个换行符。
  • -check [keyword[, keyword...]]:在运行时检查特定条件。keyword可为:
    • none:禁用所有检查选项。
    • [no]arg_temp_created:确定是否对在例程调用前复制到临时存储区的实际参数进行检查。
    • [no]assume:确定是否检查ASSUME指令中的标量逻辑表达式是否为真,或ASSUME_ALIGNED指令中的地址是否对齐到指定的字节边界。
    • [no]bounds:决定是否对数组下标和字符子字符串表达式进行检查。
    • [no]contiguous:决定编译器是否在指针赋值时检查指针连续性。
    • [no]format:决定是否对输出格式化项的数据类型进行检查。
    • [no]output_conversion:决定是否检查数据项在指定格式描述符字段中的适配性。
    • [no]pointers:决定是否检查某些未关联或未初始化的指针,以及未分配的可分配对象。
    • [no]shape:决定是否执行数组符合性检查。
    • [no]stack:决定是否检查栈帧。
    • [no]teams:决定运行时系统是否诊断非标准协同数组团队的使用情况。
    • [no]udio_iostat:决定在执行用户定义的派生类型输入/输出例程时是否进行符合性检查。
    • [no]uninit:决定是否检查未初始化变量。
    • all:启用所有检查选项。
  • -extend-source[size]:指定固定格式源文件中语句字段的长度。size可为72、80、132。
  • -fixed-nofixed :指定源文件采用固定格式。
  • -free-nofree :指定源文件采用自由格式。
  • -fsanitize=sanitizer:启用指定代码净化器以在运行时检测特定问题。=sanitizer可为:
    • address:检测缓冲区溢出/下溢及内存泄漏。
    • memory:检测未初始化变量。内存检查器要求所有代码(动态或静态链接的库代码)均需经过检查,否则用户代码或库代码中可能出现误报。此设置等同于指定选项 -check uninit
    • thread:检测多线程程序中的数据竞争。
  • -names keyword:指定源代码标识符和外部名称的解析方式。keyword可为:
    • lowercase:使编译器忽略标识符中的大小写差异,并将外部名称转换为小写。
    • uppercase:使编译器忽略标识符中的大小写差异,并将外部名称转换为大写。
    • as_is:使编译器区分标识符的大小写差异,并保留外部名称的大小写。
  • -pad-source-nopad-source :指定固定格式源记录的填充规则,比语句字段宽度短的固定格式源行是否将在语句字段的末尾填充空格。
  • -stand [keyword]:指示编译器对非标准语言元素输出编译时信息。keyword可为:none、f90、f95、f03、f2003、f08、f2008、f18、f2018、f23、f2023。
  • -standard-realloc-lhs-nostandard-realloc-lhs :决定编译器解析赋值语句时采用当前Fortran标准规则还是旧版Fortran 2003规则。
  • -standard-semantics :决定编译器是否完全实现当前Fortran标准的行为规范。
  • -syntax-only :指示编译器仅检查语法正确性,不会进行编译生成代码。
  • -wrap-margin-no-wrap-margin :提供禁用Fortran列表导向输出中右边距换行的方法。

数据选项

  • -align [keyword[, keyword...]]-noalign :告知编译器如何对齐特定数据项。keyword可为:
    • none:防止在公共块和结构体中填充任何位置的填充字节。
    • arraynbyte:指定数组的起始边界。
    • [no]commons:影响公共块实体的对齐方式。
    • [no]dcommons:影响公共块实体的对齐方式。
    • [no]qcommons:影响公共块实体的对齐方式。
    • [no]zcommons:影响公共块实体的对齐方式。
    • [no]records:影响派生类型组件及记录结构字段的对齐。
    • recnbyte:为派生类型组件及记录结构字段指定大小边界。
    • [no]sequence:影响序列化派生类型组件的对齐。
    • all:在通用块和结构中的数据项处尽可能添加填充字节。
  • -auto-noauto :导致所有本地、未保存(无SAVE属性)的变量被分配到运行时堆栈。
  • -auto-scalar :使未带SAVE属性的内置类型INTEGER、REAL、COMPLEX和LOGICAL标量变量分配至运行时堆栈。此选项已弃用,未来版本可能移除。
  • -convert keyword:指定包含数值数据的未格式化文件格式。keyword可为:
    • native:指定未格式化数据不应进行转换。
    • big_endian:指定整数数据采用大端序格式,实数和复数数据采用大端序IEEE浮点格式。
    • cray:指定整数数据采用大端序格式,实数和复数数据采用CRAY浮点格式。
    • fdx:指定整数数据采用小端序格式,实数和复数数据采用VAX处理器浮点格式F_floating、D_floating及IEEE二进制128格式。
    • fgx:指定整数数据采用小端序格式,实数和复数数据采用VAX处理器浮点格式F_floating、G_floating及IEEE二进制128格式。
    • ibm:指定整数数据采用大端序格式,实数和复数数据采用IBM* System370浮点格式。
    • little_endian:指定整数数据采用小端序格式,实数和复数数据采用小端序IEEE浮点格式。
    • vaxd:指定整数数据采用小端序格式,实数和复数数据采用VAX*处理器浮点格式F_floating、D_floating和H_floating。
    • vaxg:指定整数数据采用小端序格式,实数和复数数据采用VAX处理器浮点格式F_floating、G_floating和H_floating。
  • -double-size :指定双精度数值(DOUBLE PRECISION)及双精度复数(DOUBLE COMPLEX)声明、常量、函数和内置函数的默认KIND类型。
  • -dyncom "common1,common2,...":启用运行时公共块(common)动态分配功能。common1等是common块名。
  • -falign-functions[=n]-fno-align-functions :指示编译器将过程对齐至最佳字节边界。n是可选的正整数标量初始化表达式,表示最小对齐边界的字节数。它指示编译器将过程对齐到2的幂次字节边界。若未指定n,编译器将过程起始点对齐到16字节边界。n必须是小于等于4096的正整数。若指定的值不是2的幂,则n将被向上舍入至最接近的2的幂。例如,若将n设为23,则程序将对齐到32字节边界。
  • -fmaintain-32-byte-stack-align-fno-maintain-32-byte-stack-align :指示编译器:若外部链接函数栈对齐状态不确定则重新对齐至32字节,其他函数保持32字节对齐。
  • -fmath-errno-fno-math-errno :告知编译器:调用标准数学库函数后可可靠检测errno状态。
  • -fpconstant-nofpconstant :指示编译器将赋值给双精度变量的单精度常量按双精度进行计算。
  • -fpic-fno-pic :决定编译器是否生成位置无关代码。选项 -fpic 指定完全符号预占用。全局符号定义及全局符号引用默认具有可预占用的可见性,除非另有明确指定。构建共享对象时必须使用选项 -fpic 。此选项也可指定为 -fPIC
  • -fpie :指示编译器生成位置无关代码。生成的代码仅可链接至可执行文件。它类似于 -fpic ,但由 -fpie 生成的代码只能链接到可执行文件中。由于该对象被链接到可执行文件中,此选项能更好地优化某些符号引用。为确保运行时库能正确配置于可执行文件,您还应在链接命令行中向编译器驱动程序指定 -pie 选项。 -fpie 选项也可写为 -fPIE
  • -fstack-protector[-keyword]-fno-stack-protector[-keyword]:启用或禁用栈溢出安全检查。
  • -fstack-security-check-fno-stack-security-check :决定编译器是否生成检测某些缓冲区溢出的代码。
  • -fstrict-overflow-fno-strict-overflow :决定是否为采用二进制补码表示法的有符号加法、减法和乘法溢出启用严格溢出保护。
  • -fvisibility=keyword-fvisibility -keyword=filename:指定全局符号的默认可见性或文件内符号的可见性。filename为包含要设置可见性的符号列表的文件的路径名。符号之间必须用空白符(空格、制表符或换行符)分隔。keyword可为:
    • default:将可见性设置为默认。
    • extern:将可见性设置为外部。
    • hidden:将可见性设置为隐藏。
    • internal:将可见性设置为内部。
    • protected:将可见性设置为受保护。
  • -fzero-initialized-in-bss-fno-zero-initialized-in-bss :决定编译器是否将显式初始化为零的变量放置在DATA段。
  • -init=keyword [, keyword ]:允许将某类变量初始化为零或特定数值异常值。
    • [no]arrays:决定编译器是否初始化数组或标量变量。指定arrays将初始化数组或标量变量。指定noarrays或既不指定arrays也不指定noarrays时,仅初始化标量变量。指定关键词noarrays时,还必须至少指定另一个关键词。
    • huge或minus_huge:同时决定以下两项:
      • 编译器是否将所有未初始化的保存变量、局部变量、自动变量或分配变量(其内在类型为REAL或COMPLEX)初始化为可表示的最大正/负实数值
      • 编译器是否将所有未初始化的保存变量、局部变量、自动变量或分配变量(其内在类型为INTEGER)初始化为可表示的最大正/负整数值
    • infinity 或 minus_infinity:决定编译器是否将所有保存、局部、自动或分配的未初始化REAL或COMPLEX内置类型变量初始化为正/负无穷大。
    • [no]snan:决定编译器是否将所有保存、局部、自动或分配的未初始化REAL或COMPLEX内置类型变量初始化为信号性NaN。
    • tiny 或 minus_tiny:决定编译器是否将所有未初始化的内置类型REAL或COMPLEX变量(包括保存变量、局部变量、自动变量或分配变量)初始化为可表示的最小正/负实数值。
    • [no]zero:决定是否确定编译器是否将所有未初始化的内置类型REAL、COMPLEX、INTEGER或LOGICAL的保存变量、局部变量、自动变量或分配变量初始化为零。选项 -init=[no]zero 替代选项 -[no]zero
  • -intconstant-nointconstant :指示编译器采用FORTRAN 77语义确定整数常量的KIND参数。
  • -integer-size size:指定整型和逻辑变量的默认KIND。
    • integer-size 16:使默认整型和逻辑型声明、常量、函数及内置函数长度为2字节。INTEGER和LOGICAL声明被视为(KIND=2)。未指定KIND的整型和逻辑型常量分别按INTEGER(KIND=2)和LOGICAL(KIND=2)进行评估。
    • integer-size 32:将默认整型和逻辑型声明、常量、函数及内置函数设为4字节长度。INTEGER和LOGICAL声明均按(KIND=4)处理。未指定KIND的整型和逻辑常量将分别按INTEGER(KIND=4)和LOGICAL(KIND=4)进行评估。
    • integer-size 64:使默认整型和逻辑型声明、常量、函数及内置函数长度为8字节。INTEGER和LOGICAL声明均按(KIND=8)处理。未指定KIND的整型和逻辑常量将分别按INTEGER(KIND=8)和LOGICAL(KIND=8)进行评估。
  • -mcmodel=mem_model:指示编译器使用特定内存模型生成代码并存储数据。mem_model可为:
    • small:告诉编译器将代码和数据限制在前 2GB 地址空间内。所有代码和数据的访问都可以通过指令指针(IP)相对寻址来完成。
    • medium:告诉编译器将代码限制为前 2GB;它对数据没有内存限制。代码的访问可以使用IP相对寻址来完成,但是数据的访问必须使用绝对寻址来完成。
    • large:对代码或数据没有内存限制。所有代码和数据的访问都必须使用绝对寻址来完成。
  • -real-size size:指定实数与复数声明、常量、函数及内置函数的默认KIND。
    • real-size 32:使默认的实数和复数声明、常量、函数及内置函数长度为4字节。REAL声明被视为单精度实数(REAL(KIND=4)),COMPLEX声明被视为单精度复数(COMPLEX(KIND=4))。未指定KIND的实数和复数常量均按单精度(KIND=4)进行计算。
    • real-size 64:将默认实数与复数声明、常量、函数及内置函数设为8字节长度。REAL声明视为双精度实数(REAL(KIND=8)),COMPLEX声明视为双精度复数(COMPLEX(KIND=8))。未指定 KIND 的实数和复数常量以双精度(KIND=8)计算。
    • real-size 128:使默认实数和复数声明、常量、函数及内置函数长度为 16 字节。REAL声明被视为扩展精度REAL(REAL(KIND=16));COMPLEX和DOUBLE COMPLEX声明被视为扩展精度COMPLEX(COMPLEX(KIND=16))。未指定KIND的实数和复数常量以扩展精度(KIND=16)进行计算。
  • -save :将变量置于静态内存中。此选项将所有变量保存至静态分配区,但递归例程内的局部变量和声明为AUTOMATIC的变量除外。若需将所有局部且未被SAVED的变量分配至运行时堆栈,请指定auto选项。
  • -zero-nozero :将尚未初始化的INTEGER、REAL、COMPLEX或LOGICAL类型内置变量初始化为零。此选项已弃用。

编译器诊断选项

  • -diag-type=diag-list:控制编译过程中诊断信息的显示。
    • type:对诊断信息执行的操作。可能值包括:
      • disable:禁用一个或多个警告或备注。若指定 -diag-disable=all ,则禁用diag-list中显示的所有警告和备注。
      • error:指示编译器将警告或备注转换为错误。
      • warning:指示编译器将备注转换为警告。
    • diag-list:诊断组或ID值。可能值包括:
      • driver:指定编译器驱动程序生成的诊断信息。
      • warn:指定严重性级别为“警告”的诊断信息。
      • error:指定严重性级别为“错误”的诊断信息。
      • remark:指定作为备注或注释的诊断信息。
      • id[,id,...]:指定一条或多条消息的ID编号。若指定多个消息编号,必须用逗号分隔,且ID之间不得有空格。
      • tag[,tag,...]:指定一条或多条消息的助记符名称。若指定多个助记符名称,必须用逗号分隔,且标签之间不得有空格。
  • -diag-dump :指示编译器打印所有启用的诊断信息。
  • -diag-error-limit=n-no-diag-error-limit :指定编译停止前允许的最大错误数量。n为允许的错误级别或致命级别编译器错误的最大数量,默认为30。
  • -diag-file[=filename]:将诊断分析结果输出至文件 filename
  • -diag-file-append[=filename]:将诊断分析结果追加至文件 filename
  • -gen-interfaces [[no]source]-nogen-interfaces :指示编译器为源文件中的每个例程生成接口块。
    • 此选项指示编译器为源文件中定义的每个例程(即每个SUBROUTINE和FUNCTION语句)生成接口块。编译器为每个例程生成两个文件:一个 .mod 文件和一个 .f90 文件,并将它们放置在当前目录或由include ( -I )或 -module 选项指定的目录中。 .f90 文件为接口块的文本内容; .mod 文件则是编译为二进制形式的接口块。其中 .f90 文件仅供参考,可能无法完整呈现编译器实际使用的生成的接口。
    • 若指定source参数,编译器将同时生成 procedure-name__GENmod.f90procedure-name__GENmod.mod 文件。若指定nosource参数,则仅生成 procedure-name__GENmod.mod 文件而不生成.f90文件。若未指定任何参数,则效果等同于为 -gen-interfaces 选项设置source参数。
  • -traceback-notraceback :指示编译器在运行时发生严重错误时,在目标文件中生成额外信息以提供源文件回溯信息。
  • -warn [keyword[, keyword...]]-nowarn :指定编译器应输出的诊断信息。keyword可为:
    • all:启用除错误和标准错误外的所有警告消息。若未指定关键词,此为默认设置。请注意,当启用全部模式时,标准错误不会升级为警告级别。
    • [no]alignments:决定是否对未自然对齐的数据发出警告。
    • [no]declarations:决定是否对任何未声明的名称发出警告。
    • [no]errors:决定是否将警告升级为错误。
    • [no]externals:决定是否对任何没有显式接口或未声明为外部的虚拟过程或过程调用发出警告。
    • [no]general:决定编译器是否输出警告信息和信息性提示。
    • [no]ignore_bounds:决定编译器在编译时检测到常量数组下标超出数组声明边界时是否发出警告。
    • [no]ignore_loc:决定当实际参数中移除%LOC时是否触发警告。
    • [no]interfaces:决定编译器是否将所有调用的子程序和函数接口与外部接口块集进行比对验证。
    • [no]shape:决定在启用检查形状选项时,数组符合性违规是否以错误或警告形式提示。
    • [no]stderrors:决定是否将Fortran标准违规警告转换为错误。
    • [no]truncated_source:决定当源代码超过固定格式文件的最大列宽时是否触发警告。
    • [no]uncalled:确定是否对从未使用的声明变量发出警告。
    • [no]usage:确定是否对可疑编程实践发出警告。
    • none:禁用所有警告消息。
  • -WB :将编译时边界检查转换为警告。默认为不启用,即转换为错误。

兼容性选项

  • -f66 :指示编译器应用FORTRAN 66语义。
  • -f77rtl :指示编译器使用FORTRAN 77的运行时行为。
  • -fpscomp [keyword[, keyword...]]-nofpscomp :控制编译器内部运行时系统和语义语言功能的某些方面是否与Intel Fortran或Microsoft Fortran PowerStation兼容。
    • none:指定不应使用任何兼容性选项。
    • [no]filesfromcmd:确定当OPEN语句中的FILE=指定符为空时使用的兼容性。
    • [no]general:确定当Fortran PowerStation与Intel Fortran存在语义差异时使用的兼容性。
    • [no]ioformat:确定列表驱动格式化及非格式化I/O的兼容性模式。
    • [no]libs:确定是否将可移植性库传递给链接器。
    • [no]ldio_spacing:确定运行时是否在数值后、字符值前插入空格。
    • [no]logicals:确定逻辑值表示所采用的兼容性模式。
    • all:指定应使用所有兼容性选项。
  • -gcc-name=name:允许指定用于设置链接时环境的GCC编译器名称,包括标准库位置。若未指定路径,编译器将根据您提供的编译器名称搜索 PATH 设置。当您引用非标准的GCC安装环境,或系统存在多个GCC安装时,此选项尤为有用。编译器将根据GCC版本号匹配您指定的GCC编译器。C++中与选项 -gcc-name 对应的是 -gxx-name
  • -gxx-name :允许指定用于设置链接时环境的g++编译器名称,包括标准库位置。若未指定路径,编译器将根据 PATH 设置搜索您提供的编译器名称。当系统中存在多个g++安装时,此选项尤为有用。编译器将根据g++版本号匹配您指定的g++编译器。选项 -gxx-name 的C语言等效形式为 -gcc-name
  • -vms-novms :使运行时系统在OpenVMS Alpha系统和VAX系统上表现得如同HP Fortran(VAX FORTRAN)。

链接或链接器选项

  • -Bdynamic :启用运行时库的动态链接。
  • -Bstatic :启用用户库的静态链接。
  • -Bsymbolic :将程序中所有全局符号的引用绑定至用户共享库内的定义。
  • -Bsymbolic-functions :将程序中所有全局函数符号的引用绑定至用户共享库内的定义。
  • -cxxlib-no-cxxlib :决定编译器是否使用gcc提供的C++运行时库进行链接。
  • -dynamic-linkerfile:指定非默认动态链接器file
  • -fortlib :指示C/C++编译器驱动程序链接至Fortran库。该选项主要用于C/C++混合语言编程。
  • -fuse-ld=keyword:指示编译器使用替代默认链接器。keyword可为:
    • bfd:指示编译器使用bfd链接器。
    • gold:指示编译器使用gold链接器。
    • lld:指示编译器使用lld链接器。
  • -lstring:指示链接器在链接时搜索指定库文件。如库文件名为 libstring.so ,则用 -lstring 指定(去掉lib及.so)。
  • -Ldir:指示链接器在搜索标准目录前优先搜索指定目录dir中的库文件。
  • -nodefaultlibs :禁止编译器在链接时使用标准库。
  • -nofor-main :指定主程序非用Fortran编写。
  • -no-intel-lib [=library]:禁用与指定Intel库或所有Intel库的链接。library可为:
    • libirc:Intel C/C++库。
    • libimf:Intel oneAPI DPC++/C++编译器数学库。
    • libsvml:Intel短向量数学库。
    • libirng:随机数生成器库。
  • -nostartfiles :禁止编译器在链接时使用标准启动文件。
  • -nostdlib :禁止编译器在链接时使用标准库和启动文件。
  • -pie-no-pie :确定编译器是否生成将被链接到可执行文件中的位置无关代码。
  • -pthread :指示编译器使用pthread库提供多线程支持。设置后同时启用: -fiopenmp -qmkl -debug=parallel -fortlib
  • -shared :指示编译器生成动态共享对象而非可执行文件。
  • -shared-intel :使Intel提供的库动态链接。
  • -shared-libgcc :动态链接GNU libgcc库。
  • -static :禁止与共享库链接。
  • -static-intel :使Intel提供的库静态链接。
  • -static-libgcc :静态链接GNU libgcc库。
  • -static-libstdc++ :静态链接GNU libstdc++库。
  • -Tfilename:指示链接器从文件filename中读取链接命令。
  • -threads :指示链接器在多线程运行时库中搜索未解析引用。
  • -v :指定应显示并执行驱动程序工具命令。
  • -Wa,option1[,option2,...]:将选项传递给汇编器进行处理。此,option1[,option2,...]选项不经由驱动程序处理,而是直接传递给汇编器。
  • -Wl,option1[,option2,...]:将选项传递给链接器进行处理。此,option1[,option2,...]选项不经由驱动程序处理,而是直接传递给链接器。
  • -Wp,option1[,option2,...]:将选项传递给预处理器。此,option1[,option2,...]选项不经由驱动程序处理,而是直接传递给预处理器。
  • -Xlinker * option*:将链接器选项直接传递给链接器。

杂项选项

  • -dryrun :指定应显示驱动程序工具命令但不执行。
  • -dumpmachine :显示目标机器和操作系统配置。
  • -dumpversion :显示编译器的版本号。
  • -fpreview-breaking-changes :允许用户告知编译器其愿意放弃向后兼容性保证,并使编译器启用将在下个主要版本中出现的新向后兼容性破坏性变更。
  • -global-hoist-no-global-hoist :启用某些优化功能,可将内存加载操作移至程序执行过程中早于源代码中出现的位置。
  • -help :按字母顺序显示支持的编译器选项列表。也可显示某一类选项,如显示诊断选项: -help diagnostics
  • -intel-freestanding[=ver]:允许您在没有gcc环境的情况下进行编译。[=ver]是一个三位数字,用于确定编译器应兼容的gcc版本以进行编译。它同时设置相应的GNUC宏。该数字将被标准化以反映gcc编译器的版本编号方案。如,若指定493,则表示编译器应兼容GCC 4.9.3版本。
  • -intel-freestanding-target-os=os:允许您指定编译的目标操作系统。目前os只能为Linux。
  • -multiple-processes[=n]:创建可用于同时编译大量源文件最大线程数[=n]
  • -save-temps-no-save-temps :指示编译器保存编译过程中生成的中间文件。
  • --sysroot=dir:指定头文件和库文件所在的根目录。
  • -Tf filename:指示编译器将文件filename作为Fortran源文件进行编译。
  • -watch[=keyword[, keyword...]]-nowatch :指示编译器将特定信息显示到控制台输出窗口。keyword可为:
    • none:禁用cmd和source。
    • [no]cmd:决定是否显示并执行驱动程序工具命令。
    • [no]source:决定是否显示正在编译的文件名称。
    • all:启用cmd和source。
  • -what :指示编译器显示其详细版本字符串。

过时及废弃的选项

过时的选项

过时项

建议代替项

cpp

fpp

device-math-lib

mkl

qmkl

[no]zero

init=[no]zero

废弃的选项

废弃项

建议代替项

1

f66

66

f66

automatic

auto

cm

warn nousage

dps

altparam

fsycl-link-huge-device-code

flink-huge-device-code

lowercase

names lowercase

no-standard-semantics

无精确的替代项;需分别否定特定选项

nus

assume nounderscore

onetrip

f66

stand f15

stand f18

syntax

syntax-only或fsyntax-only

tune

x<code>

uppercase

names uppercase

us

assume underscore