diff --git a/docs/.doxygen/Doxyfile b/docs/.doxygen/Doxyfile index 7f89f635ed..69e044b6bb 100644 --- a/docs/.doxygen/Doxyfile +++ b/docs/.doxygen/Doxyfile @@ -1,4 +1,4 @@ -# Doxyfile 1.8.17 +# Doxyfile 1.9.5 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -12,6 +12,16 @@ # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). +# +# Note: +# +# Use doxygen to compare the used configuration file with the template +# configuration file: +# doxygen -x [configFile] +# Use doxygen to compare the used configuration file with the template +# configuration file without replacing the environment variables or CMake type +# replacement variables: +# doxygen -x_noenv [configFile] #--------------------------------------------------------------------------- # Project related configuration options @@ -60,16 +70,28 @@ PROJECT_LOGO = OUTPUT_DIRECTORY = docBin -# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 +# sub-directories (in 2 levels) under the output directory of each output format +# and will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes -# performance problems for the file system. +# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to +# control the number of sub-directories. # The default value is: NO. CREATE_SUBDIRS = NO +# Controls the number of sub-directories that will be created when +# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every +# level increment doubles the number of directories, resulting in 4096 +# directories at level 8 which is the default and also the maximum value. The +# sub-directories are organized in 2 levels, the first level always has a fixed +# numer of 16 directories. +# Minimum value: 0, maximum value: 8, default value: 8. +# This tag requires that the tag CREATE_SUBDIRS is set to YES. + +CREATE_SUBDIRS_LEVEL = 8 + # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode @@ -81,26 +103,18 @@ ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, +# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English +# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, +# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with +# English messages), Korean, Korean-en (Korean with English messages), Latvian, +# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, +# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, +# Swedish, Turkish, Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English -# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all generated output in the proper direction. -# Possible values are: None, LTR, RTL and Context. -# The default value is: None. - -OUTPUT_TEXT_DIRECTION = None - # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. @@ -227,6 +241,14 @@ QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO +# By default Python docstrings are displayed as preformatted text and doxygen's +# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the +# doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as doxygen documentation. +# The default value is: YES. + +PYTHON_DOCSTRING = YES + # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. @@ -250,25 +272,19 @@ TAB_SIZE = 4 # the documentation. An alias has the form: # name=value # For example adding -# "sideeffect=@par Side Effects:\n" +# "sideeffect=@par Side Effects:^^" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines (in the resulting output). You can put ^^ in the value part of an -# alias to insert a newline as if a physical newline was in the original file. -# When you need a literal { or } or , in the value part of an alias you have to -# escape them by means of a backslash (\), this can lead to conflicts with the -# commands \{ and \} for these it is advised to use the version @{ and @} or use -# a double escape (\\{ and \\}) +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) ALIASES = -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding "class=itcl::class" -# will allow you to use the command class in the itcl::class meaning. - -TCL_SUBST = - # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all @@ -310,18 +326,21 @@ OPTIMIZE_OUTPUT_SLICE = NO # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and # language is one of the parsers supported by doxygen: IDL, Java, JavaScript, -# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, -# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser # tries to guess whether the code is fixed or free formatted code, this is the -# default for Fortran type files), VHDL, tcl. For instance to make doxygen treat -# .inc files as Fortran files (default is PHP), and .f files as C (default is -# Fortran), use: inc=Fortran f=C. +# default for Fortran type files). For instance to make doxygen treat .inc files +# as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. # # Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. +# the files are not read by doxygen. When specifying no_extension you should add +# * to the FILE_PATTERNS. +# +# Note see also the list of default file extension mappings. EXTENSION_MAPPING = @@ -360,7 +379,7 @@ AUTOLINK_SUPPORT = YES # diagrams that involve STL classes more complete and accurate. # The default value is: NO. -BUILTIN_STL_SUPPORT = +BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. @@ -455,6 +474,19 @@ TYPEDEF_HIDES_STRUCT = YES LOOKUP_CACHE_SIZE = 0 +# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use +# during processing. When set to 0 doxygen will based this on the number of +# cores available in the system. You can set it explicitly to a value larger +# than 0 to get more control over the balance between CPU load and processing +# speed. At this moment only the input processing can be done using multiple +# threads. Since this is still an experimental feature the default is set to 1, +# which effectively disables parallel processing. Please report any issues you +# encounter. Generating dot graphs in parallel is controlled by the +# DOT_NUM_THREADS setting. +# Minimum value: 0, maximum value: 32, default value: 1. + +NUM_PROC_THREADS = 1 + #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- @@ -518,6 +550,13 @@ EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO +# If this flag is set to YES, the name of an unnamed parameter in a declaration +# will be determined by the corresponding definition. By default unnamed +# parameters remain unnamed in the output. +# The default value is: YES. + +RESOLVE_UNNAMED_PARAMS = YES + # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation @@ -555,12 +594,20 @@ HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO -# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file -# names in lower-case letters. If set to YES, upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# (including Cygwin) ands Mac users are advised to set this option to NO. -# The default value is: system dependent. +# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# able to match the capabilities of the underlying filesystem. In case the +# filesystem is case sensitive (i.e. it supports files in the same directory +# whose names only differ in casing), the option must be set to YES to properly +# deal with such files in case they appear in the input. For filesystems that +# are not case sensitive the option should be set to NO to properly deal with +# output files written for symbols that only differ in casing, such as for two +# classes, one named CLASS and the other named Class, and to also support +# references to files without having to specify the exact matching casing. On +# Windows (including Cygwin) and MacOS, users should typically set this option +# to NO, whereas on Linux or other Unix flavors it should typically be set to +# YES. +# Possible values are: SYSTEM, NO and YES. +# The default value is: SYSTEM. CASE_SENSE_NAMES = NO @@ -578,6 +625,12 @@ HIDE_SCOPE_NAMES = NO HIDE_COMPOUND_REFERENCE= NO +# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class +# will show which file needs to be included to use the class. +# The default value is: YES. + +SHOW_HEADERFILE = YES + # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. @@ -735,7 +788,8 @@ FILE_VERSION_FILTER = # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. +# will be used as the name of the layout file. See also section "Changing the +# layout of pages" for information. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE @@ -781,24 +835,35 @@ WARNINGS = YES WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. +# potential errors in the documentation, such as documenting some parameters in +# a documented function twice, or documenting parameters that don't exist or +# using markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES +# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete +# function parameter documentation. If set to NO, doxygen will accept that some +# parameters have no documentation without warning. +# The default value is: YES. + +WARN_IF_INCOMPLETE_DOC = YES + # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return -# value. If set to NO, doxygen will only warn about wrong or incomplete -# parameter documentation, but not about the absence of documentation. If -# EXTRACT_ALL is set to YES then this flag will automatically be disabled. +# value. If set to NO, doxygen will only warn about wrong parameter +# documentation, but not about the absence of documentation. If EXTRACT_ALL is +# set to YES then this flag will automatically be disabled. See also +# WARN_IF_INCOMPLETE_DOC # The default value is: NO. WARN_NO_PARAMDOC = NO # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when -# a warning is encountered. +# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS +# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the doxygen process doxygen will return with a non-zero status. +# Possible values are: NO, YES and FAIL_ON_WARNINGS. # The default value is: NO. WARN_AS_ERROR = NO @@ -809,13 +874,27 @@ WARN_AS_ERROR = NO # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) +# See also: WARN_LINE_FORMAT # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" +# In the $text part of the WARN_FORMAT command it is possible that a reference +# to a more specific place is given. To make it easier to jump to this place +# (outside of doxygen) the user can define a custom "cut" / "paste" string. +# Example: +# WARN_LINE_FORMAT = "'vi $file +$line'" +# See also: WARN_FORMAT +# The default value is: at line $line of file $file. + +WARN_LINE_FORMAT = "at line $line of file $file" + # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard -# error (stderr). +# error (stderr). In case the file specified cannot be opened for writing the +# warning and error messages are written to standard error. When as file - is +# specified the warning and error messages are written to standard output +# (stdout). WARN_LOGFILE = @@ -829,18 +908,29 @@ WARN_LOGFILE = # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. -INPUT = mainpage.md \ +INPUT = mainpage.md \ ../../include/hip # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: https://www.gnu.org/software/libiconv/) for the list of -# possible encodings. +# documentation (see: +# https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# See also: INPUT_FILE_ENCODING # The default value is: UTF-8. INPUT_ENCODING = UTF-8 +# This tag can be used to specify the character encoding of the source files +# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify +# character encoding on a per file pattern basis. Doxygen will compare the file +# name with each pattern and apply the encoding instead of the default +# INPUT_ENCODING) if there is a match. The character encodings are a list of the +# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding +# "INPUT_ENCODING" for further information on supported encodings. + +INPUT_FILE_ENCODING = + # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. @@ -849,12 +939,14 @@ INPUT_ENCODING = UTF-8 # need to set EXTENSION_MAPPING for the extension otherwise the files are not # read by doxygen. # +# Note the list of default checked file patterns might differ from the list of +# default file extension mappings. +# # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), -# *.doc (to be provided as doxygen C comment), *.txt (to be provided as doxygen -# C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f, *.for, *.tcl, *.vhd, +# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, +# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C +# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, # *.vhdl, *.ucf, *.qsf and *.ice. FILE_PATTERNS = *.c \ @@ -932,7 +1024,7 @@ EXCLUDE_PATTERNS = # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test +# ANamespace::AClass, ANamespace::*Test # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* @@ -980,6 +1072,11 @@ IMAGE_PATH = # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. # +# Note that doxygen will use the data processed and written to standard output +# for further processing, therefore nothing else, like debug statements or used +# commands (so in case of a Windows batch file always use @echo OFF), should be +# written to standard output. +# # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. @@ -1021,6 +1118,15 @@ FILTER_SOURCE_PATTERNS = USE_MDFILE_AS_MAINPAGE = +# The Fortran standard specifies that for fixed formatted Fortran code all +# characters from position 72 are to be considered as comment. A common +# extension is to allow longer lines before the automatic comment starts. The +# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can +# be processed before the automatic comment starts. +# Minimum value: 7, maximum value: 10000, default value: 72. + +FORTRAN_COMMENT_AFTER = 72 + #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- @@ -1108,16 +1214,24 @@ USE_HTAGS = NO VERBATIM_HEADERS = YES # If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the -# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the -# cost of reduced performance. This can be particularly helpful with template -# rich C++ code for which doxygen's built-in parser lacks the necessary type -# information. +# clang parser (see: +# http://clang.llvm.org/) for more accurate parsing at the cost of reduced +# performance. This can be particularly helpful with template rich C++ code for +# which doxygen's built-in parser lacks the necessary type information. # Note: The availability of this option depends on whether or not doxygen was # generated with the -Duse_libclang=ON option for CMake. # The default value is: NO. CLANG_ASSISTED_PARSING = NO +# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS +# tag is set to YES then doxygen will add the directory of each input to the +# include path. +# The default value is: YES. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_ADD_INC_PATHS = YES + # If clang assisted parsing is enabled you can provide the compiler with command # line options that you would normally use when invoking the compiler. Note that # the include paths will already be set by doxygen for the files and directories @@ -1127,10 +1241,13 @@ CLANG_ASSISTED_PARSING = NO CLANG_OPTIONS = # If clang assisted parsing is enabled you can provide the clang parser with the -# path to the compilation database (see: -# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) used when the files -# were built. This is equivalent to specifying the "-p" option to a clang tool, -# such as clang-check. These options will then be passed to the parser. +# path to the directory containing a file called compile_commands.json. This +# file is the compilation database (see: +# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the +# options used when the source files were built. This is equivalent to +# specifying the -p option to a clang tool, such as clang-check. These options +# will then be passed to the parser. Any options specified with CLANG_OPTIONS +# will be added as well. # Note: The availability of this option depends on whether or not doxygen was # generated with the -Duse_libclang=ON option for CMake. @@ -1147,13 +1264,6 @@ CLANG_DATABASE_PATH = ALPHABETICAL_INDEX = YES -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in -# which the alphabetical index list will be split. -# Minimum value: 1, maximum value: 20, default value: 5. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -COLS_IN_ALPHA_INDEX = 5 - # In case all classes in a project start with a common prefix, all classes will # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag # can be used to specify a prefix (or a list of prefixes) that should be ignored @@ -1251,9 +1361,26 @@ HTML_EXTRA_STYLESHEET = ../_doxygen/extra_stylesheet.css HTML_EXTRA_FILES = +# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output +# should be rendered with a dark or light theme. Default setting AUTO_LIGHT +# enables light output unless the user preference is dark output. Other options +# are DARK to always use dark mode, LIGHT to always use light mode, AUTO_DARK to +# default to dark mode unless the user prefers light mode, and TOGGLE to let the +# user toggle between dark and light mode via a button. +# Possible values are: LIGHT Always generate light output., DARK Always generate +# dark output., AUTO_LIGHT Automatically set the mode according to the user +# preference, use light mode if no preference is set (the default)., AUTO_DARK +# Automatically set the mode according to the user preference, use dark mode if +# no preference is set. and TOGGLE Allow to user to switch between light and +# dark mode via a button.. +# The default value is: AUTO_LIGHT. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE = AUTO_LIGHT + # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see +# this color. Hue is specified as an angle on a color-wheel, see # https://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. @@ -1263,7 +1390,7 @@ HTML_EXTRA_FILES = HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A +# in the HTML output. For a value of 0 the output will use gray-scales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1324,10 +1451,11 @@ HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: https://developer.apple.com/xcode/), introduced with OSX -# 10.5 (Leopard). To create a documentation set, doxygen will generate a -# Makefile in the HTML output directory. Running make will produce the docset in -# that directory and running make install will install the docset in +# environment (see: +# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To +# create a documentation set, doxygen will generate a Makefile in the HTML +# output directory. Running make will produce the docset in that directory and +# running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at # startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy # genXcode/_index.html for more information. @@ -1344,6 +1472,13 @@ GENERATE_DOCSET = NO DOCSET_FEEDNAME = "Doxygen generated docs" +# This tag determines the URL of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDURL = + # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. @@ -1369,8 +1504,12 @@ DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on -# Windows. +# on Windows. In the beginning of 2021 Microsoft took the original page, with +# a.o. the download links, offline the HTML help workshop was already many years +# in maintenance mode). You can download the HTML help workshop from the web +# archives at Installation executable (see: +# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo +# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML @@ -1400,7 +1539,7 @@ CHM_FILE = HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated -# (YES) or that it should be included in the master .chm file (NO). +# (YES) or that it should be included in the main .chm file (NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. @@ -1445,7 +1584,8 @@ QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace -# (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1453,8 +1593,8 @@ QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual- -# folders). +# Folders (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1462,16 +1602,16 @@ QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom -# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- -# filters). +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- -# filters). +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = @@ -1483,9 +1623,9 @@ QHP_CUST_FILTER_ATTRS = QHP_SECT_FILTER_ATTRS = -# The QHG_LOCATION tag can be used to specify the location of Qt's -# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the -# generated .qhp file. +# The QHG_LOCATION tag can be used to specify the location (absolute path +# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# run qhelpgenerator on the generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = @@ -1528,16 +1668,28 @@ DISABLE_INDEX = NO # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. +# further fine tune the look of the index (see "Fine-tuning the output"). As an +# example, the default style sheet generated by doxygen has an example that +# shows how to put an image at the root of the tree instead of the PROJECT_NAME. +# Since the tree basically has the same information as the tab index, you could +# consider setting DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = NO +# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the +# FULL_SIDEBAR option determines if the side bar is limited to only the treeview +# area (value NO) or if it should extend to the full height of the window (value +# YES). Setting this to YES gives a layout similar to +# https://docs.readthedocs.io with more room for contents, but less room for the +# project logo, title, and description. If either GENERATE_TREEVIEW or +# DISABLE_INDEX is set to NO, this option has no effect. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FULL_SIDEBAR = NO + # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # @@ -1562,6 +1714,24 @@ TREEVIEW_WIDTH = 250 EXT_LINKS_IN_WINDOW = NO +# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email +# addresses. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +OBFUSCATE_EMAILS = YES + +# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png (the default) and svg (looks nicer but requires the +# pdf2svg or inkscape tool). +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = png + # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML @@ -1571,17 +1741,6 @@ EXT_LINKS_IN_WINDOW = NO FORMULA_FONTSIZE = 10 -# Use the FORMULA_TRANSPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_TRANSPARENT = YES - # The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands # to create new LaTeX commands to be used in formulas as building blocks. See # the section "Including formulas" for details. @@ -1599,11 +1758,29 @@ FORMULA_MACROFILE = USE_MATHJAX = YES +# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. +# Note that the different versions of MathJax have different requirements with +# regards to the different settings, so it is possible that also other MathJax +# settings have to be changed when switching between the different MathJax +# versions. +# Possible values are: MathJax_2 and MathJax_3. +# The default value is: MathJax_2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_VERSION = MathJax_2 + # When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/latest/output.html) for more details. +# the MathJax output. For more details about the output format see MathJax +# version 2 (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 +# (see: +# http://docs.mathjax.org/en/latest/web/components/output.html). # Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. +# compatibility. This is the name for Mathjax version 2, for MathJax version 3 +# this will be translated into chtml), NativeMML (i.e. MathML. Only supported +# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This +# is the name for Mathjax version 3, for MathJax version 2 this will be +# translated into HTML-CSS) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. @@ -1616,22 +1793,29 @@ MATHJAX_FORMAT = HTML-CSS # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of -# MathJax from https://www.mathjax.org before deployment. -# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/. +# MathJax from https://www.mathjax.org before deployment. The default value is: +# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 +# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example +# for MathJax version 2 (see +# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# For example for MathJax version 3 (see +# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): +# MATHJAX_EXTENSIONS = ams # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site -# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. @@ -1678,7 +1862,8 @@ SERVER_BASED_SEARCH = NO # # Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: https://xapian.org/). +# Xapian (see: +# https://xapian.org/). # # See the section "External Indexing and Searching" for details. # The default value is: NO. @@ -1691,8 +1876,9 @@ EXTERNAL_SEARCH = NO # # Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: https://xapian.org/). See the section "External Indexing and -# Searching" for details. +# Xapian (see: +# https://xapian.org/). See the section "External Indexing and Searching" for +# details. # This tag requires that the tag SEARCHENGINE is set to YES. SEARCHENGINE_URL = @@ -1801,29 +1987,31 @@ PAPER_TYPE = a4 EXTRA_PACKAGES = -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the -# generated LaTeX document. The header should contain everything until the first -# chapter. If it is left blank doxygen will generate a standard header. See -# section "Doxygen usage" for information on how to let doxygen write the -# default header to a separate file. +# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for +# the generated LaTeX document. The header should contain everything until the +# first chapter. If it is left blank doxygen will generate a standard header. It +# is highly recommended to start with a default header using +# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty +# and then modify the file new_header.tex. See also section "Doxygen usage" for +# information on how to generate the default header that doxygen normally uses. # -# Note: Only use a user-defined header if you know what you are doing! The -# following commands have a special meaning inside the header: $title, -# $datetime, $date, $doxygenversion, $projectname, $projectnumber, -# $projectbrief, $projectlogo. Doxygen will replace $title with the empty -# string, for the replacement values of the other commands the user is referred -# to HTML_HEADER. +# Note: Only use a user-defined header if you know what you are doing! +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. The following +# commands have a special meaning inside the header (and footer): For a +# description of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_HEADER = -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the -# generated LaTeX document. The footer should contain everything after the last -# chapter. If it is left blank doxygen will generate a standard footer. See +# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for +# the generated LaTeX document. The footer should contain everything after the +# last chapter. If it is left blank doxygen will generate a standard footer. See # LATEX_HEADER for more information on how to generate a default footer and what -# special commands can be used inside the footer. -# -# Note: Only use a user-defined footer if you know what you are doing! +# special commands can be used inside the footer. See also section "Doxygen +# usage" for information on how to generate the default footer that doxygen +# normally uses. Note: Only use a user-defined footer if you know what you are +# doing! # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_FOOTER = @@ -1856,9 +2044,11 @@ LATEX_EXTRA_FILES = PDF_HYPERLINKS = YES -# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate -# the PDF file directly from the LaTeX files. Set this option to YES, to get a -# higher quality PDF documentation. +# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as +# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX +# files. Set this option to YES, to get a higher quality PDF documentation. +# +# See also section LATEX_CMD_NAME for selecting the engine. # The default value is: YES. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -1866,8 +2056,7 @@ USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode # command to the generated LaTeX files. This will instruct LaTeX to keep running -# if errors occur, instead of asking the user for help. This option is also used -# when generating formulas in HTML. +# if errors occur, instead of asking the user for help. # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -1880,16 +2069,6 @@ LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO -# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source -# code with syntax highlighting in the LaTeX output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_SOURCE_CODE = NO - # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. See # https://en.wikipedia.org/wiki/BibTeX and \cite for more info. @@ -1970,16 +2149,6 @@ RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = -# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code -# with syntax highlighting in the RTF output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. -# This tag requires that the tag GENERATE_RTF is set to YES. - -RTF_SOURCE_CODE = NO - #--------------------------------------------------------------------------- # Configuration options related to the man page output #--------------------------------------------------------------------------- @@ -2076,15 +2245,6 @@ GENERATE_DOCBOOK = NO DOCBOOK_OUTPUT = docbook -# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the -# program listings (including syntax highlighting and cross-referencing -# information) to the DOCBOOK output. Note that enabling this will significantly -# increase the size of the DOCBOOK output. -# The default value is: NO. -# This tag requires that the tag GENERATE_DOCBOOK is set to YES. - -DOCBOOK_PROGRAMLISTING = NO - #--------------------------------------------------------------------------- # Configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- @@ -2171,7 +2331,8 @@ SEARCH_INCLUDES = NO # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by the -# preprocessor. +# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of +# RECURSIVE has no effect here. # This tag requires that the tag SEARCH_INCLUDES is set to YES. INCLUDE_PATH = @@ -2263,15 +2424,6 @@ EXTERNAL_PAGES = YES # Configuration options related to the dot tool #--------------------------------------------------------------------------- -# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram -# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to -# NO turns the diagrams off. Note that this option also works with HAVE_DOT -# disabled, but it is recommended to install and use dot, since it yields more -# powerful graphs. -# The default value is: YES. - -CLASS_DIAGRAMS = NO - # You can include diagrams made with dia in doxygen documentation. Doxygen will # then run dia to produce the diagram and insert it in the documentation. The # DIA_PATH tag allows you to specify the directory where the dia binary resides. @@ -2290,7 +2442,7 @@ HIDE_UNDOC_RELATIONS = YES # http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent # Bell Labs. The other options in this section have no effect if this option is # set to NO -# The default value is: YES. +# The default value is: NO. HAVE_DOT = YES @@ -2304,35 +2456,50 @@ HAVE_DOT = YES DOT_NUM_THREADS = 0 -# When you want a differently looking font in the dot files that doxygen -# generates you can specify the font name using DOT_FONTNAME. You need to make -# sure dot is able to find the font, which can be done by putting it in a -# standard location or by setting the DOTFONTPATH environment variable or by -# setting DOT_FONTPATH to the directory containing the font. -# The default value is: Helvetica. +# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of +# subgraphs. When you want a differently looking font in the dot files that +# doxygen generates you can specify fontname, fontcolor and fontsize attributes. +# For details please see Node, +# Edge and Graph Attributes specification You need to make sure dot is able +# to find the font, which can be done by putting it in a standard location or by +# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. Default graphviz fontsize is 14. +# The default value is: fontname=Helvetica,fontsize=10. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10" + +# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can +# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. Complete documentation about +# arrows shapes. +# The default value is: labelfontname=Helvetica,labelfontsize=10. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTNAME = Helvetica +DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10" -# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of -# dot graphs. -# Minimum value: 4, maximum value: 24, default value: 10. +# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes +# around nodes set 'shape=plain' or 'shape=plaintext' Shapes specification +# The default value is: shape=box,height=0.2,width=0.4. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTSIZE = 10 +DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4" -# By default doxygen will tell dot to use the default font as specified with -# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set -# the path where dot can find it using this tag. +# You can set the path where dot can find font specified with fontname in +# DOT_COMMON_ATTR and others dot attributes. # This tag requires that the tag HAVE_DOT is set to YES. DOT_FONTPATH = -# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for -# each documented class showing the direct and indirect inheritance relations. -# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. +# If the CLASS_GRAPH tag is set to YES (or GRAPH) then doxygen will generate a +# graph for each documented class showing the direct and indirect inheritance +# relations. In case HAVE_DOT is set as well dot will be used to draw the graph, +# otherwise the built-in generator will be used. If the CLASS_GRAPH tag is set +# to TEXT the direct and indirect inheritance relations will be shown as texts / +# links. +# Possible values are: NO, YES, TEXT and GRAPH. # The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. CLASS_GRAPH = YES @@ -2346,7 +2513,8 @@ CLASS_GRAPH = YES COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for -# groups, showing the direct groups dependencies. +# groups, showing the direct groups dependencies. See also the chapter Grouping +# in the manual. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2369,10 +2537,32 @@ UML_LOOK = NO # but if the number exceeds 15, the total amount of fields shown is limited to # 10. # Minimum value: 0, maximum value: 100, default value: 10. -# This tag requires that the tag HAVE_DOT is set to YES. +# This tag requires that the tag UML_LOOK is set to YES. UML_LIMIT_NUM_FIELDS = 10 +# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and +# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS +# tag is set to YES, doxygen will add type and arguments for attributes and +# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen +# will not generate fields with class member information in the UML graphs. The +# class diagrams will look similar to the default class diagrams but using UML +# notation for the relationships. +# Possible values are: NO, YES and NONE. +# The default value is: NO. +# This tag requires that the tag UML_LOOK is set to YES. + +DOT_UML_DETAILS = NO + +# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters +# to display on a single line. If the actual line length exceeds this threshold +# significantly it will wrapped across multiple lines. Some heuristics are apply +# to avoid ugly line breaks. +# Minimum value: 0, maximum value: 1000, default value: 17. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_WRAP_THRESHOLD = 17 + # If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and # collaboration graphs will show the relations between templates and their # instances. @@ -2439,6 +2629,13 @@ GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES +# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels +# of child directories generated in directory dependency graphs by dot. +# Minimum value: 1, maximum value: 25, default value: 1. +# This tag requires that the tag DIRECTORY_GRAPH is set to YES. + +DIR_GRAPH_MAX_DEPTH = 1 + # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. For an explanation of the image formats see the section # output formats in the documentation of the dot tool (Graphviz (see: @@ -2446,9 +2643,7 @@ DIRECTORY_GRAPH = YES # Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order # to make the SVG files visible in IE 9+ (other browsers do not have this # requirement). -# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd, -# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo, -# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo, +# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo, # png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and # png:gdiplus:gdiplus. # The default value is: png. @@ -2494,10 +2689,10 @@ MSCFILE_DIRS = DIAFILE_DIRS = # When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the -# path where java can find the plantuml.jar file. If left blank, it is assumed -# PlantUML is not used or called during a preprocessing step. Doxygen will -# generate a warning when it encounters a \startuml command in this case and -# will not generate output for the diagram. +# path where java can find the plantuml.jar file or to the filename of jar file +# to be used. If left blank, it is assumed PlantUML is not used or called during +# a preprocessing step. Doxygen will generate a warning when it encounters a +# \startuml command in this case and will not generate output for the diagram. PLANTUML_JAR_PATH = @@ -2535,18 +2730,6 @@ DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 0 -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not seem -# to support this out of the box. -# -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_TRANSPARENT = NO - # Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) support @@ -2559,14 +2742,18 @@ DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page # explaining the meaning of the various boxes and arrows in the dot generated # graphs. +# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal +# graphical representation for inheritance and collaboration diagrams is used. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. GENERATE_LEGEND = YES -# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot +# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate # files that are used to generate the various graphs. +# +# Note: This setting is not only used for dot files but also for msc temporary +# files. # The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. DOT_CLEANUP = YES diff --git a/docs/.sphinx/_toc.yml.in b/docs/.sphinx/_toc.yml.in index dc07d17d8a..036bd9d60e 100644 --- a/docs/.sphinx/_toc.yml.in +++ b/docs/.sphinx/_toc.yml.in @@ -1,26 +1,35 @@ root: index subtrees: -- caption: User Guide +- caption: User Reference + entries: + - file: .doxygen/docBin/html/index + - file: reference/kernel_language + - file: reference/math_api + - file: reference/glossary + - file: reference/deprecated_api_list +- caption: User How to Guides + entries: + - file: how_to_guides/install.md +- caption: User Tutorials + entries: + - file: tutorials/saxpy.md +- caption: Developer How to Guides + entries: + - file: developer_guide/build +- caption: Legacy Reference + entries: + - file: reference/terms +- caption: Legacy User Guide entries: - file: user_guide/programming_manual - file: user_guide/hip_rtc - file: user_guide/faq +- caption: Legacy How to Guides + entries: + - file: how_to_guides/debugging.md - file: user_guide/hip_porting_guide - file: user_guide/hip_porting_driver_api -- caption: How to Guides - entries: - - file: how_to_guides/install.md - - file: how_to_guides/debugging.md -- caption: Reference - entries: - - file: .doxygen/docBin/html/index - - file: reference/kernel_language - - file: reference/math_api - - file: reference/terms - - file: reference/glossary - - file: reference/deprecated_api_list -- caption: Developer Guide - entries: - - file: developer_guide/build - - file: developer_guide/logging - - file: developer_guide/contributing.md \ No newline at end of file +- caption: Legacy Developer Guide + entries: + - file: developer_guide/logging + - file: developer_guide/contributing.md \ No newline at end of file diff --git a/docs/.sphinx/requirements.in b/docs/.sphinx/requirements.in index 67a925b2c9..5a45df89c6 100644 --- a/docs/.sphinx/requirements.in +++ b/docs/.sphinx/requirements.in @@ -1 +1 @@ -rocm-docs-core[api_reference]==0.11.0 +rocm-docs-core[api_reference]==0.19.0 diff --git a/docs/.sphinx/requirements.txt b/docs/.sphinx/requirements.txt index a52f70a92d..32ac1a0b3f 100644 --- a/docs/.sphinx/requirements.txt +++ b/docs/.sphinx/requirements.txt @@ -1,8 +1,8 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.10 # by the following command: # -# pip-compile requirements.in +# pip-compile ./docs/.sphinx/requirements.in # accessible-pygments==0.0.3 # via pydata-sphinx-theme @@ -41,7 +41,7 @@ docutils==0.16 # myst-parser # pydata-sphinx-theme # sphinx -doxysphinx==3.2.1 +doxysphinx==3.3.4 # via rocm-docs-core fastjsonschema==2.16.2 # via rocm-docs-core @@ -53,18 +53,12 @@ idna==3.3 # via requests imagesize==1.4.1 # via sphinx -importlib-metadata==5.1.0 - # via sphinx -importlib-resources==5.10.4 - # via rocm-docs-core jinja2==3.1.2 # via # myst-parser # sphinx -json5==0.9.11 +libsass==0.22.0 # via doxysphinx -linkify-it-py==1.0.3 - # via myst-parser lxml==4.9.2 # via doxysphinx markdown-it-py==2.1.0 @@ -77,7 +71,9 @@ mdit-py-plugins==0.3.5 # via myst-parser mdurl==0.1.2 # via markdown-it-py -myst-parser[linkify]==1.0.0 +mpire==2.7.1 + # via doxysphinx +myst-parser==1.0.0 # via rocm-docs-core packaging==21.3 # via @@ -94,8 +90,11 @@ pygithub==1.58.2 pygments==2.12.0 # via # accessible-pygments + # mpire # pydata-sphinx-theme # sphinx +pyjson5==1.6.3 + # via doxysphinx pyjwt[crypto]==2.6.0 # via pygithub pynacl==1.5.0 @@ -115,8 +114,8 @@ requests==2.28.1 # via # pygithub # sphinx -rocm-docs-core[api_reference]==0.11.0 - # via -r requirements.in +rocm-docs-core[api_reference]==0.19.0 + # via -r ./docs/.sphinx/requirements.in smmap==5.0.0 # via gitdb snowballstemmer==2.2.0 @@ -156,15 +155,11 @@ sphinxcontrib-qthelp==1.0.3 # via sphinx sphinxcontrib-serializinghtml==1.1.5 # via sphinx +tqdm==4.65.0 + # via mpire typing-extensions==4.4.0 # via pydata-sphinx-theme -uc-micro-py==1.0.1 - # via linkify-it-py urllib3==1.26.11 # via requests wrapt==1.15.0 # via deprecated -zipp==3.11.0 - # via - # importlib-metadata - # importlib-resources diff --git a/docs/index.md b/docs/index.md index a2a7c89f20..5f6906492d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -3,35 +3,98 @@ HIP is a C++ runtime API and kernel language that allows developers to create portable applications for AMD and NVIDIA GPUs from single source code. -## Overview +## User Manual + +These documents are targeted at authors of HIP libraries and applications. + +::::{grid} 1 1 2 2 +:gutter: 1 + +:::{grid-item-card} Reference + +- {doc}`/.doxygen/docBin/html/index` + - {doc}`/.doxygen/docBin/html/modules` +- {doc}`/reference/kernel_language` +- {doc}`/reference/math_api` +- {doc}`/reference/deprecated_api_list` + +::: + +:::{grid-item-card} Understand HIP +::: + +:::{grid-item-card} How-to Guides + +- {doc}`/how_to_guides/install` + +::: + +:::{grid-item-card} Tutorials + +- {doc}`/tutorials/saxpy` + +::: + +:::: + +## Developer Manual + +These documents are targeted at authors contributing to the HIP runtime and +the accompanying host/device compiler. + +::::{grid} 1 1 2 2 +:gutter: 1 + +:::{grid-item-card} Reference +::: + +:::{grid-item-card} Background +::: + +:::{grid-item-card} How-to Guides + +- {doc}`/developer_guide/build` + +::: + +:::{grid-item-card} Tutorials +::: + +:::: + +## Legacy Content + +Materials listed here don't fit well the new documentation system and will be +removed once their contents are appropriately covered. ::::{grid} 1 1 2 2 :gutter: 1 :::{grid-item-card} User Guide + - {doc}`/user_guide/programming_manual` - {doc}`/user_guide/hip_rtc` - {doc}`/user_guide/faq` + ::: :::{grid-item-card} How to Guides -- {doc}`/how_to_guides/install` + - {doc}`/how_to_guides/debugging` + ::: :::{grid-item-card} Reference -- {doc}`/.doxygen/docBin/html/index` - - {doc}`/.doxygen/docBin/html/modules` -- {doc}`/reference/kernel_language` -- {doc}`/reference/math_api` + - {doc}`/reference/terms` -- {doc}`/reference/deprecated_api_list` + ::: :::{grid-item-card} Developer Guide -- {doc}`/developer_guide/build` + - {doc}`/developer_guide/logging` - {doc}`/developer_guide/contributing` + ::: -:::: \ No newline at end of file +:::: diff --git a/docs/tutorials/saxpy.md b/docs/tutorials/saxpy.md new file mode 100644 index 0000000000..1fed2ce118 --- /dev/null +++ b/docs/tutorials/saxpy.md @@ -0,0 +1,812 @@ +# Tutorial: SAXPY - Hello, HIP + +This tutorial will show you some of the basic concepts of the single-source HIP +programming model, the most essential tooling around it and briefly rehash some +commonalities of heterogenous APIs in general. Mild familiarity with the C/C++ +compilation model and the language is assumed throughout this article. + +## Prerequisites + +In order to follow this tutorial you will need properly installed drivers and a +HIP compiler toolchain to compile your code. Because HIP provided by ROCm +supports compiling and running on Linux and Windows with AMD and NVIDIA GPUs +alike, the combination of install instructions are more then worth covering as +part of this tutorial. Please refer to {doc}`/how_to_guides/install` on how to +install HIP development packages. + +## Heterogenous Programming + +Heterogenous programming and offloading APIs are often mentioned together. +Heterogenous programming deals with devices of varying capabilities at once +while the term offloading focuses on the "remote" and asnychronous aspect of +the computation. HIP encompasses both: it exposes GPGPU (General Purpose GPU) +programming much like ordinary host-side CPU programming and let's us move data +to and from device as need be. + +```{important} +Most of the HIP-specific code will deal with "where", "what" and "how". +``` + +One thing to keep in mind while programming in HIP (and other heterogenous APIs +for that matter), is that target devices are built for a specific purpose. They +are designed with different tradeoffs than traditional CPUs and therefore have +very different performance characteristics. Ever so subtle changes in code may +effect execution time adversely. Rest assured one can always find the root +cause and design a fix. + +## Your First Piece of HIP Code + +First, let's take the "Hello, World!" of GPGPU: SAXPY. The name comes from +math, a vector equation at that: {math}`a\cdot x+y=z` where +{math}`a\in\mathbb{R}` is a scalar and {math}`x,y,z\in\mathbb{V}` are vector +quantities of some large dimensionality. (Our vector space is defined over the +set of reals.) From a practical perspective we can compute this using a single +`for` loop over 3 arrays. + +```c++ +for (int i = 0 ; i < N ; ++i) + z[i] = a * x[i] + y[i]; +``` + +In linear algebra libraries, such as BLAS (Basic Linear Algebra Subsystem) this +operation is defined as AXPY "A times X Plus Y". The "S" comes from +single-precision, meaning that every element of our array are `float`s. (We +choose IEEE 754: binary32 arithmetic as the representation of our algebra.) + +To get quickly off the ground, we'll take off-the-shelf piece of code, the set +of [HIP samples from GitHub](https://github.com/amd/rocm-examples/). Assuming +Git is on your Path, open a command-line and navigate to where you'll want to +work, then issue: + +```shell +git clone https://github.com/amd/rocm-examples.git +``` + +Inside the repo, you should find `HIP-Basic\saxpy\main.hip` which is a +sufficiently simple implementation of SAXPY. It was already mentioned +that HIP code will mostly deal with where and when data has to be and +how devices will transform it. The very first HIP calls deal with +allocating device-side memory and dispatching data from host-side +memory in a C Runtime-like fashion. + +```hip +// Allocate and copy vectors to device memory. +float* d_x{}; +float* d_y{}; +HIP_CHECK(hipMalloc(&d_x, size_bytes)); +HIP_CHECK(hipMalloc(&d_y, size_bytes)); +HIP_CHECK(hipMemcpy(d_x, x.data(), size_bytes, hipMemcpyHostToDevice)); +HIP_CHECK(hipMemcpy(d_y, y.data(), size_bytes, hipMemcpyHostToDevice)); +``` + +`HIP_CHECK` is a custom macro borrowed from the examples utilities which +checks the error code returned by API functions for errors and reports them to +the console. It's not quintessential to the API. + +If you're wondering: how does it know which device to allocate on / dispatch +to... wonder no more. Commands are issued to the HIP runtime on a per-thread +basis and every thread has a device set as the target of commands. The default +device is `0`, which is equivalent to calling `hipSetDevice(0)`. + +Once our data has been dispatched, we can launch our calculation on the device. + +```cu +__global__ void saxpy_kernel(const float a, const float* d_x, float* d_y, const unsigned int size) +{ + ... +} + +int main() +{ + ... + + // Launch the kernel on the default stream. + saxpy_kernel<<>>(a, d_x, d_y, size); +} +``` + +First let's discuss the signature of the offloaded function: + +- `__global__` instructs the compiler to generate code for this function as an + entrypoint to a device program, such that it can be launched from the host. +- The function does not return anything, because there is no trivial way to + construct a return channel of a parallel invocation. Device-side entrypoints + may not return a value, their results should be communicated using out + params. +- Device-side functions are typically called compute kernels, or just kernels + for short. This is to distinguish them from non-graphics-related graphics + shaders, or just shaders for short. +- Arguments are taken by value and all arguments shall be + [TriviallyCopyable](https://en.cppreference.com/w/cpp/named_req/TriviallyCopyable), + meaning they should be `memcpy`-friendly. _(Imagine if they had custom copy + constructors. Where would that logic execute? On the host? On the device?)_ + Pointer arguments are pointers to device memory, one typically backed by + VRAM. +- We said that we'll be computing {math}`a\cdot x+y=z`, however we only pass + two pointers to the function. We'll be canonically reusing one of the inputs + as outputs. + +There's quite a lot to unpack already. How is this function launched from the +host? Using a language extension, the so-called triple chevron syntax. Inside +the angle brackets we can provide the following: + +- The number of blocks to launch (our grid size) +- The number of threads in a block (our block size) +- The amount of shared memory to allocate by the host +- The device stream to enqueue the operation on + +Following the triple chevron is ordinary function argument passing. Now let's +take a look how the kernel is implemented. + +```cu +__global__ void saxpy_kernel(const float a, const float* d_x, float* d_y, const unsigned int size) +{ + // Compute the current thread's index in the grid. + const unsigned int global_idx = blockIdx.x * blockDim.x + threadIdx.x; + + // The grid can be larger than the number of items in the vectors. Avoid out-of-bounds addressing. + if(global_idx < size) + { + d_y[global_idx] = a * d_x[global_idx] + d_y[global_idx]; + } +} +``` + +- The unique linear index identifying the thread is computed from the block id + the thread is a member of, the block's size and the id of the thread within + the block. +- A check is made to avoid overindexing the input. +- The useful part of the computation is carried out. + +Retrieval of the result from the device is done much like its dispatch: + +```cu +HIP_CHECK(hipMemcpy(y.data(), d_y, size_bytes, hipMemcpyDeviceToHost)); +``` + +## Compiling on the Command-Line + +(setting_up_the_command-line)= + +### Setting Up the Command-Line + +While strictly speaking there's no such thing as "setting up the command-line +for compilation" on Linux, just to make invocations more terse let's do it on +both Linux and Windows. + +::::{tab-set} +:::{tab-item} Linux & AMD +:sync: linux-amd + +While distro maintainers may package ROCm such that they install to +system-default locations, AMD's installation don't and need to be added to the +Path by the user. + +```bash +export PATH=/opt/rocm/bin:${PATH} +``` + +You should be able to call the compiler on the command-line now: + +```bash +amdclang++ --version +``` + +```{tip} +Docker images distributed by AMD, such as +[`rocm-terminal`](https://hub.docker.com/r/rocm/rocm-terminal/) already have +`/opt/rocm/bin` on the Path for convenience. (This subtly affects CMake package +detection logic of ROCm libraries.) +``` + +::: +:::{tab-item} Linux & NVIDIA +:sync: linux-nvidia + +Both distro maintainers and NVIDIA package CUDA as such that `nvcc` and related +tools are on the command-line by default. You should be able to call the +compiler on the command-line simply: + +```bash +nvcc --version +``` + +::: +:::{tab-item} Windows & AMD +:sync: windows-amd + +Windows compilers and command-line tooling have traditionally +relied on extra environmental variables and Path entries to function correctly. +Visual Studio refers to command-lines with these setup as "Developer +Command Prompt" or "Developer PowerShell" for `cmd.exe` and PowerShell +respectively. + +The HIP SDK on Windows doesn't ship a complete toolchain, you will also need: + +- the Windows SDK, most crucially providing the import libs to crucial system + libraries all executables must link to and some auxiliary compiler tooling. +- a Standard Template Library, aka. STL, which HIP too relies on. + +The prior may be installed separately, though it's most conveniently obtained +through the Visual Studio installer, while the latter is part of the Microsoft +Visual C++ compiler, aka. MSVC, also installed via Visual Studio. + +If you don't already have some SKU of Visual Studio 2022 installed, for a +minimal command-line experience, install the +[Build Tools for Visual Studio 2022](https://aka.ms/vs/17/release/vs_BuildTools.exe) +with the Desktop Developemnt Workload and under Individual Components select: + +- some version of the Windows SDK +- "MSVC v143 - VS 2022 C++ x64/x86 build tools (Latest)" +- "C++ CMake tools for Windows" (optional) + +```{tip} +The "C++ CMake tools for Windows" individual component is a convenience which +puts both `cmake.exe` and `ninja.exe` onto the `PATH` inside developer +command-prompts. You can install these manually, but then you need to manage +them manually. +``` + +Visual Studio installations as of VS 2017 are detectable as COM object +instances via WMI. To setup a command-line from any shell for the latest +Visual Studio's default (latest) Visual C++ toolset issue: + +```pwsh +$InstallationPath = Get-CimInstance MSFT_VSInstance | Sort-Object -Property Version -Descending | Select-Object -First 1 -ExpandProperty InstallLocation +Import-Module $InstallationPath\Common7\Tools\Microsoft.VisualStudio.DevShell.dll +Enter-VsDevShell -InstallPath $InstallationPath -SkipAutomaticLocation -Arch amd64 -HostArch amd64 -DevCmdArguments '-no_logo' +$env:PATH = "${env:HIP_PATH}bin;${env:PATH}" +``` + +You should be able to call the compiler on the command-line now: + +```pwsh +clang++ --version +``` + +::: +:::{tab-item} Windows & NVIDIA +:sync: windows-nvidia + +Windows compilers and command-line tooling have traditionally +relied on extra environmental variables and Path entries to function correctly. +Visual Studio refers to command-lines with these setup as "Developer +Command Prompt" or "Developer PowerShell" for `cmd.exe` and PowerShell +respectively. + +The HIP and CUDA SDKs on Windows doesn't ship complete toolchains, you will +also need: + +- the Windows SDK, most crucially providing the import libs to crucial system + libraries all executables must link to and some auxiliary compiler tooling. +- a Standard Template Library, aka. STL, which HIP too relies on. + +The prior may be installed separately, though it's most conveniently obtained +through the Visual Studio installer, while the latter is part of the Microsoft +Visual C++ compiler, aka. MSVC, also installed via Visual Studio. + +If you don't already have some SKU of Visual Studio 2022 installed, for a +minimal command-line experience, install the +[Build Tools for Visual Studio 2022](https://aka.ms/vs/17/release/vs_BuildTools.exe) +with the Desktop Developemnt Workload and under Individual Components select: + +- some version of the Windows SDK +- "MSVC v143 - VS 2022 C++ x64/x86 build tools (Latest)" +- "C++ CMake tools for Windows" (optional) + +```{tip} +The "C++ CMake tools for Windows" individual component is a convenience which +puts both `cmake.exe` and `ninja.exe` onto the `PATH` inside developer +command-prompts. You can install these manually, but then you need to manage +them manually. +``` + +Visual Studio installations as of VS 2017 are detectable as COM object +instances via WMI. To setup a command-line from any shell for the latest +Visual Studio's default (latest) Visual C++ toolset issue: + +```pwsh +$InstallationPath = Get-CimInstance MSFT_VSInstance | Sort-Object -Property Version -Descending | Select-Object -First 1 -ExpandProperty InstallLocation +Import-Module $InstallationPath\Common7\Tools\Microsoft.VisualStudio.DevShell.dll +Enter-VsDevShell -InstallPath $InstallationPath -SkipAutomaticLocation -Arch amd64 -HostArch amd64 -DevCmdArguments '-no_logo' +``` + +You should be able to call the compiler on the command-line now: + +```pwsh +nvcc --version +``` + +::: +:::: + +### Invoking the Compiler Manually + +To compile and link a single-file application, one may use the following +command: + +::::{tab-set} +:::{tab-item} Linux & AMD +:sync: linux-amd + +```bash +amdclang++ ./HIP-Basic/saxpy/main.hip -o saxpy -I ./Common -lamdhip64 -L /opt/rocm/lib -O2 +``` + +::: +:::{tab-item} Linux & NVIDIA +:sync: linux-nvidia + +```bash +nvcc ./HIP-Basic/saxpy/main.hip -o saxpy -I ./Common -I /opt/rocm/include -O2 -x cu +``` + +::: +:::{tab-item} Windows & AMD +:sync: windows-amd + +```pwsh +clang++ .\HIP-Basic\saxpy\main.hip -o saxpy.exe -I .\Common -lamdhip64 -L ${env:HIP_PATH}lib -O2 +``` + +::: +:::{tab-item} Windows & NVIDIA +:sync: windows-nvidia + +```pwsh +nvcc .\HIP-Basic\saxpy\main.hip -o saxpy.exe -I ${env:HIP_PATH}include -I .\Common -O2 -x cu +``` + +::: +:::: + +Depending on your computer, the resulting binary may or may not run. If not, it +will typically complain about about "Invalid device function". That error +(corresponding to the `hipErrorInvalidDeviceFunction` entry of `hipError_t`) +means that the runtime could not find a device program binary of the +appropriate flavor embedded into the executable. + +So far we've only talked about how our data makes it from the host to the +device and back. We've also seen our device code as source, but the HIP runtime +was arguing about not finding the right binary to dispatch for execution. How +can one find out what device binary flavors are embedded into the executable? + +::::{tab-set} +:::{tab-item} Linux & AMD +:sync: linux-amd + +The set of `roc-*` utilities shipping with ROCm help significantly to inspect +binary artifacts on disk. If you wish to use these utilities, add the ROCmCC +installation folder to your PATH (the utilities expect them to be on the PATH). + +Lisitng of the embedded program binaries can be done using `roc-obj-ls` + +```bash +roc-obj-ls ./saxpy +``` + +It may return something like: + +```shell +1 host-x86_64-unknown-linux file://./saxpy#offset=12288&size=0 +1 hipv4-amdgcn-amd-amdhsa--gfx803 file://./saxpy#offset=12288&size=9760 +``` + +We can see that the compiler embedded a version 4 code object (more on code +object versions +[here](https://www.llvm.org/docs/AMDGPUUsage.html#code-object-metadata)) and +used the LLVM target triple `amdgcn-amd-amdhsa--gfx803` (more on target triples +[here](https://www.llvm.org/docs/AMDGPUUsage.html#target-triples)). We can +extract that program object in a disassembled fashion for human consumption via +`roc-obj` + +```bash +roc-obj -t gfx803 -d ./saxpy +``` + +Which will create two files on disk and we'll be interested in the one with the +`.s` extension. Opening up said file or dumping it to the console using `cat` +one will find the disassembled binary of our saxpy compute kernel, something +similar to: + +```none +Disassembly of section .text: + +<_Z12saxpy_kernelfPKfPfj>: + s_load_dword s0, s[4:5], 0x2c // 000000001000: C0020002 0000002C + s_load_dword s1, s[4:5], 0x18 // 000000001008: C0020042 00000018 + s_waitcnt lgkmcnt(0) // 000000001010: BF8C007F + s_and_b32 s0, s0, 0xffff // 000000001014: 8600FF00 0000FFFF + s_mul_i32 s6, s6, s0 // 00000000101C: 92060006 + v_add_u32_e32 v0, vcc, s6, v0 // 000000001020: 32000006 + v_cmp_gt_u32_e32 vcc, s1, v0 // 000000001024: 7D980001 + s_and_saveexec_b64 s[0:1], vcc // 000000001028: BE80206A + s_cbranch_execz 22 // 00000000102C: BF880016 <_Z12saxpy_kernelfPKfPfj+0x88> + s_load_dwordx4 s[0:3], s[4:5], 0x8 // 000000001030: C00A0002 00000008 + v_mov_b32_e32 v1, 0 // 000000001038: 7E020280 + v_lshlrev_b64 v[0:1], 2, v[0:1] // 00000000103C: D28F0000 00020082 + s_waitcnt lgkmcnt(0) // 000000001044: BF8C007F + v_mov_b32_e32 v3, s1 // 000000001048: 7E060201 + v_add_u32_e32 v2, vcc, s0, v0 // 00000000104C: 32040000 + v_addc_u32_e32 v3, vcc, v3, v1, vcc // 000000001050: 38060303 + flat_load_dword v2, v[2:3] // 000000001054: DC500000 02000002 + v_mov_b32_e32 v3, s3 // 00000000105C: 7E060203 + v_add_u32_e32 v0, vcc, s2, v0 // 000000001060: 32000002 + v_addc_u32_e32 v1, vcc, v3, v1, vcc // 000000001064: 38020303 + flat_load_dword v3, v[0:1] // 000000001068: DC500000 03000000 + s_load_dword s0, s[4:5], 0x0 // 000000001070: C0020002 00000000 + s_waitcnt vmcnt(0) lgkmcnt(0) // 000000001078: BF8C0070 + v_mac_f32_e32 v3, s0, v2 // 00000000107C: 2C060400 + flat_store_dword v[0:1], v3 // 000000001080: DC700000 00000300 + s_endpgm // 000000001088: BF810000 +``` + +Alternatively we can call the compiler with `--save-temps` to dump all device +binary to disk in separate files. + +```bash +amdclang++ ./HIP-Basic/saxpy/main.hip -o saxpy -I ./Common -lamdhip64 -L /opt/rocm/lib -O2 --save-temps +``` + +Now we can list all the temporaries created while compiling `main.hip` via + +```bash +ls main-hip-amdgcn-amd-amdhsa-* +main-hip-amdgcn-amd-amdhsa-gfx803.bc +main-hip-amdgcn-amd-amdhsa-gfx803.cui +main-hip-amdgcn-amd-amdhsa-gfx803.o +main-hip-amdgcn-amd-amdhsa-gfx803.out +main-hip-amdgcn-amd-amdhsa-gfx803.out.resolution.txt +main-hip-amdgcn-amd-amdhsa-gfx803.s +``` + +Files with the `.s` extension hold the disassembled contents of the binary and +the filename directly informs us of the graphics IPs used by the compiler. The +contents of this file is very similar to what `roc-obj` printed to the console. + +::: +:::{tab-item} Linux & NVIDIA +:sync: linux-nvidia + +Unlike HIP on AMD, when compiling using the NVIDIA support of HIP the resulting +binary will be a valid CUDA executable as far as the binary goes. Therefor +it'll incorporate PTX ISA (Parallel Thread eXecution Instruction Set +Architecture) instead of AMDGPU binary. As s result, tooling shipping with the +CUDA SDK can be used to inspect which device ISA got compiled into a specific +executable. The tool most useful to us currently is `cuobjdump`. + +```bash +cuobjdump --list-ptx ./saxpy +``` + +Which will print something like: + +```none +PTX file 1: saxpy.1.sm_52.ptx +``` + +From this we can see that the saxpy kernel is stored as `sm_52`, which shows +that a compute capability 5.2 ISA got embedded into the executable, so devices +which sport compute capability 5.2 or newer will be able to run this code. + +::: +:::{tab-item} Windows & AMD +:sync: windows-amd + +The HIP SDK for Windows don't yet sport the `roc-*` set of utilities to work +with binary artifacts. To find out what binary formats are embedded into an +executable, one may use `dumpbin` tool from the Windows SDK to obtain the +raw data of the `.hip_fat` section of an executable. (This binary payload is +what gets parsed by the `roc-*` set of utilities on Linux.) Skipping over the +reported header, the rendered raw data as ASCII has ~3 lines per entries. +Depending on how many binaries are embedded, you may need to alter the number +of rendered lines. An invocation such as: + +```pwsh +dumpbin.exe /nologo /section:.hip_fat /rawdata:8 .\saxpy.exe | select -Skip 20 -First 12 +``` + +The output may look like: + +```none +000000014004C000: 5F474E414C435F5F 5F44414F4C46464F __CLANG_OFFLOAD_ +000000014004C010: 5F5F454C444E5542 0000000000000002 BUNDLE__........ +000000014004C020: 0000000000001000 0000000000000000 ................ +000000014004C030: 0000000000000019 3638782D74736F68 ........host-x86 +000000014004C040: 6E6B6E752D34365F 756E696C2D6E776F _64-unknown-linu +000000014004C050: 0000000000100078 00000000000D9800 x............... +000000014004C060: 0000000000001F00 612D347670696800 .........hipv4-a +000000014004C070: 6D612D6E6367646D 617368646D612D64 mdgcn-amd-amdhsa +000000014004C080: 3630397866672D2D 0000000000000000 --gfx906........ +000000014004C090: 0000000000000000 0000000000000000 ................ +000000014004C0A0: 0000000000000000 0000000000000000 ................ +000000014004C0B0: 0000000000000000 0000000000000000 ................ +``` + +We can see that the compiler embedded a version 4 code object (more on code +object versions +[here](https://www.llvm.org/docs/AMDGPUUsage.html#code-object-metadata)) and +used the LLVM target triple `amdgcn-amd-amdhsa--gfx906` (more on target triples +[here](https://www.llvm.org/docs/AMDGPUUsage.html#target-triples)). Don't be +alarmed about linux showing up as a binary format, AMDGPU binaries uploaded to +the GPU for execution are proper linux ELF binaries in their format. + +Alternatively we can call the compiler with `--save-temps` to dump all device +binary to disk in separate files. + +```pwsh +clang++ .\HIP-Basic\saxpy\main.hip -o saxpy.exe -I .\Common -lamdhip64 -L ${env:HIP_PATH}lib -O2 --save-temps +``` + +Now we can list all the temporaries created while compiling `main.hip` via + +```pwsh +Get-ChildItem -Filter main-hip-* | select -Property Name + +Name +---- +main-hip-amdgcn-amd-amdhsa-gfx906.bc +main-hip-amdgcn-amd-amdhsa-gfx906.hipi +main-hip-amdgcn-amd-amdhsa-gfx906.o +main-hip-amdgcn-amd-amdhsa-gfx906.out +main-hip-amdgcn-amd-amdhsa-gfx906.out.resolution.txt +main-hip-amdgcn-amd-amdhsa-gfx906.s +``` + +Files with the `.s` extension hold the disassembled contents of the binary and +the filename directly informs us of the graphics IPs used by the compiler. + +```pwsh +Get-ChildItem main-hip-*.s | Get-Content + .text + .amdgcn_target "amdgcn-amd-amdhsa--gfx906" + .protected _Z12saxpy_kernelfPKfPfj ; -- Begin function _Z12saxpy_kernelfPKfPfj + .globl _Z12saxpy_kernelfPKfPfj + .p2align 8 + .type _Z12saxpy_kernelfPKfPfj,@function +_Z12saxpy_kernelfPKfPfj: ; @_Z12saxpy_kernelfPKfPfj +; %bb.0: + s_load_dword s0, s[4:5], 0x4 + s_load_dword s1, s[6:7], 0x18 + s_waitcnt lgkmcnt(0) + s_and_b32 s0, s0, 0xffff + s_mul_i32 s8, s8, s0 + v_add_u32_e32 v0, s8, v0 + v_cmp_gt_u32_e32 vcc, s1, v0 + s_and_saveexec_b64 s[0:1], vcc + s_cbranch_execz .LBB0_2 +; %bb.1: + s_load_dwordx4 s[0:3], s[6:7], 0x8 + v_mov_b32_e32 v1, 0 + v_lshlrev_b64 v[0:1], 2, v[0:1] + s_waitcnt lgkmcnt(0) + v_mov_b32_e32 v3, s1 + v_add_co_u32_e32 v2, vcc, s0, v0 + v_addc_co_u32_e32 v3, vcc, v3, v1, vcc + global_load_dword v2, v[2:3], off + v_mov_b32_e32 v3, s3 + v_add_co_u32_e32 v0, vcc, s2, v0 + v_addc_co_u32_e32 v1, vcc, v3, v1, vcc + global_load_dword v3, v[0:1], off + s_load_dword s0, s[6:7], 0x0 + s_waitcnt vmcnt(0) lgkmcnt(0) + v_fmac_f32_e32 v3, s0, v2 + global_store_dword v[0:1], v3, off +.LBB0_2: + s_endpgm + ... +``` + +::: +:::{tab-item} Windows & NVIDIA +:sync: windows-nvidia + +Unlike HIP on AMD, when compiling using the NVIDIA support of HIP the resulting +binary will be a valid CUDA executable as far as the binary goes. Therefor +it'll incorporate PTX ISA (Parallel Thread eXecution Instruction Set +Architecture) instead of AMDGPU binary. As s result, tooling shipping with the +CUDA SDK can be used to inspect which device ISA got compiled into a specific +executable. The tool most useful to us currently is `cuobjdump`. + +```bash +cuobjdump.exe --list-ptx .\saxpy.exe +``` + +Which will print something like: + +```none +PTX file 1: saxpy.1.sm_52.ptx +``` + +From this we can see that the saxpy kernel is stored as `sm_52`, which shows +that a compute capability 5.2 ISA got embedded into the executable, so devices +which sport compute capability 5.2 or newer will be able to run this code. + +::: +:::: + +Now that we've found what binary got embedded into the executable, we only need +to find which format our available devices use. + +::::{tab-set} +:::{tab-item} Linux & AMD +:sync: linux-amd + +On Linux a utility called `rocminfo` can help us list all the properties of the +devices available on the system, including which version of graphics IP +(`gfxXYZ`) they employ. We'll filter the output to have only these lines: + +```bash +/opt/rocm/bin/rocminfo | grep gfx + Name: gfx906 + Name: amdgcn-amd-amdhsa--gfx906:sramecc+:xnack- +``` + +_(For the time being let's not discuss what the colon-dlimited list of device +features are after the graphics IP. Until further notice we'll treat them as +part of the binary version.)_ + +::: +:::{tab-item} Linux & NVIDIA +:sync: linux-nvidia + +On Linux HIP with the NVIDIA back-end a CUDA SDK sample called `deviceQuery` +can help us list all the properties of the devices available on the system, +including which version of compute capability a device sports. +(`.` compute capability is passed to `nvcc` on the +command-line as `sm_`, for eg. `8.6` is `sm_86`.) + +Because it's not shipped as a binary, we may as well compile the matching +example from ROCm. + +```bash +nvcc ./HIP-Basic/device_query/main.cpp -o device_query -I ./Common -I /opt/rocm/include -O2 +``` + +We'll filter the output to have only the lines of interest, for eg.: + +```bash +./device_query | grep "major.minor" +major.minor: 8.6 +major.minor: 7.0 +``` + +```{tip} +Next to the `nvcc` executable is another tool called `__nvcc_device_query` +which simply prints the SM Architecture numbers to standard out as a comma +separated list of numbers. The naming of this utility suggests it's not a user +facing executable but is used by `nvcc` to determine what devices are in the +system at hand. +``` + +::: +:::{tab-item} Windows & AMD +:sync: windows-amd + +On Windows a utility called `hipInfo.exe` can help us list all the properties +of the devices available on the system, including which version of graphics IP +(`gfxXYZ`) they employ. We'll filter the output to have only these lines: + +```pwsh +& ${env:HIP_PATH}bin\hipInfo.exe | Select-String gfx + +gcnArchName: gfx1032 +gcnArchName: gfx1035 +``` + +::: +:::{tab-item} Winodws & NVIDIA +:sync: windows-nvidia + +On Windows HIP with the NVIDIA back-end a CUDA SDK sample called `deviceQuery` +can help us list all the properties of the devices available on the system, +including which version of compute capability a device sports. +(`.` compute capability is passed to `nvcc` on the +command-line as `sm_`, for eg. `8.6` is `sm_86`.) + +Because it's not shipped as a binary, we may as well compile the matching +example from ROCm. + +```pwsh +nvcc .\HIP-Basic\device_query\main.cpp -o device_query.exe -I .\Common -I ${env:HIP_PATH}include -O2 +``` + +We'll filter the output to have only the lines of interest, for eg.: + +```pwsh +.\device_query.exe | Select-String "major.minor" + +major.minor: 8.6 +major.minor: 7.0 +``` + +```{tip} +Next to the `nvcc` executable is another tool called `__nvcc_device_query.exe` +which simply prints the SM Architecture numbers to standard out as a comma +separated list of numbers. The naming of this utility suggests it's not a user +facing executable but is used by `nvcc` to determine what devices are in the +system at hand. +``` + +::: +:::: + +Now that we know which versions of graphics IP our devices use, we can +recompile our program with said parameters. + +::::{tab-set} +:::{tab-item} Linux & AMD +:sync: linux-amd + +```bash +amdclang++ ./HIP-Basic/saxpy/main.hip -o saxpy -I ./Common -lamdhip64 -L /opt/rocm/lib -O2 --offload-arch=gfx906:sramecc+:xnack- +``` + +Now our sample will surely run. + +```none +./saxpy +Calculating y[i] = a * x[i] + y[i] over 1000000 elements. +First 10 elements of the results: [ 3, 5, 7, 9, 11, 13, 15, 17, 19, 21 ] +``` + +::: +:::{tab-item} Linux & NVIDIA +:sync: linux-nvidia + +```bash +nvcc ./HIP-Basic/saxpy/main.hip -o saxpy -I ./Common -I /opt/rocm/include -O2 -x cu -arch=sm_70,sm_86 +``` + +```{tip} +If you want to portably target the development machine which is compiling, you +may specify `-arch=native` instead. +``` + +Now our sample will surely run. + +```none +./saxpy +Calculating y[i] = a * x[i] + y[i] over 1000000 elements. +First 10 elements of the results: [ 3, 5, 7, 9, 11, 13, 15, 17, 19, 21 ] +``` + +::: +:::{tab-item} Windows & AMD +:sync: windows-amd + +```pwsh +clang++ .\HIP-Basic\saxpy\main.hip -o saxpy.exe -I .\Common -lamdhip64 -L ${env:HIP_PATH}lib -O2 --offload-arch=gfx1032 --offload-arch=gfx1035 +``` + +Now our sample will surely run. + +```none +.\saxpy.exe +Calculating y[i] = a * x[i] + y[i] over 1000000 elements. +First 10 elements of the results: [ 3, 5, 7, 9, 11, 13, 15, 17, 19, 21 ] +``` + +::: +:::{tab-item} Windows & NVIDIA +:sync: windows-nvidia + +```pwsh +nvcc .\HIP-Basic\saxpy\main.hip -o saxpy.exe -I ${env:HIP_PATH}include -I .\Common -O2 -x cu -arch=sm_70,sm_86 +``` + +```{tip} +If you want to portably target the development machine which is compiling, you +may specify `-arch=native` instead. +``` + +Now our sample will surely run. + +```none +.\saxpy.exe +Calculating y[i] = a * x[i] + y[i] over 1000000 elements. +First 10 elements of the results: [ 3, 5, 7, 9, 11, 13, 15, 17, 19, 21 ] +``` + +::: +::::