nvfortran(1)
nvfortran(1) ๐
okay so this is the nvfortran(1) page from the General Commands Manual, and it is literally the NVIDIA Fortran compiler. Buckle up, bestie โ we are keeping every flag, every suffix, and every vibe check intact. ๐ซถ
NAME โจ
nvfortran โ The NVIDIA Fortran compiler. ๐
SYNOPSIS ๐
nvfortran [ -flag ]... sourcefile...
DESCRIPTION ๐ธ
nvfortran is a Fortran compiler for NVIDIA GPUs and AMD and Intel CPUs. It supports ISO Fortran 2003 and many features of Fortran 2008, supports GPU parallel programming with OpenACC, and supports multicore CPU programming with OpenACC and OpenMP. nvfortran invokes the Fortran compiler, assembler, and linker with options derived from its command line arguments.
Suffixes of source file names indicate the type of processing to be done:
.f,.for,.ftnโ fixed-format Fortran source; compile.f90,.f95,.f03โ free-format Fortran source; compile.F,.FOR,.FTN,.fpp,.FPPโ fixed-format Fortran source; preprocess, compile.F90,.F95,.F03โ free-format Fortran source; preprocess, compile.cufโ free-format CUDA Fortran source; compile.CUFโ free-format CUDA Fortran source; preprocess, compile.sโ assembler source; assemble.Sโ assembler source; preprocess, assemble.oโ object file; passed to linker.aโ library archive file; passed to linker
C file suffixes are also recognized and compiled with the NVC compiler; see NVC and NVIDIA User's Guide. Other files are passed to the linker (if linking is requested) with a warning message.
Unless you override the default action using a command-line option, nvfortran deletes the intermediate preprocessor and assembler files (see the options -c, -E, -F, and -Mkeepasm); if a single Fortran program is compiled and linked with one nvfortran command, the intermediate object file is also deleted. Linking is the last stage of the compile process, unless you use one of the -c, -E, -F, or -S options, or unless compilation errors stop the whole process.
OPTIONS โจ
Options must be separate; -cs is different from -c -s. Here is a list of all options, grouped by type. More detailed explanations are in following sections.
Overall Options ๐
---#-###-c-[no]defaultoptions-dryrun-drystdinc-dumpversion-echo--flagcheck-flags-fmax-errors=<n>--gcc-toolchain=path-help[=option]-Manno-Minform=level-Mdetail-Mkeepasm-M[no]list-noswitcherror-o file-rc rcfile-S-show-silent-time-V-V<ver>-v--version-w-Werror-x language-x none-Wpass,option-Ypass,directory
Optimization Options ๐ฅ
-fast-f[no-]cx-limited-range-fastsse-fPIC-fpic-KPIC-Kpic-Mcache_align-Mconcur=option-M[no]depchk-M[no]dse-Mextract=option-M[no]fma-M[no]frame-M[no]idiom-M[no]info=option-Minline=option-Minstrument=option-M[no]ipa=option-M[no]lre[=assoc|noassoc]-M[no]movnt-Mneginfo=option-Mnoopenmp-Mnosgimp-Mnovintr-Mpfi[=option]-Mpfo[=option]-M[no]pre-M[no]prefetch=option-Mprof=option-M[no]propcond-Mquad-Msafe_lastval-M[no-]signed-zeros-M[no]stride0-M[no]unroll=option-M[no]unsafe_par_align-M[no]vect=option-M[no]zerotrip-mp[=option]-nomp-Olevel-pg
Debugging Options ๐ซถ
-C-g-gopt-M[no]bounds-Mchkptr-Mchkstk-Mcoff-Mdwarf2-Mdwarf3-Melf-Mnodwarf-[no]traceback
Preprocessor Options ๐ฆ
-Dmacro-E-F-Idirectory-isystem directory-Mcpp=[[no]comment|m|md|mm|mmd|mq:target|mt:target|suffix:suff]-Mnostddef-Mnostdinc-Mpreprocess-Umacro-YI,directory-Yp,directory
Assembler Options ๐ง
-Wa,argument[,argument]...-Ya,directory
Linker Options ๐
-acclibs--[no-]as-needed-Bdynamic-Bstatic-Bstatic-nvidia-c++libs-cudaforlibs-cudalib=libname-cudalibs-fortranlibs-g77libs-Ldirectory-llibrary-m-Mcudalib=libname-M[no]eh_frame-Mnostartup-Mnostdlib-M[no]rpath-Mmkl-nvmalloc-pthread-Rdirectory-r-rpath directory-s-shared-soname name-static-static-nvidia-uname--[no-]whole-archive-Wl,option[,option]...-Xlinker option[,option]...-YC,directory-Yl,directory-YL,directory-YS,directory-YU,directory
Language Options ๐
-asmsuffix=suffix-byteswapio-csuffix=suffix-fsuffix=suffix-FSUFFIX=suffix-cuda=option-i2-i4-i8-i8storage-Mallocatable[=95|03]-M[no]backslash-Mbyteswapio-Mcray=pointer-Mcuda=option-M[no]dalign-M[no]dclchk-M[no]defaultunit-M[no]dlines-Mdollar=char-Mextend-Mfixed-M[no]free[form]-M[no]i4-M[no]iomutex-Mlibsuffix=suffix-M[no]llalign-Mnomain-Mobjsuffix=suffix-M[no]onetrip-M[no]r8-M[no]r8intrinsics=float-M[no]recursive-M[no]ref_externals-M[no]save-M[no]signextend-M[no]stack_arrays-Mstandard-Msyntax-only-M[no]unixlogical-M[no]upcase-module directory-Munlink_module-r4-r8-Wh,argument[,argument]...
Target-specific Options ๐ฏ
-acc-noacc-gpu=option-K[no]ieee-Ktrap=option-march=target-m[no-]daz-ftz-M[no]daz-M[no]flushz-M[no]fpmisalign-M[no]fprelaxed=option-M[no]func32-M[no]longbranch-M[no]second_underscore-M[no]varargs-Mwritable-strings-mcmodel=small|medium-stdpar=option-nostdpar-ta=target-target=option-tp=target
๐จ Link-time reminder, bestie: when source files are compiled using any of the following options, the same option(s) should be passed when usingnvfortranto link the objects:-g-mp-Mconcur-Mipa-Mprof.
โจ Overall Options โจ
okay bestie, these are the driver-level switches โ the ones that tell nvfortran how to behave overall. ๐
--โ Anything after this switch is treated as a filename. Note that most tools will not allow a filename starting with a dash, so these should be avoided. ๐ซถ-#โ Display the invocations of the compiler, assembler, and linker. These invocations are the command lines created bynvfortran.-###โ Display invocations of the compiler, assembler and linker, but do not execute them.-cโ Skip the link step; compile and assemble only.-defaultoptions(default) /-nodefaultoptionsโ Use (don't use) the default options set in site-specific or user-specificPREOPTIONSorPOSTOPTIONSdriver variables.-dryrunโ Use this option to display the invocations of the compiler, assembler, and linker but do not execute them.-drystdincโ Display the standard include directories without invoking the compiler.-dumpversionโ Display the shortened version of the compiler. For example,21.11or22.3.-echo [=go|stop]โ Echo the command line flags and (by default) stop. This is useful when the compiler is invoked by a script.goโ Don't stop after echoing the command line.stop(default) โ Do stop after echoing the command line.
--flagcheckโ Don't compile anything; just emit any messages for command-line switch errors. Return a success error code if there are no command-line switch errors.-flagsโ Display all validnvfortrancommand-line options in alphabetical order.-fmax-errors=<n>โ Specify maximun numbers of errors before terminating compilation.--gcc-toolchain=pathโ Specify gcc toolchain location using path to gcc directory or gcc executable. The argument can either be gcc root directory,<root directory>/bin, or the gcc executable itself.-help[=option]โ Displays command-line options recognized bynvfortranon the standard output.nvfortran -help -otherswitchwill give help about-otherswitch. The default is to listnvfortrancommand line options by group; options are:groupsโ Print out the groups into which the switches are organized.asmโ Print help for assembler command-line options.debugโ Print help for debugging command-line options.languageโ Print help for language-specific command-line options.linkerโ Print help for linker options.optโ Print help for optimization command-line options.otherโ Print help for any other command-line options.overallโ Print help for overall command-line options.phaseโ Print help for the known compiler phases.preproโ Print help for preprocessor command-line options.suffixโ Describe the known file suffixes.switchโ Print all switches in alphabetical order.targetโ Print help for target-specific command-line options.variableโ Show thenvfortranconfiguration; this is the same as-show.
-Mannoโ Produce annotated assembly files, where source code is intermixed with assembly language; implies-Mkeepasm.-Minform=levelโ Specify the minimum level of error severity that the compiler displays during compilation.fatalโ Instructs the compiler to display fatal error messages.file(default) /nofileโ Print out (don't print out) the names of files as they are compiled; this is only active when there is more than one file on the command line.severeโ Instructs the compiler to display severe and fatal error messages.warnโ Instructs the compiler to display warning, severe and fatal error messages.informโ Instructs the compiler to display all error messages (inform, warn, severe and fatal).
The default is -Minform=warn.
-Mdetailโ Display enhanced error messages that include source line and column pointer. This is currently available for syntax errors and some semantic errors.-Mkeepasmโ Keep the assembly file for each source file, but continue to assemble and link the program. This is mainly for use in compiler performance analysis and debugging.-Mlist,-Mnolist(default) โ Create (don't create) a listing file.-noswitcherrorโ Ignore unknown command line switches after printing an warning message; the default behavior is to print an error message and halt.-o fileโ Use file as the name of the executable program, rather than the defaulta.out. If used with-cor-Sand a single input file, file is used as the name of the object or assembler output file.-rc rcfileโ Specifies the name of anvfortranstartup configuration file. If rcfile is a full pathname, then use the specified file. If rcfile is a relative pathname, use the file name as found in the$DRIVERdirectory.-Sโ Skip the assembly and link steps. Leave the output from the compile step in a file namedfile.sfor each file named, for instance,file.f. See also-o.-showโ Produce help information describing the currentnvfortranconfiguration.-silentโ Do not print warning messages. Same as-Minform=severe.-timeโ Print execution times for the various steps in the compiler itself.-Vโ Display version messages and other information.-V<ver>โ If the specified version of the compiler is installed, that version of the compiler is invoked.-vโ Verbose mode; print out the command line for each tool before it is executed.--versionโ Display version messages and other information.-wโ Do not print warning messages.-Werrorโ Turn all warning messages into errors.-x languageโ Specify explicitly the language for the input files (instead of choosing based on the file name suffix). Possible values for language are:ccpp c++ cpp-outputf Ff95 f95-cpp-inputf90 F90f77 f77-cpp-inputcuf CUFasm ASM assembler assembler-with-cpp
-x noneโ Turn off language specification, so the input files are handled according to their suffixes.-Wpass,option[,option...]โ Pass option to the specified pass. Each comma-delimited option is passed as a separate argument. The passes are:hโ for the Fortran 90/95 front end,0โ for the compiler back end,aโ for the assembler,iโ for the interprocedural analyzer, andlโ for the linker.
-Ypass,directoryโ Look in directory for passpass, rather than in the standard area. The passes are:hโ Search for the Fortran 90/95 front end executable in directory.0โ Search for the compiler back end executable in directory.aโ Search for the assembler executable in directory.Cโ Search for the compiler library in directory.iโ Search for the InterProcedural Analyzer (IPA) in directory.lโ Search for the linker in directory.Iโ Set the compiler's standard include directory to directory. The standard include directory is set to a default value by the driver and can be overridden by this option.Lโ If the linker supports the-YLoption, then pass the option-YL,directoryto the linker. Otherwise, use directory as the standard library location.Sโ Search for the startup object files in directory.Uโ If the linker supports the-YUoption, then pass the option-YU,directoryto the linker. Otherwise this option is ignored.
๐ฅ Optimization Options ๐ฅ
okay, optimization section โ this is where the compiler gets its little performance goblin on. ๐ฅ
-fastโ Chooses generally optimal flags for the target platform. Usenvfortran -fast -helpto see the equivalent switches. Note this sets the optimization level to a minimum of2; see-O.-fcx-limited-rangeโ Specify that complex division does not need range reduction.-fno-cx-limited-rangespecifies that complex division does need range reduction.-fcx-limited-rangeis the default setting at optimization level-Ofast.-fastsseโ Chooses generally optimal flags for a processor that supports to vectorize for the SSE/AVX instructions. Usenvfortran -fastsse -helpto see the equivalent switches.-fPICโ Equivalent to-fpic; provided for compatibility with other compilers.-fpicโ Instructs the compiler to generate position-independent code which can be used to create shared object files (dynamically linked libraries).-KPICโ Equivalent to-fpic; provided for compatibility with other compilers.-Kpicโ Equivalent to-fpic; provided for compatibility with other compilers.-Mcache_alignโ Align unconstrained data objects of size greater than or equal to16bytes on cache-line boundaries. An unconstrained object is a variable or array that is not a member of an aggregate structure or common block, is not allocatable, and is not an automatic array.-Mconcur[=option[,option,...]]โ ๐จ this option has been deprecated and will be removed in a future release. It instructs the compiler to enable auto-concurrentization of loops. This also sets the optimization level to a minimum of2; see-O. If-Mconcuris specified, multiple processors will be used to execute loops which the compiler determines to be parallelizable. When linking, the-Mconcurswitch must be specified or unresolved references will occur. TheOMP_NUM_THREADSorNCPUSenvironment variables control how many processors will be used to execute parallelized loops. The options can be one or more of the following:allcoresโ bestie, this one uses all the available cores, but only when the env varsOMP_NUM_THREADSandNCPUSaren't set. Heads up tho: you gotta specify it at link time. ๐altcode:n/noaltcodeโ generate (or don't generate, withnoaltcode) alternate scalar code for parallelized loops. The parallelizer whips up scalar code that runs whenever the loop count is less than or equal to n. But if you saynoaltcode, the parallelized version of the loop always runs, no matter what the loop count is. periodt.altreduction[:n]โ same energy, but for parallelized loops that contain a reduction. If a parallelized loop has a reduction in it, the parallelizer generates scalar code that executes whenever the loop count is less than or equal to n.assoc(default) /noassocโ enable (or disable) parallelization of loops with reductions.cncall/nocncall(default) โ assume (or don't assume) that loops containing calls are safe to parallelize. Also: no minimum loop count threshold has to be satisfied before parallelization kicks in, and last values of scalars are assumed to be safe.dist:blockโ parallelize with block distribution. Contiguous blocks of iterations of a parallelizable loop get assigned to the available processors.dist:cyclicโ parallelize with cyclic distribution. The outermost parallelizable loop in any loop nest gets parallelized. If a parallelized loop is innermost, its iterations are allocated to processors cyclically. For example, if there are 3 processors executing a loop, processor 0 performs iterations0, 3, 6, etc; processor 1 performs iterations1, 4, 7, etc; and processor 2 performs iterations2, 5, 8, etc. ๐innermost/noinnermost(default) โ enable (or disable) parallelization of innermost loops.levels:nโ parallelize loops nested at most n levels deep; the default is3.
-Mdepchk(default) /-Mnodepchkโ assume (or don't assume) that potential data dependencies exist. โ ๏ธ Lowkey important:-Mnodepchkmay result in incorrect code. You've been warned, bestie.-Mdse/-Mnodse(default) โ enable (or disable) the dead store elimination optimization.-Mextract=[option[,option,...]]โ run the subprogram extraction phase to prepare for inlining. The=lib:filenameoption must be used with this switch to name an extract library. See-Minlinefor more deets on inlining. โจsubprogram[,subprogram]โ a non-numeric option that doesn't contain a period is assumed to be the name of a subprogram to be extracted.name:subprogram[,subprogram]โ specifies the name of a subprogram or subprograms to be extracted.lib:directoryโ specifies the name of a directory to contain the extracted subprograms; this directory will be created if it doesn't already exist. ๐[size:]numberโ a numeric option is assumed to be a size. Functions containing number or fewer statements are extracted. If both number and function are specified, then functions matching the given name(s) or meeting the size requirements are extracted.
-Mfma/-Mnofma(default) โ generate (or don't generate) fused multiply-add (FMA) instructions on the CPU and GPU for targets that support it. FMA instructions are generally faster than separate multiply-add instructions, and can generate higher precision results since the multiply result isn't rounded before the addition. But delaying rounding until after addition, however, may cause results to differ from those you'd get with the unfused multiply-add instructions. FMA instructions are enabled at optimization levels higher than-O1. ๐งฎ-Mframe/-Mnoframe(default) โ set up (or don't set up) a true stack frame pointer for functions;-Mnoframeallows slightly more efficient operation when a stack frame isn't needed, but some options override-Mnoframe. ๐-Midiom/-Mnoidiom(default) โ enable loop idiom recognition. Memory copy, memory set, and memory zero loops are recognized and replaced with calls to their respective optimized versions. Iconic behavior honestly.-Minfo[=option[,option,...]]/-Mnoinfo(default) โ emit useful information to stderr. The options are:allโ includes optionsaccel,inline,ipa,loop,lre,mp,opt,par,stdpar,vect.accelโ emit information about accelerator region targeting.ftnโ emit Fortran-specific information.inlineโ emit information about functions extracted and inlined.intensityโ this option has been deprecated and will be removed in a future version. Emit compute intensity information about loops. ๐ipaโ emit information about the optimizations enabled by interprocedural analysis (IPA).loop|optโ emit information about loop optimizations. This includes information about vectorization and loop unrolling.lreโ emit information about loop-carried redundancy elimination.mpโ emit information about OpenMP parallel regions.parโ emit information about loop parallelization.pfoโ emit profile feedback information.time|statโ emit compilation statistics.stdparโ emit information about parallelization of C++ parallel algorithms and FortranDO CONCURRENTloops.vectโ emit information about automatic loop vectorization.
With no options, -Minfo is the same as -Minfo=accel,ipa,loop,lre,mp,opt,par,stdpar,vect. ๐ซถ
-Minline[=option[,option,...]]โ pass options to the function inliner. The options are:lib:filename.extโ specify an inline library created by a previous-Mextractoption. Functions from the specified library are inlined. If no library is specified, functions are extracted from a temporary library created during an extract prepass.except:funcโ specifies which functions should not be inlined. ๐[name:]functionโ a non-numeric option is assumed to be a function name. Ifname:is specified, what follows is always the name of a function.pragmaโ Fortran Only: inline only those procedures that have a!NVF$ INLINEpragma on the source line immediately before the procedure'sSUBROUTINEorFUNCTIONstatement.[maxsize:]numberโ a numeric option is assumed to be a size. Functions of size number or less are inlined. If both number and function are specified, then functions matching the given name(s) or meeting the size requirements are inlined.reshapeโ for Fortran, the default is to not inline subprograms with array arguments if the array shape doesn't match the shape in the caller. This overrides the default.smallsize:numberโ always inline functions of size smaller than number regardless of other size limits.totalsize:numberโ stop inlining in a function when the function's total inlined size reaches the number specified.
-Minstrument [=option]โ generate additional code to enable function-level instrumentation. This option implies-Mframe. The option is:functions(default)
-Mipa [=option[,option,...]]/-Mnoipa(default) โ enable and specify options for InterProcedural Analysis (IPA). ๐ Note: IPA is not compatible with parallel make environments (e.g.,pmake). IPA also sets the optimization level to a minimum of2; see-O. If no option list is specified, then it's equivalent to-Mipa=const. The options are:align/noalign(default) โ enable (or disable) recognition when pointer targets are all cache-line aligned, allowing better SSE code generation.arg/noarg(default) โ remove (or don't remove) arguments replaced by-Mipa=ptr,const.-Mipa=noargimplies-Mipa=nolocalarg.const(default) /noconstโ enable (or disable) propagation of constants across procedure calls.f90ptr/nof90ptr(default) โ enable (or disable) Fortran 90 pointer disambiguation across procedure calls.fastโ chooses generally optimal-Mipaflags for the target platform; usenvfortran -Mipa -helpto see the equivalent options.forceโ force all objects to recompile regardless of whether IPA information has changed.globals/noglobals(default) โ analyze (or don't analyze) which globals are modified by procedure calls.inline:nโ determine additional functions to inline, allowing up to n levels of inlining. Additional suboptions are:except:procโ disables inlining of procedure proc.nopfoโ ignore any profile frequency information from-Mpfowhen choosing which functions to inline.reshape/noreshape(default) โ enable (or disable) Fortran inlining with mismatched array shapes.
ipofileโ save IPA information in a.ipofile instead of the default of appending the information to the object file.jobs:nโ use up to n jobs in parallel to reoptimize object files. ๐ง
keepobj(this one's the default, bestie) /nokeepobjโ keep the optimized object files (or don't ๐), using file name mangling, so your next builds recompile faster. It's giving "save your progress" energy.libc/nolibc(default) โ optimize calls to certain standard C library routines โจlibinline/nolibinline(default) โ allow (or don't allow) inlining from routines in libraries ๐ซถ heads up:-Mipa=libinlineimplies-Mipa=inline.libopt/nolibopt(default) โ allow (or don't allow) recompiling and reoptimizing routines from libraries with IPA information ๐localarg/nolocalarg(default) โ enable (or disable) the feature that externalizes local variables so arguments can be replaced by-Mipa=ptr. And yes:-Mipa=localargimplies-Mipa=argโญmain:func โ specify a function to serve as a global entry point ๐ it may appear multiple times, and ngl it disables linking.ptr/noptr(default) โ enable (or disable) pointer disambiguation across procedure calls ๐ธpure/nopure(default) โ detect (or don't detect) pure functions ๐ฆquietโ don't print out messages about which files are recompiled at link time ๐คซ lowkey the polite option.reaggregation/noreaggregation(default) โ enable (or disable) global struct reaggregation ๐ btw this one can change the order of struct members, or split structs into multiple structs, to improve memory locality and cache utilization. Iconic for performance, but know what you're signing up for ๐requiredโ return an error condition if IPA is inhibited for any reason, instead of the default behavior of just linking without IPA optimization ๐จsafe:[function|library] โ declares that the named function, or all functions in the named library, are safe ๐ a safe procedure does not call back into the known procedures and does not change any known global variables. Warning tho: without-Mipa=safe, any unknown procedures will cause IPA to fail.safeall/nosafeall(default) โ declares that all unknown functions are safe (or not safe, respectfully ๐); see-Mipa=safeabove.shape/noshape(default) โ perform (or don't perform) Fortran 90 shape propagation โจsummaryโ only collect IPA summary information when compiling ๐ซถ this prevents IPA optimization of this file, but allows optimization for other files linked with this file. Team player energy fr fr.vestigial/novestigial(default) โ remove (or don't remove) functions that are not called ๐ bye, dead code.-Mlre[=assoc|noassoc],-Mnolreโ enable (or disable) loop-carried redundancy elimination โก theassocoption allows expression reassociation, andnoassocdisallows expression reassociation. Pick your fighter.-Mmovnt,-Mnomovntโ force (or disable) generation of nontemporal moves ๐ฅ-Mmovntused with-fastssecan sometimes be faster than-fastssealone. By default, nontemporal moves are generated for loops with large loop counts.-Mneginfo=option[,option...]โ tells the compiler to produce information on why certain optimizations are not performed ๐ญ (the "why didn't you slay" report). Use the-Minfoflag instead, bestie.-Mnoopenmpโ when-mpis present, ignore the OpenMP pragmas ๐-Mnosgimpโ when-mpis present, ignore the SGI parallelization pragmas ๐-Mnovintrโ do not generate vector intrinsic calls ๐ซ-Mpfi[=option]โ generate profile feedback instrumentation โจ this includes extra code to collect run-time statistics to be used in a subsequent compile. Important:-Mpfimust also appear when the program is linked ๐ When the program is run, a profile feedback filepgfi.outwill be generated; see-Mpfo. The allowed options are:indirect/noindirect(default) โ enable (or disable) collection of indirect function call targets, which can be used for indirect function call inlining ๐ฏ
-Mpfo[=option[,option...]]โ enable profile feedback optimizations ๐ there must be a profile feedback filepgfi.outin the current directory, which contains the result of an execution of the program compiled with-Mpfi. The options are:indirect/noindirect(default) โ enable (or disable) indirect function call inlining; this requires apgfi.outfile generated from a binary built with-Mpfi=indirect๐layout(default) /nolayoutโ enable (or disable) basic block layout to take advantage of instruction cache locality by keeping hot paths close together ๐ฅ cozy little hot paths.dir=directory โ specify the directory containing thepgfi.outprofile feedback information file; the default is the current directory ๐๏ธ
-Mpre,-Mnopre(default) โ enable (or disable) the partial redundancy elimination optimization โญ-Mprefetch[=option:n],-Mnoprefetchโ add (or don't add) prefetch instructions for those processors that support them (Pentium 4, Opteron) ๐ฅ๏ธ heads up:-Mprefetchis default on Opteron;-Mnoprefetchis default on other processors. The options are:distance:d โ set the fetch-ahead distance for prefetch instructions to d cache lines ๐n:n โ set the maximum number of prefetch instructions to generate in a loop to n ๐ขntaโ use theprefetchntainstruction โจplainโ use theprefetchinstruction ๐t0โ use theprefetcht0instruction ๐wโ allow the AMD-specificprefetchwinstruction ๐ฅ
-Mprof[=option[,option...]]โ set performance profiling options ๐ using these makes the resulting executable create a performance profile that you can view and analyze with the PGPROF performance profiler. Quick vocab check: old-style profiling means compiler-generated source instrumentation, and MPICH-style profiling means instrumented wrappers for MPI library routines. The-Mprofoptions are:dwarfโ generate limited DWARF symbol information sufficient for most performance profilers ๐งfuncโ perform old-style function level profiling ๐ฏhwctsโ generate a profile using event-based sampling of hardware counters via the PAPI interface (PAPI must be installed) โ๏ธlinesโ perform old-style line level profiling ๐timeโ generate a profile using time-based instruction-level statistical sampling โฑ๏ธ this is equivalent to-pg, except the profile is saved in a file namedpgprof.outinstead ofgmon.out. Small difference, big deal.
On Linux systems that have OProfile installed, PGPROF supports collection of performance data without recompilation ๐ use of -Mprof=dwarf is useful for this mode of profiling.
-Mpropcond(default),-Mnopropcondโ enable (or disable) propagation of constant values derived from conditional branches with equality tests ๐ธ-Mquadโ align large objects on quad-word boundaries ๐-Msafe_lastvalโ okay so picture this: a scalar is used after a loop, but it's not defined on every iteration of the loop ๐ฌ by default the compiler does not parallelize the loop. But this option tells the compiler it is safe to parallelize the loop ๐-Msigned-zeroes(default),-Mno-signed-zerosโ toggles whether to honor (-Msigned-zeros) or ignore (-Mno-signed-zeros) issues associated with a signed0.0during optimization ๐ Yes, the flag list literally writes it two ways; yes, it's still the same vibe.-Mstride0,-Mnostride0(default) โ generate (or don't generate) alternate code for a loop that contains an induction variable whose increment may be zero ๐-Munroll[=option[,option...]],-Mnounroll(default) โ invoke (or don't invoke) the loop unroller ๐ this also sets the optimization level to a minimum of2; see-O. The option is one of the following:c:m โ tells the compiler to completely unroll loops with a constant loop count less than or equal to m, a supplied constant ๐ if this value is not supplied, the m count is set to1. And if m is set to1, a compiler heuristic determines the maximum loop count at which such loops will be completely unrolled.n:u โ tells the compiler to unroll a single-block loop u times, when the loop is not completely unrolled, or has a non-constant loop count ๐ if u is not supplied, the unroller computes the number of times a candidate loop is unrolled.m:u โ tells the compiler to unroll a multi-block loop u times, when it's not completely unrolled, or has a non-constant loop count ๐ if u is not supplied, the unroller computes the number of times a candidate loop is unrolled.
And -Mnounroll tells the compiler not to unroll loops, periodt โ
-Munsafe_par_align,-Mnounsafe_par_alignโ use (or don't use) aligned moves for array loads in parallelized loops as long as the first element of the array is aligned ๐ this is only effective with-Mvect=simd. And the reason it's literally called unsafe? There are situations where the array elements allocated to some processors are not aligned ๐ญ so like, be careful bestie.-Mvect [=option[,option...]],-Mnovect(default) โ pass options to the internal vectorizer ๐ this also sets the optimization level to a minimum of2, the equivalent of-O; for more info see optimization levels under-O. If no option list is specified, then these vector optimizations are used:assoc,cachesize:c,simd:256, where c is the actual cache size of the machine โจ The-Mvectoptions are:altcode(default) /noaltcodeโ enable (or disable) alternate code generation for vector loops, depending on such characteristics as array alignments and loop counts ๐ฏfuse/nofuse(default) โ enable (or disable) loop fusion to combine adjacent loops into a single loop ๐ซถ two loops become one, we love a merge.prefetchโ use prefetch instructions in loops where profitable ๐
simd[:{128|256|512}](default),nosimdโ use vector SIMD instructions (AVX, AVX2, AVX512), bestie. The argument can limit usage to 128-bit SIMD instructions. Specifying 512-bit SIMD instructions is only possible for target processors that support AVX512. โจuniform,nouniform(default) โ perform the same optimizations in the vectorized and residual loops. This may affect the performance of the residual loop. ๐
๐ซถ heads up: these next ones are also supported, but they're not recommended for new development โ except by experienced users โ and may be phased out in future releases. Not me warning you, just the manpage.
assoc(default),noassocโ enable (disable) certain associativity conversions that can change the results of a computation due to floating-point roundoff error differences. A typical optimization is to change the order of additions, which is mathematically correct but can be computationally different due to roundoff error. ๐ญcachesize:number(default=automatic) โ tells the vectorizer, when it's doing cache tiling optimizations, to assume a cache size ofnumber. ๐gather(default),nogatherโ enable (disable) vectorization of loops with indirect array references. ๐ฆidiom(default),noidiomโ enable idiom recognition; this is the alternate form of-Midiom. ๐ฅlevels:nโ set maximum nest level of loops to optimize. ๐ธpartialโ enable partial loop vectorization via innermost loop distribution. ๐short,noshort(default) โ enable (disable) recognition of short vector operations that arise from scalar code outside of loops or within the body of loops. ๐sizelimit[:number],nosizelimit(default) โ limit the size of loops that are vectorized; the default is to attempt to vectorize all loops. โญtile,notile(default) โ enable (disable) loop tiling to optimize for cache locality. ๐-Mnovectโ disables the vectorizer, and it's the default at-O0and-O1. ๐-Mzerotrip(default),-Mnozerotripโ include (don't include) a zero-trip test for loops. Use-Mnozerotriponly when all loops are known to execute at least once. ๐-mp[=option]โ enable OpenMP pragmas and directives to explicitly parallelize regions of code for execution by accelerator devices or a multi-processor system. The options allowed are:gpuโ compile OpenMP directives for parallel execution on the GPU. ๐ฅmulticore(default) โ compile OpenMP directives for parallel execution on the CPU. ๐ปalign,noalign(default) โ modify (don't modify) default loop iteration scheduling to align iterations with array references. The default is to use simple static scheduling. ๐autopar(default),noautoparโ enable loop autoparallelization ofomp loopconstructs. ๐omptโ link against an OMPT-enabled OpenMP library. ๐ง
-nompโ ignore OpenMP directives and do not link against OpenMP runtime libraries. ๐-O[level]โ set the optimization level. If-Ois not specified, then the default level is1if-gis not specified, and0if-gis specified. If a number is not supplied with-Othen the optimization level is set to2. The optimization levels and their meanings are as follows:-O0โ sets the optimization level to0. A basic block is generated for each statement. No scheduling is done between statements. No global optimizations are performed. ๐ด-O1โ sets the optimization level to1. Scheduling within extended basic blocks is performed. No global optimizations are performed. ๐ฑ-Oโ sets the optimization level to2, with no SIMD vectorization enabled. All level 1 optimizations are performed. In addition, traditional scalar optimizations such as induction recognition and loop invariant motion are performed by the global optimizer. โจ-O2โ all-Ooptimizations are performed. In addition, more advanced optimizations such as SIMD code generation, cache alignment and partial redundancy elimination are enabled. ๐ฅ-O3โ all-O1and-O2optimizations are performed. In addition, this level enables more aggressive code hoisting and scalar replacement optimizations that may or may not be profitable. ๐-Ofastโ enables-O3,-Mfprelaxed,-Mstack_arrays,-Mno-nan,Mno-inf, and-fcx-limited-range. Note-Mstack_arrayis disabled when both command line options-Ofastand-stdparare enabled. ๐-O4โ all-O1,-O2, and-O3optimizations are performed. In addition, hoisting of guarded invariant floating-point expressions is enabled. ๐
-pgโ enable gprof-style sample-based profiling; implies-Mframe. ๐
๐ Debugging Options ๐
-Cโ add array bounds checking; the same as-Mbounds. ๐-gโ generate symbolic debug information. This also sets the optimization level to zero, unless a-Oswitch is present on the command line. Symbolic debugging may give confusing results if an optimization level other than zero is selected. Using-O0the generated code will be slower than code generated at other optimization levels. ๐ญ-goptโ generate symbolic debug information, without affecting optimizations. This may give confusing results when debugging with optimizations; it is intended for use with other tools that use the debug information. ๐ง-Mbounds,-Mnobounds(default) โ add (don't add) array bound checking. ๐-Mchkptrโ check for unintended de-referencing ofNULLpointers. ๐-Mchkstkโ check the stack for available space upon entry to and before the start of a parallel region. Useful when many private variables are declared. ๐ซถ-Mcoffโ generate a COFF formatted object. ๐-Mdwarf2โ generate DWARF2 debug information with-g. ๐ธ-Mdwarf3โ generate DWARF3 debug information with-g. ๐ฆ-Melfโ generate an ELF formatted object. ๐-Mnodwarfโ don't add the default dwarf information. ๐-traceback(default),-notracebackโ add debug information for runtime traceback. ๐
๐ง Preprocessor Options ๐ง
-Dname[=def]โ definenameto bedefin the preprocessor. Ifdefis missing, it is assumed to be empty. If the=sign is missing, thennameis defined to be the string1. โจ-Eโ preprocess each.cfile and send the result to standard output. No compilation, assembly, or linking is performed. ๐-Fโ stop after preprocessing. โ-Idirectoryโ adddirectoryto the compiler's search path for include files. For include files surrounded by< >, each-Idirectory is searched followed by the standard area. For include files surrounded by" ", the directory containing the file containing the#includedirective is searched, followed by the-Idirectories, followed by the standard area. ๐-isystem directoryโ same as-I, but mark the directory as a system directory. ๐ธ-Mcpp=[[no]comment|m|md|mm|mmd|mq:target|mt:target|suffix:suff]โ only runs the preprocessor on the input file(s); by default, the output is written tofile.i, unless renamed with the-oswitch. The options are:comment,nocommentโ keep (don't keep) C-style comments in the preprocessed output. ๐ฌinclude:fileโ include this file before processing the source file. ๐ฅmโ print makefile dependencies to stdout, a la-M. ๐จ๏ธmdโ print makefile dependencies tofile.d, a la-MD. ๐mmโ print makefile dependencies to stdout, ignoring system includes (includes with angle braces), a la-MM. ๐ซmmdโ print makefile dependencies tofile.d, ignoring system includes (includes with angle braces), a la-MMD. ๐mq:'target'โ print makefile dependencies to stdout, a la-MQ. ๐ฏmt:targetโ print makefile dependencies to stdout, a la-MT. ๐ฏlineโ include line numbers into the preprocessed output. ๐ขsuffix:suffโ when generating makefile dependencies, name the dependent filefile.suff; the default is to name the dependent filefile.o. ๐ท๏ธ
-Mnostddefโ do not predefine any macros to the preprocessor. ๐-Mnostdincโ do not search in the standard location for include files when those files are not found elsewhere. ๐-Mpreprocessโ run the preprocessor on Fortran or assembler source files. By default, the preprocessor is run when the source's suffix is.fpp,.F,.F90,.F95, or.HPF. ๐ง-Unameโ remove the definition of thenamemacro in the preprocessor. โ-YI,directoryโ change the standard include directory todirectory. ๐-Yp,directoryโ look indirectoryfor the preprocessor executable. ๐
๐ ๏ธ Assembler Options ๐ ๏ธ
-Wa,option[,option...]โ pass each comma-delimited option to the assembler. ๐ง-Ya,directoryโ look indirectoryfor the assembler executable. ๐งฐ
๐ LINKER OPTIONS ๐
okay so this is the part where we tell the linker what to do. the linker is the little guy who actually stitches all your object files together into something you can run, and bestie, it has opinions. these flags are how you pass your opinions to it. let's go ๐ซถ
-acclibsโ link-time option that adds the accelerator libraries onto the link line โจ--as-needed,--no-as-neededโ these get passed straight to the linker.--as-neededtells it to only set theDT_NEEDEDflag for the shared libraries that come after it โ meaning those libs are only required at run time if they're actually used to satisfy references. and--no-as-neededputs things back to the default behavior, no cap ๐-Bdynamicโ passed to the linker to say "dynamic binding please" ๐ซ-Bstaticโ literally the same thing as-static. go peek at-staticfor the deets ๐-Bstatic-nvidiaโ also the same as-static-nvidia, so check that one out for the full story ๐-c++libsโ link-time option that adds the C++ runtime libraries so you can do mixed-language programming. yes we're being multilingual, we contain multitudes ๐ฆ-cudaforlibsโ link-time option that adds the CUDA Fortran runtime libraries, also for mixed-language programming. and it implies'-fortranlibs', so you get that for free ๐-cudalib[=libname[,libname...]]โ adds CUDA-optimized libraries to the link line. if you don't specify anything, the compiler links all the necessary CUDA-optimized libraries.-cudalibuses whichever version of the library matches the CUDA version you're on. the libraries it recognizes are:cublascublasmpcufftcufftmpcufftwcurandcusolvercusolvermpcusparsecutensorncclnvblasnvlamathnvshmemnvtx3
that's the whole lineup, no skips ๐
-cudalibsโ โ ๏ธ deprecated, bestie, please use-cudalibinstead. it's a link-time option that adds the CUDA runtime API library ๐-fortranlibsโ link-time option that adds the Fortran runtime libraries, for when you're mixing languages like the main character you are ๐-g77libsโ link-time option that lets object files generated by GNUg77(orgcc) get linked intonvfortranmain programs. bridging the eras fr fr ๐-Ldirectoryโ passed to the linker; adds directory to the list of directories where the linker goes hunting for libraries ๐-llibraryโ passed to the linker; loads the libraryliblibrary.afrom the standard library directory. see also the-Loption, they're besties ๐-mโ makes the linker display a link map. a little map! of your links! cute ๐บ๏ธ-Mcudalib[=libname[,libname...]]โ โ ๏ธ deprecated, please refer to-cudalib. adds CUDA-optimized libraries to the link line, and with no option specified the compiler links all the necessary CUDA-optimized libraries ๐-Meh_frame,-Mnoeh_frameโ adds (or doesn't add) arguments to the link line to preserve the stack frame information for zero-cost exception handling frames. the default is-Mnoeh_frameunless something in a site or user rcfile changes it. so like, check your rcfiles ๐ง-Mnostartupโ do not link in the usual startup routine. and just so you know, that routine is the one holding the entry point for the program, so yeah, that's kind of a big deal ๐ญ-Mnostdlibโ do not link in the standard libraries when linking a program. bold move, but okay ๐ซก-Mrpath(default),-Mnorpathโ the default is to add-rpathto the link line, giving the directories that contain the required runtime shared objects. use-Mnorpathto tell the driver "nope, don't add any-rpathswitches to the link line" ๐ธ-Mmklโ adds Intel's Math Kernel libraries to the link line. this one requires the environment variableMKLROOTto be set to the path of your local MKL installation โ specifically the part of the path that precedes'lib/<arch>'. noMKLROOT, no MKL, that's the rule โญ-nvmallocโ uses a custom host memory allocator โจ-pthreadโ adds support for multithreading with the pthreads library. this one sets flags for both the preprocessor and the linker, so it's doing double duty ๐ช-Rdirectoryโ passed to the linker; tells it to hard-code the pathname directory into the search path for generated shared object files. ๐ note: there cannot be a space betweenRand directory, so keep 'em glued together ๐-rโ passed to the linker; generates a re-linkable object file ๐-rpath directoryโ passed to the linker to add directory to the runtime shared library search path ๐ฃ๏ธ-sโ passed to the linker; strips symbol table information. bye bye debug info ๐-sharedโ passed to the linker; tells it to generate a shared object file (that's a dynamically linked library). implies-fpic, so you get position-independent code too ๐ฆ-soname nameโ passed to the linker. when you're creating a shared object, this tells the linker to set the internalDT_SONAMEfield to the name you specified ๐ท๏ธ-staticโ passed to the linker to specify static binding ๐-static-nvidiaโ statically links in the NVIDIA runtime libraries while still using dynamic linking for the system libraries. implies-Mnorpath๐ (the best of both worlds, honestly)-unameโ passed to the linker; generates an undefined reference. yes that's a thing, and yes it does what it says ๐ซ--whole-archive,--no-whole-archiveโ passed to the linker.--whole-archivetells it to include all objects in the archive files that follow, and--no-whole-archiverestores the default behavior. like a light switch for archives ๐๏ธ-Wl,option[,option]...,-Xlinker option[,option]...โ pass each comma-delimited option to the linker. two ways to do the same vibe, pick your fave ๐-YC,directoryโ look in directory for the standard compiler library files ๐-Yl,directoryโ look in directory for the linker ๐-YL,directoryโ change the standard library directory to directory ๐๏ธ-YS,directoryโ look in directory for the standard system startup object files ๐-YU,directoryโ passed to the linker; change library search path ๐
๐ Language Options ๐
Okay bestie, this whole section is about telling nvfortran how to read your source files and what language semantics to use. It's giving "control freak but make it compiler" and honestly? Iconic. Let's go ๐
โจ
-asmsuffix=suffixโ says "hey, a file with this suffix is an assembly language file" ๐ ๏ธ-byteswapioโ swaps bytes from big-endian to little-endian or vice versa on input/output of unformatted Fortran data. Use this to read/write Fortran unformatted data files that are compatible with ones produced on Sun or SGI systems ๐-csuffix=suffixโ defines that a file with the given suffix is a C source file ๐-fsuffix=suffixโ defines that a file with the given suffix is a Fortran source file ๐-FSUFFIX=suffixโ also defines that a file with the given suffix is a Fortran source file (yes, uppercase bestie, it's a whole thing) ๐-cuda[=option[,option...]โ enables CUDA Fortran, adds CUDA include paths, and links with the CUDA runtime libraries.-cudais required on the link line. If-cudais used in compilation, it must also be used for linking. For target-specific options, pls refer to-gpu. For linking additional CUDA libraries (like math libraries), refer to-cudalib. Use these sub-options to tailor the compilation of CUDA Fortran accelerator regions:charstringโ enables limited support for character strings in GPU kernels ๐คmadconstโ puts Module Array Descriptors in CUDA Constant Memory ๐ง
-i2โ treatsINTEGERvariables as two bytes.-i4โ treatsINTEGERvariables as four bytes.-i8โ treats defaultINTEGERandLOGICALvariables as eight bytes. For operations involving integers, use 64-bits for computations. ๐ข-i8storageโ allocates 8 bytes forINTEGERandLOGICAL.-Mallocatable[=95|03]โ selects whether to use Fortran 1995 or Fortran 2003 semantics for assignments to allocatable objects and allocatable components of derived types. Fortran 1995 semantics require the user to allocate the object or component and that an array object or component be conformant before the assignment. Fortran 2003 semantics require the compiler to add code to check whether the object or component is allocated and whether an array object is conformant before the assignment, and to allocate or reallocate if not. ๐ค-Mbackslash,-Mnobackslash(default) โ treat (or don't treat) backslash as a normal (non-escape) character in strings.-Mnobackslashcauses the standard C backslash escape sequences to be recognized in quoted strings;-Mbackslashcauses the backslash to be treated like any other character. ๐-Mbyteswapioโ swaps bytes from big-endian to little-endian or vice versa on input/output of unformatted Fortran data. Use of this option enables reading/writing of Fortran unformatted data files compatible with those produced on Sun or SGI systems. ๐-Mcray=pointerโ forces Cray Fortran (CF77) compatibility with respect to the listed options. Possible options include:pointerโ for purposes of optimization, assume that pointer-based variables do not overlap the storage of any other variable. ๐ง
-Mcuda[=option[,option...]โ this option has been deprecated, please refer to-cuda. It enables CUDA (and CUDA Fortran), and links with the CUDA libraries.-Mcudais required on the link line if there are no CUDA Fortran source files specified on the command line. If-Mcudais used in compilation, it must also be used for linking. โ ๏ธ-Mdalign(default),-Mnodalignโ align (don't align) doubles in structures on 8-byte boundaries.-Mnodalignmay lead to data alignment exceptions. ๐-Mdclchk,-Mnodclchk(default) โ require (don't require) that all variables be declared.-Mdefaultunit,-Mnodefaultunit(default) โ treat (don't treat)'*'as stdout/stdin regardless of the status of units 6/5.-Mnodefaultunitcauses*to be a synonym for 5 on input and 6 on output;-Mdefaultunitcauses*to be a synonym for stdin on input and stdout on output. ๐ฆ-Mdlines,-Mnodlines(default) โ treat (don't treat) lines beginning withDin column 1 as executable statements, ignoring theD.-Mdollar=charโ sets the character used to replace dollar signs in names to be char. Default is an underscore (_). ๐ฒ-Mextendโ allows 132-column source lines. ๐-Mfixedโ processes Fortran source using fixed form specifications. The-Mfreeoptions specify free form formatting. By default files with a.for.Fextension use fixed form formatting.-Mfree,-Mfreeform,-Mnofree,-Mnofreeformโ process Fortran source using free form specifications. The-Mnofreeand-Mfixedoptions specify fixed form formatting. By default files with a.f90,.F90,.f95or.F95extension use freeform formatting. ๐ธ-Mi4(default),-Mnoi4โ treat (don't treat)INTEGERasINTEGER*4.-Mnoi4treatsINTEGERasINTEGER*2.-Miomutex,-Mnoiomutex(default) โ generate (don't generate) critical section calls around Fortran I/O statements. ๐-Mlibsuffix=suffixโ defines that a file with the given suffix is an object library file. ๐-Mllalign(default),-Mnollalignโ align (don't align) long longs orINTEGER*8in structures or common blocks on 8-byte boundaries.-Mllalignis the default.-Mnomainโ when the link step is called, don't include the object file which calls the Fortran main program. Useful for using thenvfortrandriver to link programs with the main program written in C or C++ and one or more subroutines written in Fortran. ๐ซถ-Mobjsuffix=suffixโ defines that a file with the given suffix is a binary object file.-Monetrip,-Mnoonetrip(default) โ force (don't force) eachDOloop to be iterated at least once. ๐-Mr8,-Mnor8(default) โ treat (don't treat)REALasDOUBLE PRECISIONand real constants as double precision constants.-Mr8intrinsics [=float],-Mnor8intrinsics(default) โ treat (don't treat) the intrinsicsCMPLXasDCMPLXandREALasDBLE.floatโ also treat theFLOATintrinsic asDBLE. ๐ง
-Mrecursive,-Mnorecursive(default) โ allocate (don't allocate) local variables on the stack, thus allowing recursion.SAVEd, data-initialized, or namelist members are always allocated statically, regardless of the setting of this switch. ๐-Mref_externals,-Mnoref_externals(default) โ force (don't force) references to names appearing inEXTERNALstatements.-Msave,-Mnosave(default) โ assume (don't assume) that all local variables are subject to theSAVEstatement.-Msavemay allow many older Fortran programs to run but can greatly reduce performance. โ ๏ธ-Msignextend(default),-Mnosignextendโ sign extend (don't sign extend) when a narrowing conversion overflows. For example, when-Msignextendis in effect and an integer containing the value65535is converted to a short, the value of the short will be-1. ANSI C specifies that the result of such conversions are undefined. ๐ฌ-Mstack_arrays,-Mnostack_arrays(default) โ allocate automatic arrays on the stack (on the heap). ๐๏ธ-Mstandardโ flags non-ANSI-Fortran usage. ๐ฉ-Msyntax-onlyโ performs only syntax checking, semantic checking, and Fortran module (.mod) file generation. โ-Munixlogical,-Mnounixlogical(default) โ when-Munixlogicalis in effect, a logical is considered to be.TRUE.if its value is non-zero and.FALSE.otherwise. When-Mnounixlogicalis in effect (the default), a logical considered to be.TRUE.if its value is odd and.FALSE.if its value is even. ๐ค-Mupcase,-Mnoupcase(default) โ preserve (don't preserve) case in names.-Mnoupcasecauses all names to be converted to lower case. Note that, if-Mupcaseis used, then variable name'X'is different than variable name'x', and keywords must be in lower case. ๐-module directoryโ save/search for module files in directory. ๐-Munlink_moduleโ instructsnvfortranto unlink a symlink to desired module file before writing out the module file. Without this option,nvfortranwill follow the symlink and write the module file to the symlink's target, provided it has permission to write there. ๐-r4โ interpretsDOUBLE PRECISIONvariables asREAL.-r8โ interpretsREALvariables asDOUBLE PRECISION. Equivalent to using the options-Mr8and-Mr8intrinsics. โจ-Wh,option[,option...]โ passes each comma-delimited option to the Fortran 90/95 front end. ๐จ
๐ Target-specific Options ๐
Now we're talking accelerators, bestie. This is where you tell the compiler how to make your code go zoom on GPUs and other fancy hardware. Buckle up ๐๏ธ๐จ
-accโ enables OpenACC pragmas and directives to explicitly parallelize regions of code for execution by accelerator devices. See the-gpuflag to select options specific to NVIDIA GPUs. The options are:autopar(default),noautoparโ enable loop autoparallelization within parallel constructs. (autoparis the default;noautoparturns it off.) ๐gpu(default) โ compile OpenACC directives for parallel execution on the GPU. ๐ฎhostโ compile OpenACC directives for serial execution on the host CPU. ๐ฅ๏ธlegacyโ suppress warnings about deprecated PGI accelerator directives. ๐ตmulticoreโ compile OpenACC directives for parallel execution on the host CPU. ๐งตroutineseq,noroutineseq(default) โ compile every routine for the device, as if it had aroutine seqdirective. ๐strictโ issue warnings when accelerator directives are encountered which do not adhere to the OpenACC standard. โ ๏ธsyncโ ignoreasyncclauses, and run every data transfer and kernel launch on the default sync queue. ๐verystrictโ abort compilation with a fatal error when an accelerator directive is encountered which does not adhere to the OpenACC standard. ๐wait(default),nowaitโ wait for each compute kernel to finish. (waitis the default;nowaitdoesn't wait.) โณ
-noaccโ disables OpenACC directives and does not link with OpenACC libraries. ๐ซ-gpu=optionโ use the following sub-options to tailor the compilation of target accelerator regions:
โฆand that's exactly where this part ends, bestie โ the -gpu sub-options are coming at you in the next drop ๐
โจ
okay so, weโre still inside the -gpu suboption roster โ and every single little flag is getting its moment, bestie ๐
โจ:
autocompareโ Automatically compare CPU/GPU results. Accelerated code sections will be run in redundant mode, and data will be compared whenever it would ordinarily be moved off the accelerator.ccXYโ Generate code for a device with compute capability XY. Multiple compute capabilities can be specified, and one version will be generated for each. By default, the compiler will detect the compute capability for each installed GPU. Use-help -gputo see the valid compute capabilities for your installation.ccallโ Generate code for all compute capabilities supported for this target and by the selected CUDA Toolkit version.ccnativeโ Detects the visible GPUs on the system and generates codes for them. If no device is available the default compute capability will be used (cc50).ccall-majorโ Compile for all major supported compute capabilities (does not include PTX for the highest major virtual architecture, see-gpu=[no]rdcoption for that support).cudaX.Yโ Use CUDA X.Y Toolkit compatibility, where installed.deepcopyโ Enable Full Deepcopy support in OpenACC Fortran.fastmathโ Enable the fast math library, which includes faster, but lower precision, implementations of certain math and intrinsic functions.flushz,noflushz(default) โ Enable (disable) flush-to-zero mode on the GPU.fma,nofmaโ Generate (do not) fused multiply-add operations on the GPU. This is enabled by default at optimization level-O1.implicitsections,noimplicitsections(default) โ Change (do not change) array element references in OpenACC and OpenMP data clause to array sections references.interceptdeallocations,nointerceptdeallocationsโ Intercept (do not intercept) LIBC function calls (e.g.free) and call the corresponding CUDA memory deallocation version if address is in pinned or managed memory, regular version otherwise.keepbinโ Keep the generated CUDA binary, with a.cubinsuffix.keepgpuโ Keep the generated CUDA GPU source files, with a.gpusuffix.keepltoirโ Keep the generated GPU LTOIR files, with a.ltoirsuffix. Works only when-gpu=ltois enabled.keepptxโ Keep the generated portable assembly files, with a.ptxsuffix.lineinfo,nolineinfo(default) โ Generate debugging line information.loadcache:[L1|L2]โ Generate code to cache global memory loads in the L1 or L2 hardware cache.ltoโ Enable Device Link Ltime Optimization (Device LTO).maxregcount:nโ Set the maximum number of registers to use in the generated GPU code.managedโ Allocate any dynamically allocated data in CUDA Managed memory. This option must appear in both the compile and link lines. This option may not be used with-gpu=pinned.interceptโ Intercept LIBC function calls (e.g.free) and call their managed memory version if address is in managed memory, regular version otherwise.
nomanagedโ Do not allocate any dynamically allocated data in CUDA Managed memory. Use with-stdparto prevent that flag's implicit use of-gpu=managedwhen CUDA Managed memory capability is detected.nounifiedโ Do not compile for CUDA Unified memory capability. Use with-stdparto prevent that flag's implicit use of-gpu=unifiedwhen CUDA Unified memory capability is detected.pinnedโ Allocate any dynamically allocated data in CUDA Pinned host memory. This option must appear in both the compile and link lines. This option may not be used with-gpu=managed|unified.interceptโ Intercept LIBC function calls (e.g.free) and call their pinned memory version if address is in pinned memory, regular version otherwise.
mem:[mode]โ Select GPU memory mode from one of the following options:separate,managed,unified. This option cannot be combined with-gpu=pinned,gpu=managedor-gpu=unified.mem:separateโ All data are in separate CPU and GPU memories. Explicit memory copies are performed when data are accessed from both CPU and GPU.mem:managedโ Allocate any dynamically allocated data in CUDA Managed Memory. Data that are not allocated dynamically are in separate GPU memory and are copied explicitly between CPU and GPU memories. This option must appear in both the compile and link lines.mem:unifiedโ Compile for full CUDA Unified Memory capability, where system memory is accessible from the GPU. All variables in the CPU code are accessible from the GPU without explicit directives or attributes. This mode utilizes system and managed memory for dynamically allocated data unless explicit behavior is set through-gpu=mem:unified:[no]managedallocsubflags. This option must appear in both the compile and link lines.
mem:unified:managedalloc,mem:unified:nomanagedallocโ Allocate (do not allocate) any dynamically allocated data in CUDA Managed Memory.mem:separate:pinnedalloc,mem:separate:nopinnedallocโ Allocate (do not allocate) any dynamically allocated data in CUDA Pinned host memory.ptxinfoโ Print ptxas information.rdc(default),nordcโ Generate (do not generate) relocatable device code for separate compilation, and invoke the device linker before the host linker at the link step.redundantโ Run accelerated code redundantly on CPU. Implied by autocompare.safecacheโ Allow variable-sized array sections in cache directives; compiler assumes they fit into CUDA shared memory.sm_XYโ Generate code for a device with compute capability XY. Multiple compute capabilities can be specified, and one version will be generated for each. By default, the compiler will detect the compute capability for each installed GPU. Use-help -gputo see the valid compute capabilities for your installation.stacklimit:limit(default),nostacklimitโ ๐จ This option has been deprecated and will be removed in a future release. Give an error if the total stack size of a kernel or procedure exceedslimitKBytes. The default isstacklimit:512.tripcount:hostโ Calculate loop trip counts on the host for some compute constructs. This is the default behavior when-gpu=tripcountis not specified. Note that this behavior is not compliant with the OpenACC specification. To ensure compliance with the specification, please use-gpu=tripcount:device.tripcount:deviceโ Calculate loop trip counts on the device for some compute constructs. Note that this behavior is compliant with the OpenACC specification, though it is not the default behavior. To explicitly enable the default behavior, please use-gpu=tripcount:host.tripcount:warn,tripcount:nowarnโ Enable (disable) compile-time warnings when loop trip counts are calculated on the host instead of on the device.tripcount:check,tripcount:nocheckโ Insert (do not insert) runtime checks to ensure the trip count value calculated on the device matches the trip count value calculated on the host. To enable reporting of differences, set the environment variableNVCOMPILER_ACC_CHECK_TRIPCOUNT.unifiedโ Compile for CUDA Unified memory capability, where system memory is accessible from the GPU. All variables in the CPU code are accessible from the GPU without explicit directives or attributes. This mode utilizes system and managed memory for dynamically allocated data unless explicit behavior is set through-gpu=[no]managed. This option must appear in both the compile and link lines. This option may not be used with-gpu=pinned.interceptโ Intercept LIBC function calls (e.g.free) and call their unified version if address is in unified memory, regular version otherwise.
unroll,nounrollโ Automatically (do not) unroll inner loops. This is enabled by default at optimization level-O3.
and now the floating-point behavior tea, because precision is literally a whole personality ๐:
-Kieee,-Knoieee(default) โ Perform floating-point operations in strict conformance with the IEEE 754 standard. Some optimizations are disabled with-Kieee, and a more accurate math library is used. The default-Knoieeeuses faster but very slightly less accurate methods.-Ktrap=option[,option]...โ Controls the behavior of the processor when floating-point exceptions occur during program execution. Possible options include:denormโ Trap on denormalized operands.divzโ Trap on divide by zero.fpโ Trap on floating-point exceptions.inexactโ Trap on inexact result.invโ Trap on invalid operation.none(default) โ Disable all traps.-Ktrap=inv,none,ovfimplies-Ktrap=ovf.ovfโ Trap on floating-point overflow.unfโ Trap on floating-point underflow.-Ktrapis only meaningful when compiling a C/C++ main function or Fortran main program.
๐ซถ also, -Ktrap=fp is shorthand for -Ktrap=divz,inv,ovf.
these options are literally the processor's floating-point exception mask bits, bestie ๐ normally those mask bits are enabled, which means floating-point exceptions get masked โ the processor recovers and keeps going like nothing happened. but if a mask bit is off (unmasked) and the matching exception pops off, execution terminates with a floating-point exception (Linux FPE signal). no cap, that's the vibe check ๐ญ
-march=targetโ literally the same as-tp, bestie. go read the-tptea for details.-m[no-]daz-ftzโ specifies how denormals are handled by the processor at runtime.-mno-daz-ftzmeans denormal operands and results are honored โ shorthand for-Mnodaz -Mnoflushz.-mdaz-ftzis the default setting and says denormal operands and results are treated as zero โ shorthand for-Mdaz -Mflushz.-Mdaz,-Mnodazโ enable [disable] mode to treat denormal (subnormal) floating-point operands as zero.-Mdazis the default setting for x86_64 and aarch64 processors ๐ซถ-Mflushz,-Mnoflushzโ enable [disable] setting floating-point denormal (subnormal) results to zero.-Mflushzis the default setting for x86_64 and aarch64 processors.-Mfpmisalign,-Mnofpmisalignโ allow (don't allow) vector arithmetic instructions with memory operands that are not aligned on 16-byte boundaries. alignment girlies stay stressed ๐-Mfprelaxed [=option[,option,...]],-Mnofprelaxed(default) โ perform (don't perform) certain floating-point operations using relaxed precision when it improves speed. the options are:divโ perform divide using relaxed precision.intrinsicโ perform certain intrinsic functions using relaxed precision.order,noorderโ allow (don't allow) expression reordering, including factoring such as computinga*b+a*casa*(b+c).recipโ perform reciprocal operations using relaxed precision.rsqrtโ perform reciprocal square root (1/sqrt) using relaxed precision.sqrtโ perform square root using relaxed precision.
with no options, -Mfprelaxed will choose to generate relaxed precision code for those operations that generate a significant performance improvement, depending on the target processor โจ
-Mfunc32(default),-Mnofunc32โ align (don't align) functions on 32 byte boundaries.-Mlongbranch,-Mnolongbranch(default) โ enable (disable) long branches.-Msecond_underscore,-Mnosecond_underscore(default) โ add (don't add) a second underscore to the name of a Fortran global if its name already contains an underscore. this option is useful for maintaining compatibility withg77, which adds a second underscore to such symbols by default. retro bestie behavior fr fr.-Mvarargs,-Mnovarargs(default) โ generate code for calls made from Fortran to C routines to use varargs calling sequence.-Mwritable-stringsโ store string constants in the writable data segment.-mcmodel=small|mediumโ pick your memory model vibe:smallโ limits the combined area for a user's object or executable to 4GB. the maximum code size is 2GB.mediumโ allows unrestricted data size. the maximum code size is 2GB.
-stdpar=optionโ enable (ISO Fortran 2018) DO-CONCURRENT. options are:gpuโ (ISO Fortran 2018) DO-CONCURRENT is compiled for parallel execution on the GPU. this option implies-gpu=unifiedon targets with Unified memory capability and-gpu=managedotherwise. GPU main character energy ๐multicoreโ (ISO Fortran 2018) DO-CONCURRENT is compiled for parallel execution on the CPU.
-nostdparโ execute (ISO Fortran 2018) DO-CONCURRENT sequentially. sometimes we chill.-ta=targetโ this option has been deprecated, please refer to-acc. it's giving legacy era, bestie ๐-ta=teslaโ this option has been deprecated, please refer to-acc=gpuand-gpu.-ta=multicoreโ this option has been deprecated, please refer to-acc=multicore.-ta=hostโ this option has been deprecated, please refer to-acc=host.
-target=optionโ select the target for all parallel programming paradigms used (OpenACC, OpenMP, Standard Languages). possibilities are:gpuโ globally set the target device to an NVIDIA GPU.multicoreโ globally set the target device to the host CPU.
-tp=targetโ specify the type of the target processor. issue:
nvfortran -help -tp
to display the list of recognized target processors ๐
๐ FILES ๐
a.outโ executable output filefile.aโ library of object filesfile.fโ fixed-format Fortran source filefile.Fโ fixed-format Fortran source file that requires preprocessingfile.f90โ free-format Fortran source filefile.F90โ free-format Fortran source file that requires preprocessingfile.f95โ free-format Fortran source filefile.F95โ free-format Fortran source file that requires preprocessingfile.f03โ free-format Fortran source filefile.F03โ free-format Fortran source file that requires preprocessingfile.forโ fixed-format Fortran source filefile.fppโ fixed-format Fortran source file that requires preprocessingfile.cufโ free-format CUDA Fortran source filefile.CUFโ free-format CUDA Fortran source file that requires preprocessingfile.ipaโ InterProcedural Analyzer (IPA) filefile.ipoโ InterProcedural Analyzer (IPA) filefile.oโ object filefile.sโ assembler source file.mynvfortranrcโ you may add custom switches or make other additions tonvfortranby creating a file named.mynvfortranrcin your home directory. customizing your compiler? obsessed ๐
the installation of this version of the compiler resides in Basedir/Linux_x86_64/dev/; other versions may coexist in Basedir/Linux_x86_64/release/. Basedir is the root of the compiler installation directory, specified by the installer. the default is /opt/nvidia/hpc_sdk.
the compiler installation subdirectories are:
compilers/bin/โ compiler and tool executables and configuration files (rcfiles).compilers/include/โ compiler include files.compilers/lib/โ runtime libraries and object files.comm_libs/โ communication libraries, including NCCL and NVSHMEM.math_libs/โ math libraries, including cuBLAS, cuTENSOR, cuSPARSE, cuFFT, cuSOLVER, and cuRAND.profilers/โ profilers, including Nsight Compute and Nsight Systems.
๐ SEE ALSO ๐
nvc (1), nvc++ (1), and the NVIDIA User's Guide. go read the extended universe, bestie ๐โจ
๐ฉบ DIAGNOSTICS ๐ฉบ
the compiler produces information and error messages as it translates the input program. the linker and assembler may issue their own error messages too, so don't blame the compiler for everything ๐
okay that's the whole page, bestie โ nvfortran(1), September 2026, signing off ๐๐
๐ฆ where this page comes from
- arch rolling: nvhpc-compilers 26.9-1 ยท LicenseRef-NVIDIA-HPC-SDK
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms