From e01f13e80357c69ad3bddf6372d0c1f45c8666df Mon Sep 17 00:00:00 2001 From: Peter Park Date: Thu, 27 Jun 2024 12:49:37 -0700 Subject: [PATCH 01/21] VER2 Mockup of new release notes template for 6.2 (#97) Add new components.xml --------- Co-authored-by: Sam Wu <22262939+samjwu@users.noreply.github.com> --- RELEASE.md | 281 ++++++++++++++++++++++------------- docs/sphinx/_toc.yml.in | 8 +- docs/sphinx/requirements.in | 2 +- docs/sphinx/requirements.txt | 84 +++++------ tools/autotag/components.xml | 71 +++++++++ 5 files changed, 296 insertions(+), 150 deletions(-) create mode 100644 tools/autotag/components.xml diff --git a/RELEASE.md b/RELEASE.md index c6fd86a5a..80ff9835f 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,4 +1,4 @@ -# ROCm 6.1.2 release notes +# AMD ROCm 6.2 Release Notes @@ -11,136 +11,213 @@ -ROCm 6.1.2 includes enhancements to SMI tools and improvements to some libraries. +The release notes provide a comprehensive summary of changes since the previous AMD ROCm release. -### OS support +This document includes the following sections: -ROCm 6.1.2 has been tested against a pre-release version of Ubuntu 22.04.5 (kernel: 5.15 [GA], 6.8 [HWE]). +* {ref}`Release highlights ` +* {ref}`Operating system and hardware support notes ` +* {ref}`ROCm components versioning ` +* {ref}`Detailed component notes ` +* {ref}`ROCm platform known issues ` +* {ref}`ROCm platform upcoming changes ` -### AMD SMI +```{eval-rst} +The :doc:`Compatibility matrix <../compatibility/compatibility-matrix>` page summarizes ROCm compatibility across +successive major and minor releases. +``` -AMD SMI for ROCm 6.1.2 +Previous ROCm release notes are available in the previous versions of the documentation. Browse previous +versions of ROCm documentation in {doc}`../release/versions`. -#### Additions +(rn-highlights)= +## Release highlights + +AMD ROCm 6.2 introduces some fancy new features and improves the taste of spinach. + +This section also describes other highlights. + +### System stability + +Submerging your hardware in water improves the flow of data. + +### rocDecode + +It now tastes great and is less filling. + +(rn-os-hw-support)= +## Operating system and hardware support notes + +AMD ROCm 6.2 adds the following operating system support: + +* MI300A: Ubuntu 22.04.4 and RHEL 9.3 +* MI300X: Ubuntu 22.04.4 + +Future releases will add additional operating systems to match the general offering. + +For more information about the complete list of supported operating systems and hardware, see the system requirements +page for {doc}`Linux ` and +{doc}`Windows `. + +(rn-components-ver)= +## Components + +The ROCm components are versioned independently. In addition to listing each component, this section also notes upgraded components + +```{eval-rst} +.. csv-table:: + :header: "Category", "Group", "Name", "Version", "Repository" + :stub-columns: 2 + :widths: 1 1 1 1 1 + + "Libraries", "Machine learning and computer vision", :doc:`Composable Kernel `, 1.1, ``__ + "", "", :doc:`MIGraphX `, 1.0, ``__ + "", "", :doc:`MIOpen `, 1.0, ``__ + "", "", :doc:`MIVisionX `, 1.1.0 ⇒ :ref:`1.1.1 `, ``__ + "", "", :doc:`rocAL `, 2.1.5, ``__ + "", "", :doc:`rocDecode `, 1.1.0, ``__ + "", "", :doc:`rocPyDecode `, 1.1.0, ``__ + "", "", :doc:`ROCm Performance Primitives (RPP) `, 4.4.1, ``__ + "", "Communication", :doc:`RCCL `, 2.18.6, ``__ + "", "Math", :doc:`half `, 1.0.0, ``__ + "", "", :doc:`hipBLAS `, 1.4.12, ``__ + "", "", :doc:`hipBLASLt `, 1.4.12, ``__ + "", "", :doc:`hipFFT `, 1.4.12, ``__ + "", "", :doc:`hipfort `, 1.4.12, ``__ + "", "", :doc:`hipRAND `, 1.4.12, ``__ + "", "", :doc:`hipSOLVER `, 1.4.12, ``__ + "", "", :doc:`hipSPARSE `, 1.4.12, ``__ + "", "", :doc:`hipSPARSELt `, 1.4.12, ``__ + "", "", :doc:`rocALUTION `, 1.4.12, ``__ + "", "", :doc:`rocBLAS `, 6.5.0 ⇒ :ref:`6.5.1 `, ``__ + "", "", :doc:`rocFFT `, 1.4.12, ``__ + "", "", :doc:`rocRAND `, 1.4.12, ``__ + "", "", :doc:`rocSOLVER `, 1.4.12, ``__ + "", "", :doc:`rocSPARSE `, 1.4.12, ``__ + "", "", :doc:`rocWMMA `, 1.4.12, ``__ + "", "", :doc:`Tensile `, 1.4.12, ``__ + "", "Primitives", :doc:`hipCUB `, 1.0.0, ``__ + "", "", :doc:`hipTensor `, 1.0.0, ``__ + "", "", :doc:`rocPRIM `, 1.0.0, ``__ + "", "", :doc:`rocThrust `, 10.10.11, ``__ + "Tools", "Development", :doc:`HIPIFY `, 0.9.18, ``__ + "", "", :doc:`ROCdbgapi `, 0.16.1, ``__ + "", "", :doc:`ROCmCC `, 0.9.18, ``__ + "", "", :doc:`ROCm CMake `, 0.1.1, ``__ + "", "", :doc:`ROCm Debugger `, 0.9.18, ``__ + "", "", :doc:`ROCr Debug Agent `, 0.9.18, ``__ + "", "Performance", :doc:`Omniperf `, 2.0, ``__ + "", "", :doc:`Omnitrace `, 2.0.1, ``__ + "", "", :doc:`ROCm Bandwidth Test `, 2.0.1, ``__ + "", "", :doc:`ROCProfiler `, 1.19.1, ``__ + "", "", rocprofiler-sdk, 1.19.1, ``__ + "", "", :doc:`ROCTracer `, 2.0.0, ``__ + "", "System", :doc:`AMD SMI `, 1.2.4 ⇒ :ref:`1.2.5 `, ``__ + "", "", :doc:`rocminfo `, 2.0.0, ``__ + "", "", :doc:`ROCm Data Center Tool `, 2.0.0, ``__ + "", "", :doc:`ROCm SMI `, 2.0.0, ``__ + "", "", :doc:`ROCm Validation Suite `, 2.0.0, ``__ + "", "", :doc:`TransferBench `, 2.0.0, ``__ + "Compilers", "", :doc:`FLANG `, 0.9.10, ``__ + "", "", :doc:`hipCC `, 1.0, ``__ + "", "", LLVM (amdclang), 3.0.1, ``__ + "Runtimes", "", :doc:`AMD Common Language Runtime (CLR) `, 1.0.0, ``__ + "", "", :doc:`HIP `, 1.0, ``__ + "", "", :doc:`ROCR-Runtime `, 3.0.1, ``__ +``` + +(rn-components-det)= +## Detailed component notes + +(mivisionx)= +### MIVisionX (1.1.1) + +#### Changes + +* Describes changes to existing functionality or the addition of new functionality. +* You no longer need to clap to improve performance. + +#### Removals + +* Describes functionality or support that has been removed in this version. Quite often this information will have been noted in the Upcoming changes section +* Support for Microsoft Windows 95 has been removed. + +#### Resolved issues + +* Describes resolved since the previous version of this component. It should include information from earlier versions. +* Your ROCm applications can now run in the dark. + +#### Optimizations + +* Describes how the component has been optimized or improved. +* Works even better on a Commodore 64. + +#### Known issues + +* Describes known issues related to this specific component. We have a different section for the ROCm platform known issues. +* Component 1 doesn't operate as expected with an endless loop. + +#### Upcoming changes + +* Describes upcoming changes that we’re very confident will be introduced. Must be careful not to overpromise (especially on release numbers or dates). + This section should also include deprecation notices. Items in this section should be rolled forward until the change is introduced. +* In a future release, the hardware will generate electricity instead of consuming it. + +(rocblas)= +### rocBLAS (6.5.1) + +#### Changes + +* Describes changes to existing functionality or the addition of new functionality. +* You no longer need to clap to improve performance. + +#### Optimizations + +* Describes how the component has been optimized or improved. +* Works even better on a Commodore 64. + +(amdsmi)= +### AMD SMI (1.2.5) + +#### Changes * Added process isolation and clean shader APIs and CLI commands. * `amdsmi_get_gpu_process_isolation()` * `amdsmi_set_gpu_process_isolation()` * `amdsmi_set_gpu_clear_sram_data()` * Added the `MIN_POWER` metric to output provided by `amd-smi static --limit`. - -#### Optimizations - -* Updated the `amd-smi monitor --pcie` output to prevent delays with the `monitor` command. - -#### Changes - * Updated `amismi_get_power_cap_info` to return values in uW instead of W. * Updated Python library return types for `amdsmi_get_gpu_memory_reserved_pages` and `amdsmi_get_gpu_bad_page_info`. * Updated the output of `amd-smi metric --ecc-blocks` to show counters available from blocks. -#### Fixes +#### Removals + +* Removed the `amdsmi_get_gpu_process_info` API from the Python library. It was removed from the C library in an earlier release. + +#### Resolved issues * `amdsmi_get_gpu_board_info()` no longer returns junk character strings. * `amd-smi metric --power` now correctly details power output for RDNA3, RDNA2, and MI1x devices. * Fixed the `amdsmitstReadWrite.TestPowerCapReadWrite` test for RDNA3, RDNA2, and MI100 devices. * Fixed an issue with the `amdsmi_get_gpu_memory_reserved_pages` and `amdsmi_get_gpu_bad_page_info` Python interface calls. -#### Removals +#### Optimizations -* Removed the `amdsmi_get_gpu_process_info` API from the Python library. It was removed from the C library in an earlier release. +* Updated the `amd-smi monitor --pcie` output to prevent delays with the `monitor` command. ```{note} See the AMD SMI [detailed changelog](https://github.com/ROCm/amdsmi/blob/rocm-6.1.x/CHANGELOG.md) with code samples for more information. ``` -### ROCm SMI +(rn-known-issues)= +## ROCm platform known issues -ROCm SMI for ROCm 6.1.2 +AMD ROCm known issues are noted on [GitHub](https://github.com/ROCm/ROCm/labels/Verified%20Issue). This section also notes resolved issues. +For known issues related to individual components, review the content in [Detailed component notes](rn-components-det). -#### Additions - -* Added the ring hang event to the `amdsmi_evt_notification_type_t` enum. - -#### Fixes - -* Fixed an issue causing ROCm SMI to incorrectly report GPU utilization for RDNA3 GPUs. See the issue on [GitHub](https://github.com/ROCm/ROCm/issues/3112). -* Fixed the parsing of `pp_od_clk_voltage` in `get_od_clk_volt_info` to work better with MI-series hardware. - -## Library changes in ROCm 6.1.2 - -| Library | Version | -|---------|---------| -| AMDMIGraphX | [2.9](https://github.com/ROCm/AMDMIGraphX/releases/tag/rocm-6.1.2) | -| composable_kernel | [0.2.0](https://github.com/ROCm/composable_kernel/releases/tag/rocm-6.1.2) | -| hipBLAS | [2.1.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-6.1.2) | -| hipBLASLt | [0.7.0](https://github.com/ROCm/hipBLASLt/releases/tag/rocm-6.1.2) | -| hipCUB | [3.1.0](https://github.com/ROCm/hipCUB/releases/tag/rocm-6.1.2) | -| hipFFT | [1.0.14](https://github.com/ROCm/hipFFT/releases/tag/rocm-6.1.2) | -| hipRAND | [2.10.17](https://github.com/ROCm/hipRAND/releases/tag/rocm-6.1.2) | -| hipSOLVER | [2.1.1](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-6.1.2) | -| hipSPARSE | [3.0.1](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-6.1.2) | -| hipSPARSELt | [0.2.0](https://github.com/ROCm/hipSPARSELt/releases/tag/rocm-6.1.2) | -| hipTensor | [1.2.0](https://github.com/ROCm/hipTensor/releases/tag/rocm-6.1.2) | -| MIOpen | [3.1.0](https://github.com/ROCm/MIOpen/releases/tag/rocm-6.1.2) | -| MIVisionX | [2.5.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-6.1.2) | -| rccl | [2.18.6](https://github.com/ROCm/rccl/releases/tag/rocm-6.1.2) | -| rocALUTION | [3.1.1](https://github.com/ROCm/rocALUTION/releases/tag/rocm-6.1.2) | -| rocBLAS | 4.1.0 ⇒ [4.1.2](https://github.com/ROCm/rocBLAS/releases/tag/rocm-6.1.2) | -| rocDecode | 0.5.0 ⇒ [0.6.0](https://github.com/ROCm/rocDecode/releases/tag/rocm-6.1.2) | -| rocFFT | [1.0.27](https://github.com/ROCm/rocFFT/releases/tag/rocm-6.1.2) | -| rocm-cmake | [0.12.0](https://github.com/ROCm/rocm-cmake/releases/tag/rocm-6.1.2) | -| rocPRIM | [3.1.0](https://github.com/ROCm/rocPRIM/releases/tag/rocm-6.1.2) | -| rocRAND | [3.0.1](https://github.com/ROCm/rocRAND/releases/tag/rocm-6.1.2) | -| rocSOLVER | [3.25.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-6.1.2) | -| rocSPARSE | [3.1.2](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-6.1.2) | -| rocThrust | [3.0.1](https://github.com/ROCm/rocThrust/releases/tag/rocm-6.1.2) | -| rocWMMA | [1.4.0](https://github.com/ROCm/rocWMMA/releases/tag/rocm-6.1.2) | -| rpp | [1.5.0](https://github.com/ROCm/rpp/releases/tag/rocm-6.1.2) | -| Tensile | [4.40.0](https://github.com/ROCm/Tensile/releases/tag/rocm-6.1.2) | - -### RCCL - -RCCL 2.18.6 for ROCm 6.1.2 - -#### Changes - -* Reduced `NCCL_TOPO_MAX_NODES` to limit stack usage and avoid stack overflow. - -### rocBLAS - -rocBLAS 4.1.2 for ROCm 6.1.2 - -#### Optimizations - -* Tuned BBS TN and TT operations on the CDNA3 architecture. - -#### Fixes - -* Fixed an issue related to obtaining solutions for BF16 TT operations. - -### rocDecode - -rocDecode 0.6.0 for ROCm 6.1.2 - -#### Additions - -* Added support for FFmpeg v5.x. - -#### Optimizations - -* Updated error checking in the `rocDecode-setup.py` script. - -#### Changes - -* Updated core dependencies. -* Updated to support the use of public LibVA headers. - -#### Fixes - -* Fixed some package dependencies. - -## Upcoming changes +(rn-upcoming)= +## ROCm platform upcoming changes +The section notes upcoming changes related to the AMD ROCm platform. For upcoming changes related to individual components, review the content in [Detailed component notes](rn-components-det). * A future release will enable the use of HIPCC compiled binaries `hipcc.bin` and `hipconfig.bin` by default. No action is needed by users; you may continue calling high-level Perl scripts `hipcc` and `hipconfig`. `hipcc.bin` and `hipconfig.bin` will be invoked by the high-level Perl scripts. To revert to the previous behavior and invoke `hipcc.pl` and `hipconfig.pl`, set the `HIP_USE_PERL_SCRIPTS` environment variable to `1`. * A subsequent release will remove high-level HIPCC Perl scripts from `hipcc` and `hipconfig`. This release will remove the `HIP_USE_PERL_SCRIPTS` environment variable. It will rename `hipcc.bin` and `hipconfig.bin` to `hipcc` and `hipconfig` respectively. No action is needed by the users. To revert to the previous behavior, invoke `hipcc.pl` and `hipconfig.pl` explicitly. diff --git a/docs/sphinx/_toc.yml.in b/docs/sphinx/_toc.yml.in index 6b511231f..1013a8b43 100644 --- a/docs/sphinx/_toc.yml.in +++ b/docs/sphinx/_toc.yml.in @@ -9,10 +9,10 @@ subtrees: - file: what-is-rocm.rst - file: about/release-notes.md title: Release notes - subtrees: - - entries: - - file: about/changelog.md - title: Changelog + # subtrees: + # - entries: + # - file: about/changelog.md + # title: Changelog - url: https://github.com/ROCm/ROCm/labels/Verified%20Issue title: Known issues diff --git a/docs/sphinx/requirements.in b/docs/sphinx/requirements.in index cdee26699..e0a45158f 100644 --- a/docs/sphinx/requirements.in +++ b/docs/sphinx/requirements.in @@ -1,2 +1,2 @@ -rocm-docs-core==1.1.1 +rocm-docs-core==1.4.0 sphinx-reredirects==0.1.3 diff --git a/docs/sphinx/requirements.txt b/docs/sphinx/requirements.txt index b81481721..1137c046b 100644 --- a/docs/sphinx/requirements.txt +++ b/docs/sphinx/requirements.txt @@ -1,14 +1,14 @@ # -# 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 --resolver=backtracking docs/sphinx/requirements.in +# pip-compile requirements.in # -accessible-pygments==0.0.4 +accessible-pygments==0.0.5 # via pydata-sphinx-theme -alabaster==0.7.13 +alabaster==0.7.16 # via sphinx -babel==2.14.0 +babel==2.15.0 # via # pydata-sphinx-theme # sphinx @@ -16,7 +16,7 @@ beautifulsoup4==4.12.3 # via pydata-sphinx-theme breathe==4.35.0 # via rocm-docs-core -certifi==2024.2.2 +certifi==2024.6.2 # via requests cffi==1.16.0 # via @@ -26,17 +26,17 @@ charset-normalizer==3.3.2 # via requests click==8.1.7 # via sphinx-external-toc -cryptography==42.0.5 +cryptography==42.0.8 # via pyjwt deprecated==1.2.14 # via pygithub -docutils==0.19 +docutils==0.21.2 # via # breathe # myst-parser # pydata-sphinx-theme # sphinx -fastjsonschema==2.19.1 +fastjsonschema==2.20.0 # via rocm-docs-core gitdb==4.0.11 # via gitpython @@ -50,61 +50,57 @@ jinja2==3.1.4 # via # myst-parser # sphinx -markdown-it-py==2.2.0 +markdown-it-py==3.0.0 # via # mdit-py-plugins # myst-parser markupsafe==2.1.5 # via jinja2 -mdit-py-plugins==0.3.5 +mdit-py-plugins==0.4.1 # via myst-parser mdurl==0.1.2 # via markdown-it-py -myst-parser==1.0.0 +myst-parser==3.0.1 # via rocm-docs-core -packaging==24.0 +packaging==24.1 # via # pydata-sphinx-theme # sphinx pycparser==2.22 # via cffi -pydata-sphinx-theme==0.14.4 +pydata-sphinx-theme==0.15.3 # via # rocm-docs-core # sphinx-book-theme pygithub==2.3.0 # via rocm-docs-core -pygments==2.17.2 +pygments==2.18.0 # via # accessible-pygments # pydata-sphinx-theme # sphinx pyjwt[crypto]==2.8.0 - # via - # pygithub - # pyjwt + # via pygithub pynacl==1.5.0 # via pygithub -pytz==2024.1 - # via babel pyyaml==6.0.1 # via # myst-parser # rocm-docs-core # sphinx-external-toc -requests==2.31.0 +requests==2.32.3 # via # pygithub # sphinx -rocm-docs-core==1.1.1 +rocm-docs-core==1.4.0 # via -r requirements.in -smmap==5.0.0 +smmap==5.0.1 # via gitdb snowballstemmer==2.2.0 # via sphinx soupsieve==2.5 # via beautifulsoup4 -sphinx==5.3.0 +sphinx==7.3.7 # via # breathe # myst-parser @@ -116,37 +112,39 @@ sphinx==5.3.0 # sphinx-external-toc # sphinx-notfound-page # sphinx-reredirects -sphinx-book-theme==1.0.1 +sphinx-book-theme==1.1.3 # via rocm-docs-core sphinx-copybutton==0.5.2 # via rocm-docs-core -sphinx-design==0.5.0 +sphinx-design==0.6.0 # via rocm-docs-core -sphinx-external-toc==0.3.1 +sphinx-external-toc==1.0.1 # via rocm-docs-core -sphinx-notfound-page==1.0.0 +sphinx-notfound-page==1.0.2 # via rocm-docs-core sphinx-reredirects==0.1.3 - # via -r docs/sphinx/requirements.in -sphinxcontrib-applehelp==1.0.4 + # via -r requirements.in +sphinxcontrib-applehelp==1.0.8 # via sphinx -sphinxcontrib-devhelp==1.0.2 +sphinxcontrib-devhelp==1.0.6 # via sphinx -sphinxcontrib-htmlhelp==2.0.1 +sphinxcontrib-htmlhelp==2.0.5 # via sphinx sphinxcontrib-jsmath==1.0.1 # via sphinx -sphinxcontrib-qthelp==1.0.3 +sphinxcontrib-qthelp==1.0.7 # via sphinx -sphinxcontrib-serializinghtml==1.1.5 +sphinxcontrib-serializinghtml==1.1.10 # via sphinx -typing-extensions==4.5.0 - # via pydata-sphinx-theme -urllib3==1.26.18 - # via requests -wrapt==1.14.1 - # via deprecated -zipp==3.18.1 +tomli==2.0.1 + # via sphinx +typing-extensions==4.12.2 # via - # importlib-metadata - # importlib-resources + # pydata-sphinx-theme + # pygithub +urllib3==2.2.1 + # via + # pygithub + # requests +wrapt==1.16.0 + # via deprecated diff --git a/tools/autotag/components.xml b/tools/autotag/components.xml new file mode 100644 index 000000000..41ec61a17 --- /dev/null +++ b/tools/autotag/components.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 8311130829a23a2d6062049025d83fe8e604bb63 Mon Sep 17 00:00:00 2001 From: Sam Wu <22262939+samjwu@users.noreply.github.com> Date: Wed, 3 Jul 2024 09:17:21 -0600 Subject: [PATCH 02/21] New template for changelog (#100) * Use components.xml instead of default.xml * Rm unused var * Use category instead of group * Add group and category * Change changelog template * Conditional display * Remove sort * Add mappings * Jinja does not track state * Handle dupe logic in python * Construct doc page and repo url * Add repo url * Add doc page * Avoid using bare URL * Add None key * Test release notes --- CHANGELOG.md | 9103 ----------------------- RELEASE.md | 815 +- docs/conf.py | 2 - docs/sphinx/_toc.yml.in | 4 - tools/autotag/README.md | 12 +- tools/autotag/components.xml | 4 +- tools/autotag/tag_script.py | 33 +- tools/autotag/templates/changelog.jinja | 11 +- tools/autotag/util/changelog.py | 4 +- tools/autotag/util/mappings.py | 20 + tools/autotag/util/release_data.py | 122 +- 11 files changed, 764 insertions(+), 9366 deletions(-) delete mode 100644 CHANGELOG.md create mode 100644 tools/autotag/util/mappings.py diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 7767321f5..000000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,9103 +0,0 @@ -# Changelog - - - - - - - - - - - - -This page contains the changelog for AMD ROCm™ Software. - -------------------- - -## ROCm 6.1.2 - -ROCm 6.1.2 includes enhancements to SMI tools and improvements to some libraries. - -### OS support - -ROCm 6.1.2 has been tested against a pre-release version of Ubuntu 22.04.5 (kernel: 5.15 [GA], 6.8 [HWE]). - -### AMD SMI - -AMD SMI for ROCm 6.1.2 - -#### Additions - -* Added process isolation and clean shader APIs and CLI commands. - * `amdsmi_get_gpu_process_isolation()` - * `amdsmi_set_gpu_process_isolation()` - * `amdsmi_set_gpu_clear_sram_data()` -* Added the `MIN_POWER` metric to output provided by `amd-smi static --limit`. - -#### Optimizations - -* Updated the `amd-smi monitor --pcie` output to prevent delays with the `monitor` command. - -#### Changes - -* Updated `amismi_get_power_cap_info` to return values in uW instead of W. -* Updated Python library return types for `amdsmi_get_gpu_memory_reserved_pages` and `amdsmi_get_gpu_bad_page_info`. -* Updated the output of `amd-smi metric --ecc-blocks` to show counters available from blocks. - -#### Fixes - -* `amdsmi_get_gpu_board_info()` no longer returns junk character strings. -* `amd-smi metric --power` now correctly details power output for RDNA3, RDNA2, and MI1x devices. -* Fixed the `amdsmitstReadWrite.TestPowerCapReadWrite` test for RDNA3, RDNA2, and MI100 devices. -* Fixed an issue with the `amdsmi_get_gpu_memory_reserved_pages` and `amdsmi_get_gpu_bad_page_info` Python interface calls. - -#### Removals - -* Removed the `amdsmi_get_gpu_process_info` API from the Python library. It was removed from the C library in an earlier release. - -```{note} -See the AMD SMI [detailed changelog](https://github.com/ROCm/amdsmi/blob/rocm-6.1.x/CHANGELOG.md) with code samples for more information. -``` - -### HIPCC - -HIPCC for ROCm 6.1.2 - -#### Changes - -* **Upcoming:** a future release will enable use of compiled binaries `hipcc.bin` and `hipconfig.bin` by default. No action is needed by users; you may continue calling high-level Perl scripts `hipcc` and `hipconfig`. `hipcc.bin` and `hipconfig.bin` will be invoked by the high-level Perl scripts. To revert to the previous behavior and invoke `hipcc.pl` and `hipconfig.pl`, set the `HIP_USE_PERL_SCRIPTS` environment variable to `1`. -* **Upcoming:** a subsequent release will remove high-level Perl scripts `hipcc` and `hipconfig`. This release will remove the `HIP_USE_PERL_SCRIPTS` environment variable. It will rename `hipcc.bin` and `hipconfig.bin` to `hipcc` and `hipconfig` respectively. No action is needed by the users. To revert to the previous behavior, invoke `hipcc.pl` and `hipconfig.pl` explicitly. -* **Upcoming:** a subsequent release will remove `hipcc.pl` and `hipconfig.pl`. - -### ROCm SMI - -ROCm SMI for ROCm 6.1.2 - -#### Additions - -* Added the ring hang event to the `amdsmi_evt_notification_type_t` enum. - -#### Fixes - -* Fixed an issue causing ROCm SMI to incorrectly report GPU utilization for RDNA3 GPUs. See the issue on [GitHub](https://github.com/ROCm/ROCm/issues/3112). -* Fixed the parsing of `pp_od_clk_voltage` in `get_od_clk_volt_info` to work better with MI-series hardware. - -### Library changes in ROCm 6.1.2 - -| Library | Version | -|---------|---------| -| AMDMIGraphX | [2.9](https://github.com/ROCm/AMDMIGraphX/releases/tag/rocm-6.1.2) | -| composable_kernel | [0.2.0](https://github.com/ROCm/composable_kernel/releases/tag/rocm-6.1.2) | -| hipBLAS | [2.1.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-6.1.2) | -| hipBLASLt | [0.7.0](https://github.com/ROCm/hipBLASLt/releases/tag/rocm-6.1.2) | -| hipCUB | [3.1.0](https://github.com/ROCm/hipCUB/releases/tag/rocm-6.1.2) | -| hipFFT | [1.0.14](https://github.com/ROCm/hipFFT/releases/tag/rocm-6.1.2) | -| hipRAND | [2.10.17](https://github.com/ROCm/hipRAND/releases/tag/rocm-6.1.2) | -| hipSOLVER | [2.1.1](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-6.1.2) | -| hipSPARSE | [3.0.1](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-6.1.2) | -| hipSPARSELt | [0.2.0](https://github.com/ROCm/hipSPARSELt/releases/tag/rocm-6.1.2) | -| hipTensor | [1.2.0](https://github.com/ROCm/hipTensor/releases/tag/rocm-6.1.2) | -| MIOpen | [3.1.0](https://github.com/ROCm/MIOpen/releases/tag/rocm-6.1.2) | -| MIVisionX | [2.5.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-6.1.2) | -| rccl | [2.18.6](https://github.com/ROCm/rccl/releases/tag/rocm-6.1.2) | -| rocALUTION | [3.1.1](https://github.com/ROCm/rocALUTION/releases/tag/rocm-6.1.2) | -| rocBLAS | 4.1.0 ⇒ [4.1.2](https://github.com/ROCm/rocBLAS/releases/tag/rocm-6.1.2) | -| rocDecode | 0.5.0 ⇒ [0.6.0](https://github.com/ROCm/rocDecode/releases/tag/rocm-6.1.2) | -| rocFFT | [1.0.27](https://github.com/ROCm/rocFFT/releases/tag/rocm-6.1.2) | -| rocm-cmake | [0.12.0](https://github.com/ROCm/rocm-cmake/releases/tag/rocm-6.1.2) | -| rocPRIM | [3.1.0](https://github.com/ROCm/rocPRIM/releases/tag/rocm-6.1.2) | -| rocRAND | [3.0.1](https://github.com/ROCm/rocRAND/releases/tag/rocm-6.1.2) | -| rocSOLVER | [3.25.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-6.1.2) | -| rocSPARSE | [3.1.2](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-6.1.2) | -| rocThrust | [3.0.1](https://github.com/ROCm/rocThrust/releases/tag/rocm-6.1.2) | -| rocWMMA | [1.4.0](https://github.com/ROCm/rocWMMA/releases/tag/rocm-6.1.2) | -| rpp | [1.5.0](https://github.com/ROCm/rpp/releases/tag/rocm-6.1.2) | -| Tensile | [4.40.0](https://github.com/ROCm/Tensile/releases/tag/rocm-6.1.2) | - -#### RCCL - -RCCL 2.18.6 for ROCm 6.1.2 - -##### Changes - -* Reduced `NCCL_TOPO_MAX_NODES` to limit stack usage and avoid stack overflow. - -#### rocBLAS - -rocBLAS 4.1.2 for ROCm 6.1.2 - -##### Optimizations - -* Tuned BBS TN and TT operations on the CDNA3 architecture. - -##### Fixes - -* Fixed an issue related to obtaining solutions for BF16 TT operations. - -#### rocDecode - -rocDecode 0.6.0 for ROCm 6.1.2 - -##### Additions - -* Added support for FFmpeg v5.x. - -##### Optimizations - -* Updated error checking in the `rocDecode-setup.py` script. - -##### Changes - -* Updated core dependencies. -* Updated to support the use of public LibVA headers. - -##### Fixes - -* Fixed some package dependencies. - -------------------- - -## ROCm 6.1.1 - -ROCm™ 6.1.1 introduces minor fixes and improvements to some tools and libraries. - -### OS support - -* ROCm 6.1.1 now supports Oracle Linux. It has been tested against version 8.9 (kernel 5.15.0-205) with AMD Instinct MI300X accelerators. - -* ROCm 6.1.1 has been tested against a pre-release version of Ubuntu 22.04.5 (kernel: 5.15 [GA], 6.8 [HWE]). - -### AMD SMI - -AMD SMI for ROCm 6.1.1 - -#### Additions - -* Added deferred error correctable counts to `amd-smi metric -ecc -ecc-blocks`. - -#### Changes - -* Updated the output of `amd-smi metric --clock` to reflect each engine. -* Updated the output of `amd-smi topology --json` to align with output reported by host and guest systems. - -#### Fixes - -* Fixed `amd-smi metric --clock`'s clock lock status and deep sleep status. -* Fixed an issue that would cause an error when attempting to reset non-AMD GPUs. -* Fixed `amd-smi metric --pcie` and `amdsmi_get_pcie_info()` when using RDNA3 (Navi 32 and Navi 31) hardware to prevent "UNKNOWN" reports. -* Fixed the output results of `amd-smi process` when getting processes running on a device. - -#### Known issues - -* `amd-smi bad-pages` can result in a `ValueError: Null pointer access` error when using certain PMU firmware versions. - -```{note} -See the [detailed changelog](https://github.com/ROCm/amdsmi/blob/docs/6.1.1/CHANGELOG.md) with code samples for more information. -``` - -### HIPCC - -HIPCC for ROCm 6.1.1 - -#### Changes - -* **Upcoming:** a future release will enable use of compiled binaries `hipcc.bin` and `hipconfig.bin` by default. No action is needed by users; you may continue calling high-level Perl scripts `hipcc` and `hipconfig`. `hipcc.bin` and `hipconfig.bin` will be invoked by the high-level Perl scripts. To revert to the previous behavior and invoke `hipcc.pl` and `hipconfig.pl`, set the `HIP_USE_PERL_SCRIPTS` environment variable to `1`. -* **Upcoming:** a subsequent release will remove high-level Perl scripts `hipcc` and `hipconfig`. This release will remove the `HIP_USE_PERL_SCRIPTS` environment variable. It will rename `hipcc.bin` and `hipconfig.bin` to `hipcc` and `hipconfig` respectively. No action is needed by the users. To revert to the previous behavior, invoke `hipcc.pl` and `hipconfig.pl` explicitly. -* **Upcoming:** a subsequent release will remove `hipcc.pl` and `hipconfig.pl`. - -### ROCm SMI - -ROCm SMI for ROCm 6.1.1 - -##### Additions - -* Added the capability to unlock mutex when a process is dead. Added related debug output. -* Added the `Partition ID` field to the `rocm-smi` CLI. -* Added `NODE`, `GUID`, and `GFX Version` fields to the CLI. -* Documentation now includes C++ and Python tutorials, API guides, and reference material. - -##### Changes - -* Some `rocm-smi` fields now display `N/A` instead of `unknown/unsupported` for consistency. -* Changed stacked ID formatting in the `rocm-smi` CLI to make it easier to spot identifiers. - -##### Fixes - -* Fixed HIP and ROCm SMI mismatch on GPU bus assignments. -* Fixed memory leaks caused by not closing directories and creating maps nodes instead of using `.at()`. -* Fixed initializing calls which reuse `rocmsmi.initializeRsmi()` bindings in the `rocmsmi` Python API. -* Fixed an issue causing `rsmi_dev_activity_metric_get` gfx/memory to not update with GPU activity. - -##### Known issues - -* ROCm SMI reports GPU utilization incorrectly for RDNA3 GPUs in some situations. See the issue on [GitHub](https://github.com/ROCm/ROCm/issues/3112). - -```{note} -See the [detailed ROCm SMI changelog](https://github.com/ROCm/rocm_smi_lib/blob/docs/6.1.1/CHANGELOG.md) with code samples for more information. -``` - -### Library changes in ROCm 6.1.1 - -| Library | Version | -|---------|---------| -| AMDMIGraphX | [2.9](https://github.com/ROCm/AMDMIGraphX/releases/tag/rocm-6.1.1) | -| composable_kernel | [0.2.0](https://github.com/ROCm/composable_kernel/releases/tag/rocm-6.1.1) | -| hipBLAS | [2.1.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-6.1.1) | -| hipCUB | [3.1.0](https://github.com/ROCm/hipCUB/releases/tag/rocm-6.1.1) | -| hipFFT | [1.0.14](https://github.com/ROCm/hipFFT/releases/tag/rocm-6.1.1) | -| hipRAND | [2.10.17](https://github.com/ROCm/hipRAND/releases/tag/rocm-6.1.1) | -| hipSOLVER | 2.1.0 ⇒ [2.1.1](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-6.1.1) | -| hipSPARSE | [3.0.1](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-6.1.1) | -| hipTensor | [1.2.0](https://github.com/ROCm/hipTensor/releases/tag/rocm-6.1.1) | -| MIOpen | [3.1.0](https://github.com/ROCm/MIOpen/releases/tag/rocm-6.1.1) | -| MIVisionX | [2.5.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-6.1.1) | -| rccl | [2.18.6](https://github.com/ROCm/rccl/releases/tag/rocm-6.1.1) | -| rocALUTION | [3.1.1](https://github.com/ROCm/rocALUTION/releases/tag/rocm-6.1.1) | -| rocBLAS | [4.1.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-6.1.1) | -| rocFFT | 1.0.26 ⇒ [1.0.27](https://github.com/ROCm/rocFFT/releases/tag/rocm-6.1.1) | -| rocm-cmake | [0.12.0](https://github.com/ROCm/rocm-cmake/releases/tag/rocm-6.1.1) | -| rocPRIM | [3.1.0](https://github.com/ROCm/rocPRIM/releases/tag/rocm-6.1.1) | -| rocRAND | [3.0.1](https://github.com/ROCm/rocRAND/releases/tag/rocm-6.1.1) | -| rocSOLVER | [3.25.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-6.1.1) | -| rocSPARSE | [3.1.2](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-6.1.1) | -| rocThrust | [3.0.1](https://github.com/ROCm/rocThrust/releases/tag/rocm-6.1.1) | -| rocWMMA | [1.4.0](https://github.com/ROCm/rocWMMA/releases/tag/rocm-6.1.1) | -| rpp | [1.5.0](https://github.com/ROCm/rpp/releases/tag/rocm-6.1.1) | -| Tensile | [4.40.0](https://github.com/ROCm/Tensile/releases/tag/rocm-6.1.1) | - -#### hipSOLVER - -hipSOLVER 2.1.1 for ROCm 6.1.1 - -##### Changed - -- `BUILD_WITH_SPARSE` now defaults to OFF on Windows. - -##### Fixed - -- Fixed benchmark client build when `BUILD_WITH_SPARSE` is OFF. - -#### rocFFT - -rocFFT 1.0.27 for ROCm 6.1.1 - -##### Fixes - -* Fixed kernel launch failure on execute of very large odd-length real-complex transforms. - -##### Additions - -* Enable multi-gpu testing on systems without direct GPU-interconnects - -------------------- - -## ROCm 6.1.0 - -The ROCm™ 6.1 release consists of new features and fixes to improve the stability and -performance of AMD Instinct™ MI300 GPU applications. Notably, we've added: - -* Full support for Ubuntu 22.04.4. - -* **rocDecode**, a new ROCm component that provides high-performance video decode support for - AMD GPUs. With rocDecode, you can decode compressed video streams while keeping the resulting - YUV frames in video memory. With decoded frames in video memory, you can run video - post-processing using ROCm HIP, avoiding unnecessary data copies via the PCIe bus. - - To learn more, refer to the rocDecode - [documentation](https://rocm.docs.amd.com/projects/rocDecode/en/latest/). - -### OS and GPU support changes - -ROCm 6.1 adds the following operating system support: - -* MI300A: Ubuntu 22.04.4 and RHEL 9.3 -* MI300X: Ubuntu 22.04.4 - -Future releases will add additional operating systems to match our general offering. For older -generations of supported AMD Instinct products, we’ve added Ubuntu 22.04.4 support. - -```{tip} -To view the complete list of supported GPUs and operating systems, refer to the system requirements -page for -[Linux](https://rocm.docs.amd.com/projects/install-on-linux/en/latest/reference/system-requirements.html) -and -[Windows](https://rocm.docs.amd.com/projects/install-on-windows/en/latest/reference/system-requirements.html). -``` - -### Installation packages - -This release includes a new set of packages for every module (all libraries and binaries default to -`DT_RPATH`). Package names have the suffix `rpath`; for example, the `rpath` variant of `rocminfo` is -`rocminfo-rpath`. - -```{warning} -The new `rpath` packages will conflict with the default packages; they are meant to be used only in -environments where legacy `DT_RPATH` is the preferred form of linking (instead of `DT_RUNPATH`). We -do **not** recommend trying to install both sets of packages. -``` - -#### AMD SMI - -AMD SMI for ROCm 6.1.0 - -##### Additions - -* **Added Monitor command**. This provides users the ability to customize GPU metrics to capture, - collect, and observe. Output is provided in a table view. This aligns closer to ROCm SMI `rocm-smi` - (no argument), and allows you to customize per the data that are helpful for your use-case. - -* **Integrated ESMI Tool**. You can get CPU metrics and telemetry through our API and CLI tools. - You can get this information using the `amd-smi static` and `amd-smi metric` commands. This is only - available for limited target processors. As of ROCm 6.0.2, this is listed as: - * AMD Zen3 based CPU Family 19h Models 0h-Fh and 30h-3Fh - * AMD Zen4 based CPU Family 19h Models 10h-1Fh and A0-AFh - -* **Added support for new metrics: VCN, JPEG engines, and PCIe errors**. Using the AMD SMIrccl - tool, you can retrieve VCN, JPEG engines, and PCIe errors by calling `amd-smi metric -P` or - `amd-smi metric --usage`. Depending on device support, `VCN_ACTIVITY` will update for MI3x ASICs - (with 4 separate VCN engine activities) for older ASICs `MM_ACTIVITY` with UVD/VCN engine activity - (average of all engines). `JPEG_ACTIVITY` is a new field for MI3x ASICs, where device can support up - to 32 JPEG engine activities. See our documentation for more in-depth understanding of these new - fields. - -* **Added AMDSMI Tool version**. AMD SMI will report *three versions*: AMDSMI Tool, AMDSMI - Library version, and ROCm version. - - The AMDSMI Tool version is the CLI/tool version number with commit ID appended after the `+` sign. - The AMDSMI Library version is the library package version number. The ROCm version is the system's - installed ROCm version; if ROCm is not installed, it reports N/A. - -* **Added XGMI table**. Displays XGMI information for AMD GPU devices in a table format. This is - only available on supported ASICs (e.g., MI300). Here, users can view read/write data XGMI or PCIe - accumulated data transfer size (in KiloBytes). - -* **Added units of measure to JSON output.**. We added unit of measure to JSON/CSV - `amd-smi metric`, `amd-smi static`, and `amd-smi monitor` commands. - -##### Changes - -* **Topology is now left-aligned with BDF for each device listed individual table's row/columns**. - We provided each device's BDF for every table's row/columns, then left-aligned data. We want AMD - SMI Tool output to be easy to understand and digest. Having to scroll up to find this information - made it difficult to follow, especially for devices that have many devices associated with one ASIC. - -##### Fixes - -* **Fix for RDNA3/RDNA2/MI100 'amdsmi_get_gpu_pci_bandwidth()' in 'frequencies_read' tests**. - For devices that do not report (e.g., RDNA3/RDNA2/MI100), we have added checks to confirm that - these devices return `AMDSMI_STATUS_NOT_SUPPORTED`. Otherwise, tests now display a return - string. - -* **Fix for devices that have an older PyYAML installed**. For platforms that are identified as having - an older PyYAML version or pip, we now manually update both pip and PyYAML as needed. This - fix impacts the following CLI commands: - * `amd-smi list` - * `amd-smi static` - * `amd-smi firmware` - * `amd-smi metric` - * `amd-smi topology` - -* **Fix for crash when user is not a member of video/render groups**. AMD SMI now uses the - same mutex handler for devices as ROCm SMI. This helps avoid crashes when DRM/device data are - inaccessible to the logged-in user. - -##### Known issues - -* There is an `AttributeError` while running `amd-smi process --csv` -* GPU reset results in an "*Unable to reset non-amd GPU*" error -* bad pages results with "ValueError: NULL pointer access" -* Some RDNA3 cards may enumerate to `Slot type = UNKNOWN` - -#### HIP - -HIP 6.1 for ROCm 6.1 - -##### Additions - -* New environment variable, `HIP_LAUNCH_BLOCKING`, which is used for serialization on kernel - execution. -* The default value is 0 (disable): kernel runs normally, as defined in the queue -* When set as 1 (enable): HIP runtime serializes the kernel enqueue and behaves the same as - `AMD_SERIALIZE_KERNEL` -* Added HIPRTC support for hip headers `driver_types`, `math_functions`, `library_types`, - `math_functions`, `hip_math_constants`, `channel_descriptor`, `device_functions`, `hip_complex`, - `surface_types`, `texture_types` - -##### Changes - -* HIPRTC now assumes WGP mode for gfx10+. You can enable CU mode by passing `-mcumode` to the - compile options from `hiprtcCompileProgram`. - -##### Fixes - -* HIP complex vector type multiplication and division operations. - On an AMD platform, some duplicated complex operators are removed to avoid compilation failures. - In HIP, `hipFloatComplex` and `hipDoubleComplex` are defined as complex datatypes: - * `typedef float2 hipFloatComplex` - * `typedef double2 hipDoubleComplex` - - Any application that uses complex multiplication and division operations must replace `*` and `/` - operators with the following: - * `hipCmulf() and hipCdivf() for hipFloatComplex` - * `hipCmul() and hipCdiv() for hipDoubleComplex` - - Note that these complex operations are equivalent to corresponding types/functions on an NVIDIA - platform. - -#### HIPIFY - -HIPIFY for ROCm 6.1.0 - -##### Additions - -* CUDA 12.3.2 support -* cuDNN 8.9.7 support -* LLVM 17.0.6 support -* Full `hipSOLVER` support -* Full `rocSPARSE` support -* New option: `--amap`, which will hipify as much as possible, ignoring `--default-preprocessor` - behavior - -##### Fixes - -* Code blocks skipped by the preprocessor are no longer hipified under the `--default-preprocessor` - option - -#### ROCm Compiler - -ROCm Compiler for ROCm 6.1.0 - -##### Additions - -* Compiler now generates `.uniform_work_group_size` and records it in the metadata. It indicates if the - kernel requires that each dimension of global size is a multiple of the corresponding dimension of - work-group size. A value of 1 is true, and 0 is false. This metadata is only provided when the value is - 1. -* Added the `rocm-llvm-docs` package. -* Added ROCm Device-Libs, ROCm Compiler Support, and hipCC within the `llvm-project/amd` - subdirectory to AMD’s fork of the LLVM project. -* Added support for C++ Parallel Algorithm Offload via HIP (HIPSTDPAR), which allows parallel - algorithms to run on the GPU. - -##### Changes - -* `rocm-clang-ocl` is now an optional package and will require manual installation. - -##### Deprecations - -* hipCC adds `-mllvm`, `-amdgpu-early-inline-all=true`, and `-mllvm` `-amdgpu-function-calls=false` by - default to compiler invocations. These flags will be removed from hipCC in a future ROCm release. - -##### Fixes - -AddressSanitizer (ASan): -* Added `sanitized_padded_global` LLVM ir attribute to identify sanitizer instrumented globals. -* For ASan instrumented global, emit two symbols: one with actual size and the other with - instrumented size. - - [On GitHub](https://github.com/ROCm/ROCm/issues/2551) - -##### Known issues - -* Due to an issue within the `amd-llvm` compiler shipping with ROCm 6.1, HIPSTDPAR's interposition mode, which is enabled by `--hipstdpar-interpose-alloc` is currently broken. - -The temporary workaround is to use the upstream LLVM 18 (or newer) compiler. This issue will be addressed in a future ROCm release ." - -#### ROCm Data Center (RDC) - -RDC for ROCm 6.1.0 - -##### Changes - -* Added `--address` flag to rdcd -* Upgraded from C++11 to C++17 -* Upgraded gRPC - -#### ROCDebugger (ROCgdb) - -ROCgdb for ROCm 6.1.0 - -##### Fixes - -Previously, ROCDebugger encountered hangs and crashes when stepping over the `s_endpgm` -instruction at the end of a HIP kernel entry function, which caused the stepped wave to exit. This issue -is fixed in the ROCm 6.1 release. You can now step over the last instruction of any HIP kernel without -debugger hangs or crashes. - -#### ROCm SMI - -ROCm SMI for ROCm 6.1.0 - -##### Additions - -* **Added support to set max/min clock level for sclk ('RSMI_CLK_TYPE_SYS') or mclk ('RSMI_CLK_TYPE_MEM')**. - You can now set a maximum or minimum `sclk` or `mclk` value through the - `rsmi_dev_clk_extremum_set()` API provided ASIC support. Alternatively, you can use our Python CLI - tool (`rocm-smi --setextremum max sclk 1500`). - -* **Added `rsmi_dev_target_graphics_version_get()`**. You can now query through ROCm SMI API - (`rsmi_dev_target_graphics_version_get()`) to retreive the target graphics version for a GPU device. - Currently, this output is not supplied through our ROCm SMI CLI. - -##### Changes - -* **Removed non-unified API headers: Individual GPU metric APIs are no longer supported**. - The individual metric APIs (`rsmi_dev_metrics_*`) were removed in order to keep updates easier for - new GPU metric support. By providing a simple API (`rsmi_dev_gpu_metrics_info_get()`) with its - reported device metrics, it is worth noting there is a risk for ABI break-age using - `rsmi_dev_gpu_metrics_info_get()`. It is vital to understand that ABI breaks are necessary (in some - cases) in order to support newer ASICs and metrics for our customers. We will continue to support - `rsmi_dev_gpu_metrics_info_get()` with these considerations and limitations in mind. - -* **Deprecated 'rsmi_dev_power_ave_get()'; use the newer API, 'rsmi_dev_power_get()'**. As - outlined in the change for 6.0.0 (*Added a generic power API: rsmi_dev_power_get*), is now - deprecated. You must update your ROCm SMI API calls accordingly. - -##### Fixes - -* Fixed `--showpids` reporting `[PID] [PROCESS NAME] 1 UNKNOWN UNKNOWN UNKNOWN`. - Output was failing because `cu_occupancy debugfs` method is not provided on some graphics cards - by design. `get_compute_process_info_by_pid` was updated to reflect this and returns with the output - needed by the CLI. - -* Fixed `rocm-smi --showpower` output, which was inconsistent on some RDNA3 devices. - We updated this to use `rsmi_dev_power_get()` within the CLI to provide a consistent device power - output. This was caused by using the now-deprecated `rsmi_dev_average_power_get()` API. - -* Fixed `rocm-smi --setcomputepartition` and `rocm-smi --resetcomputepartition` to notate if device is - `EBUSY` - -* Fixed `rocm-smi --setmemorypartition` and `rocm-smi --resetmemorypartition` read only SYSFS to - return `RSMI_STATUS_NOT_SUPPORTED` - The `rsmi_dev_memory_partition_set` API is updated to handle the read-only SYSFS check. - Corresponding tests and CLI (`rocm-smi --setmemorypartition` and - `rocm-smi --resetmemorypartition`) calls were updated accordingly. - -* Fixed `rocm-smi --showclkvolt` and `rocm-smi --showvc`, which were displaying 0 for overdrive and - that the voltage curve is not supported. - -#### ROCProfiler - -ROCProfiler for ROCm 6.1.0 - -##### Fixes - -* Fixed ROCprofiler to match versioning changes in HIP Runtime -* Fixed plugins race condition -* Updated metrics to MI300 - -#### ROCm Validation Suite - -##### Known issue - -* In a future release, the ROCm Validation Suite P2P Benchmark and Qualification Tool (PBQT) tests will be optimized to meet the target bandwidth requirements for MI300X. - - [On GitHub](https://github.com/ROCm/ROCm/issues/3027) - -#### MI200 SR-IOV - -##### Known issue - -* Multimedia applications may encounter compilation errors in the MI200 Single Root Input/Output Virtualization (SR-IOV) environment. This is because MI200 SR-IOV does not currently support multimedia applications. - - [On GitHub](https://github.com/ROCm/ROCm/issues/3028) - -### AMD MI300A RAS - -#### Fixed defect - -##### GFX correctable and uncorrectable error inject failures - -* Previously, the AMD CPU Reliability, Availability, and Serviceability (RAS) installation encountered correctable and uncorrectable failures while injecting an error. - - This issue is resolved in the ROCm 6.1 release, and users will no longer encounter the GFX correctable error (CE) and uncorrectable error (UE) failures. - -### Library changes in ROCm 6.1.0 - -| Library | Version | -|---------|---------| -| AMDMIGraphX | 2.8 ⇒ [2.9](https://github.com/ROCm/AMDMIGraphX/releases/tag/rocm-6.1.0) | -| composable_kernel | [0.2.0](https://github.com/ROCm/composable_kernel/releases/tag/rocm-6.1.0) | -| hipBLAS | 2.0.0 ⇒ [2.1.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-6.1.0) | -| hipCUB | 3.0.0 ⇒ [3.1.0](https://github.com/ROCm/hipCUB/releases/tag/rocm-6.1.0) | -| hipFFT | 1.0.13 ⇒ [1.0.14](https://github.com/ROCm/hipFFT/releases/tag/rocm-6.1.0) | -| hipRAND | [2.10.17](https://github.com/ROCm/hipRAND/releases/tag/rocm-6.1.0) | -| hipSOLVER | 2.0.0 ⇒ [2.1.0](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-6.1.0) | -| hipSPARSE | 3.0.0 ⇒ [3.0.1](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-6.1.0) | -| hipTensor | 1.1.0 ⇒ [1.2.0](https://github.com/ROCm/hipTensor/releases/tag/rocm-6.1.0) | -| MIOpen | 2.19.0 ⇒ [3.1.0](https://github.com/ROCm/MIOpen/releases/tag/rocm-6.1.0) | -| MIVisionX | [2.5.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-6.1.0) | -| rccl | [2.18.6](https://github.com/ROCm/rccl/releases/tag/rocm-6.1.0) | -| rocALUTION | 3.0.3 ⇒ [3.1.1](https://github.com/ROCm/rocALUTION/releases/tag/rocm-6.1.0) | -| rocBLAS | 4.0.0 ⇒ [4.1.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-6.1.0) | -| rocFFT | 1.0.25 ⇒ [1.0.26](https://github.com/ROCm/rocFFT/releases/tag/rocm-6.1.0) | -| rocm-cmake | 0.11.0 ⇒ [0.12.0](https://github.com/ROCm/rocm-cmake/releases/tag/rocm-6.1.0) | -| rocPRIM | 3.0.0 ⇒ [3.1.0](https://github.com/ROCm/rocPRIM/releases/tag/rocm-6.1.0) | -| rocRAND | 3.0.0 ⇒ [3.0.1](https://github.com/ROCm/rocRAND/releases/tag/rocm-6.1.0) | -| rocSOLVER | 3.24.0 ⇒ [3.25.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-6.1.0) | -| rocSPARSE | 3.0.2 ⇒ [3.1.2](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-6.1.0) | -| rocThrust | 3.0.0 ⇒ [3.0.1](https://github.com/ROCm/rocThrust/releases/tag/rocm-6.1.0) | -| rocWMMA | 1.3.0 ⇒ [1.4.0](https://github.com/ROCm/rocWMMA/releases/tag/rocm-6.1.0) | -| rpp | 1.4.0 ⇒ [1.5.0](https://github.com/ROCm/rpp/releases/tag/rocm-6.1.0) | -| Tensile | 4.39.0 ⇒ [4.40.0](https://github.com/ROCm/Tensile/releases/tag/rocm-6.1.0) | - -#### AMDMIGraphX - -MIGraphX 2.9 for ROCm 6.1.0 - -##### Additions - -* Added FP8 support -* Created a dockerfile with MIGraphX+ONNX Runtime EP+Torch -* Added support for the `Hardmax`, `DynamicQuantizeLinear`, `Qlinearconcat`, `Unique`, `QLinearAveragePool`, `QLinearSigmoid`, `QLinearLeakyRelu`, `QLinearMul`, `IsInf` operators -* Created web site examples for `Whisper`, `Llama-2`, and `Stable Diffusion 2.1` -* Created examples of using the ONNX Runtime MIGraphX Execution Provider with the `InceptionV3` and `Resnet50` models -* Updated operators to support ONNX Opset 19 -* Enable fuse_pointwise and fuse_reduce in the driver -* Add support for dot-(mul)-softmax-dot offloads to MLIR -* Added Blas auto-tuning for GEMMs -* Added dynamic shape support for the multinomial operator -* Added fp16 to accuracy checker -* Added initial code for running on Windows OS - -##### Optimizations - -* Improved the output of migraphx-driver command -* Documentation now shows all environment variables -* Updates needed for general stride support -* Enabled Asymmetric Quantization -* Added ScatterND unsupported reduction modes -* Rewrote softmax for better performance -* General improvement to how quantization is performed to support INT8 -* Used problem_cache for gemm tuning -* Improved performance by always using rocMLIR for quantized convolution -* Improved group convolutions by using rocMLIR -* Improved accuracy of fp16 models -* ScatterElements unsupported reduction -* Added concat fusions -* Improved INT8 support to include UINT8 -* Allow reshape ops between dq and quant_op -* Improve dpp reductions on navi -* Have the accuracy checker print the whole final buffer -* Added support for handling dynamic Slice and ConstantOfShape ONNX operators -* Add support for the dilations attribute to Pooling ops -* Add layout attribute support for LSTM operator -* Improved performance by removing contiguous for reshapes -* Handle all slice input variations -* Add scales attribute parse in upsample for older opset versions -* Added support for uneven Split operations -* Improved unit testing to run in python virtual environments - -##### Fixes - -* Fixed outstanding issues in autogenerated documentation -* Update model zoo paths for examples -* Fixed promote_literals_test by using additional if condition -* Fixed export API symbols from dynamic library -* Fixed bug in pad operator from dimension reduction -* Fixed using the LD to embed files and enable by default when building shared libraries on linux -* fixed get_version() -* Fixed Round operator inaccuracy -* Fixed wrong size check when axes not present for slice -* Set the .SO version correctly - -##### Changes - -* Cleanup LSTM and RNN activation functions -* Placed gemm_pointwise at a higher priority than layernorm_pointwise -* Updated README to mention the need to include GPU_TARGETS when building MIGraphX - -##### Removals - -* Removed unused device kernels from Gather and Pad operators -* Removed int8x4 format - -#### hipBLAS - -hipBLAS 2.1.0 for ROCm 6.1.0 - -##### Additions - -* New build option to automatically use hipconfig --platform to determine HIP platform -* Level 1 functions have additional ILP64 API for both C and Fortran (`_64` name - suffix) with int64_t function arguments -* New functions hipblasGetMathMode and hipblasSetMathMode - -##### Deprecations - -* USE_CUDA build option; use HIP_PLATFORM=amd or HIP_PLATFORM=nvidia to override hipconfig - -##### Changes - -* Some Level 2 function argument names have changed from `m` to `n` to match legacy BLAS; there - was no change in implementation. -* Updated client code to use YAML-based testing -* Renamed `.doxygen` and `.sphinx` folders to `doxygen` and `sphinx`, respectively -* Added CMake support for documentation - -#### hipCUB - -hipCUB 3.1.0 for ROCm 6.1.0 - -##### Changed - -- CUB backend references CUB and Thrust version 2.1.0. -- Updated `HIPCUB_HOST_WARP_THREADS` macro definition to match `host_warp_size` changes from rocPRIM 3.0. -- Implemented `__int128_t` and `__uint128_t` support for radix_sort. - -##### Fixed - -- Fixed build issues with `rmake.py` on Windows when using VS 2017 15.8 or later due to a breaking fix with extended aligned storage. - -##### Added - -- Added interface `DeviceMemcpy::Batched` for batched memcpy from rocPRIM and CUB. - -#### hipFFT - -hipFFT 1.0.14 for ROCm 6.1.0 - -##### Changes - -* When building hipFFT from source, rocFFT code no longer needs to be initialized as a git submodule. - -##### Fixes - -* Fixed error when creating length-1 plans. - -#### hipSOLVER - -hipSOLVER 2.1.0 for ROCm 6.1.0 - -##### Added - -- Added compatibility API with hipsolverSp prefix -- Added compatibility-only functions - - csrlsvchol - - hipsolverSpScsrlsvcholHost, hipsolverSpDcsrlsvcholHost - - hipsolverSpScsrlsvchol, hipsolverSpDcsrlsvchol -- Added rocSPARSE and SuiteSparse as optional dependencies to hipSOLVER (rocSOLVER backend only). Use the `BUILD_WITH_SPARSE` CMake option to enable - functionality for the hipsolverSp API (on by default). -- Added hipSPARSE as an optional dependency to hipsolver-test. Use the `BUILD_WITH_SPARSE` CMake option to enable tests of the hipsolverSp API (on by default). - -##### Changed - -- Relax array length requirements for GESVDA. - -##### Fixed - -- Fixed incorrect singular vectors returned from GESVDA. - -#### hipSPARSE - -hipSPARSE 3.0.1 for ROCm 6.1.0 - -##### Fixes - -* Fixes to the build chain - -#### hipTensor - -hipTensor 1.2.0 for ROCm 6.1.0 - -##### Additions - -* API support for permutation of rank 4 tensors: f16 and f32 -* New datatype support in contractions of rank 4: f16, bf16, complex f32, complex f64 -* Added scale and bilinear contraction samples and tests for new supported data types -* Added permutation samples and tests for f16, f32 types - -##### Fixes - -* Fixed bug in contraction calculation with data type f32 - -#### MIOpen - -MIOpen 3.1.0 for ROCm 6.1.0 - -##### Added - -- CK-based 2d/3d convolution solvers to support nchw/ncdhw layout -- Fused solver for Fwd Convolution with Residual, Bias and activation -- AI Based Parameter Prediction Model for conv_hip_igemm_group_fwd_xdlops Solver -- Forward, backward data and backward weight convolution solver with fp8/bfp8 -- check for packed tensors for convolution solvers -- Integrate CK's layer norm -- Combine gtests into single binary - -##### Fixed - -- fix for backward passes bwd/wrw for CK group conv 3d -- Fixed out-of-bounds memory access : ConvOclDirectFwdGen -- fixed build failure due to hipRTC - -##### Changed - -- Standardize workspace abstraction -- Use split CK libraries - -##### Removed - -- clamping to MAX from CastTensor used in Bwd and WrW convolution - -#### rccl - -RCCL 2.18.6 for ROCm 6.1.0 - -##### Changed - -- Compatibility with NCCL 2.18.6 - -#### rocALUTION - -rocALUTION 3.1.1 for ROCm 6.1.0 - -##### Additions - -* `TripleMatrixProduct` functionality for `GlobalMatrix` -* Multi-Node/GPU support for `UA-AMG`, `SA-AMG` and `RS-AMG` -* Iterative ILU0 preconditioner `ItILU0` -* Iterative triangular solve, selectable via `SolverDecr` class - -##### Deprecations - -* `LocalMatrix::AMGConnect` -* `LocalMatrix::AMGAggregate` -* `LocalMatrix::AMGPMISAggregate` -* `LocalMatrix::AMGSmoothedAggregation` -* `LocalMatrix::AMGAggregation` -* `PairwiseAMG` - -##### Known Issues - -* `PairwiseAMG` does currently not support matrix sizes that exceed int32 range -* `PairwiseAMG` might fail building the hierarchy on certain input matrices - -#### rocBLAS - -rocBLAS 4.1.0 for ROCm 6.1.0 - -##### Additions - -* Level 1 and Level 1 Extension functions have additional ILP64 API for both C and FORTRAN (_64 name suffix) with int64_t function arguments. -* Cache flush timing for gemm_ex. - -##### Changes - -* Some Level 2 function argument names have changed 'm' to 'n' to match legacy BLAS, there was no change in implementation. -* Standardized the use of non-blocking streams for copying results from device to host. - -##### Fixes - -* Fixed host-pointer mode reductions for non-blocking streams. - -#### rocFFT - -rocFFT 1.0.26 for ROCm 6.1.0 - -##### Changes - -* Multi-device FFTs now allow batch greater than 1 -* Multi-device, real-complex FFTs are now supported -* rocFFT now statically links libstdc++ when only `std::experimental::filesystem` is available (to guard - against ABI incompatibilities with newer libstdc++ libraries that include `std::filesystem`) - -#### rocm-cmake - -rocm-cmake 0.12.0 for ROCm 6.1.0 - -##### Changed - -- ROCMSphinxDoc: Allow separate source and config directories. -- ROCMCreatePackage: Allow additional `PROVIDES` on header-only packages. -- ROCMInstallTargets: Don't install executable targets by default for ASAN builds. -- ROCMTest: Add RPATH for installed tests. -- Finalize rename to ROCmCMakeBuildTools - -##### Fixed - -- ROCMClangTidy: Fixed invalid list index. -- Test failures when ROCM_CMAKE_GENERATOR is empty. - -#### rocPRIM - -rocPRIM 3.1.0 for ROCm 6.1.0 - -##### Additions - -* New primitive: `block_run_length_decode` -* New primitive: `batch_memcpy` - -##### Changes - -* Renamed: - * `scan_config_v2` to `scan_config` - * `scan_by_key_config_v2` to `scan_by_key_config` - * `radix_sort_config_v2` to `radix_sort_config` - * `reduce_by_key_config_v2` to `reduce_by_key_config` - * `radix_sort_config_v2` to `radix_sort_config` -* Removed support for custom config types for device algorithms -* `host_warp_size()` was moved into `rocprim/device/config_types.hpp`; it now uses either `device_id` or - a `stream` parameter to query the proper device and a `device_id` out parameter - * The return type is `hipError_t` -* Added support for `__int128_t` in `device_radix_sort` and `block_radix_sort` -* Improved the performance of `match_any`, and `block_histogram` which uses it - -##### Deprecations - -* Removed `reduce_by_key_config`, `MatchAny`, `scan_config`, `scan_by_key_config`, and - `radix_sort_config` - -##### Fixes - -* Build issues with `rmake.py` on Windows when using VS 2017 15.8 or later (due to a breaking fix with - extended aligned storage) - -#### rocRAND - -rocRAND 3.0.1 for ROCm 6.1.0 - -##### Fixes - -* Implemented workaround for regressions in XORWOW and LFSR on MI200 - -#### rocSOLVER - -rocSOLVER 3.25.0 for ROCm 6.1.0 - -##### Added - -- Eigensolver routines for symmetric/hermitian matrices using Divide & Conquer and Jacobi algorithm: - - SYEVDJ (with batched and strided\_batched versions) - - HEEVDJ (with batched and strided\_batched versions) -- Generalized symmetric/hermitian-definite eigensolvers using Divide & Conquer and Jacobi algorithm: - - SYGVDJ (with batched and strided\_batched versions) - - HEGVDJ (with batched and strided\_batched versions) - -##### Changed - -- Relaxed array length requirements for GESVDX with `rocblas_srange_index`. - -##### Removed - -- Removed gfx803 and gfx900 from default build targets. - -##### Fixed - -- Corrected singular vector normalization in BDSVDX and GESVDX -- Fixed potential memory access fault in STEIN, SYEVX/HEEVX, SYGVX/HEGVX, BDSVDX and GESVDX - -#### rocSPARSE - -rocSPARSE 3.1.2 for ROCm 6.1.0 - -##### Additions - -* New LRB algorithm to SpMV, supporting CSR format -* rocBLAS as now an optional dependency for SDDMM algorithms -* Additional verbose output for `csrgemm` and `bsrgemm` - -##### Optimizations - -* Triangular solve with multiple rhs (SpSM, csrsm, ...) now calls SpSV, csrsv, etcetera when nrhs equals 1 -* Improved user manual section *Installation and Building for Linux and Windows* -* Improved SpMV in CSR format on MI300 - -#### rocThrust - -rocThrust 3.0.1 for ROCm 6.1.0 - -##### Fixes - -* Ported a fix from thrust 2.2 that ensures `thrust::optional` is trivially copyable. - -#### rocWMMA - -rocWMMA 1.4.0 for ROCm 6.1.0 - -##### Additions - -* Added bf16 support for hipRTC sample - -##### Changes - -* Changed Clang C++ version to C++17 -* Updated rocwmma_coop API -* Linked rocWMMA to hiprtc - -##### Fixes - -* Fixed compile/runtime arch checks -* Built all test in large code model -* Removed inefficient branching in layout loop unrolling - -#### rpp - -rpp for ROCm 6.1.0 - -##### Changes - -* Prerequisites - -##### Tested Configurations - -* Linux distribution - * Ubuntu - `20.04` / `22.04` - * CentOS - `7` - * RHEL - `8`/`9` -* ROCm: rocm-core - `5.5.0.50500-63` -* Clang - Version `5.0.1` and above -* CMake - Version `3.22.3` -* IEEE 754-based half-precision floating-point library - Version `1.12.0` - -#### Tensile - -Tensile 4.40.0 for ROCm 6.1.0 - -##### Additions - -- new DisableKernelPieces values to invalidate local read, local write, and global read -- stream-K kernel generation, including two-tile stream-k algorithm by setting StreamK=3 -- feature to allow testing stream-k grid multipliers -- debug output to check occupancy for Stream-K -- reject condition for FractionalLoad + DepthU!=power of 2 -- new TENSILE_DB debugging value to dump the common kernel parameters -- predicate for APU libs -- new parameter (ClusterLocalRead) to turn on/off wider local read opt for TileMajorLDS -- new parameter (ExtraLatencyForLR) to add extra interval between local read and wait -- new logic to check LDS size with auto LdsPad(=1) and change LdsPad to 0 if LDS overflows -- initialization type and general batched options to the rocblas-bench input creator script - -##### Optimizations - -- enabled MFMA + LocalSplitU=4 for MT16x16 -- enabled (DirectToVgpr + MI4x4) and supported skinny MacroTile -- optimized postGSU kernel: separate postGSU kernels for different GSU values, loop unroll for GSU loop, wider global load depending on array size, and parallel reduction depending on array size -- auto LdsPad calculation for TileMajorLds + MI16x16 -- auto LdsPad calculation for UnrollMajorLds + MI16x16 + VectorWidth - -##### Changes - -- cleared hipErrorNotFound error since it is an expected part of the search -- modified hipcc search path for Linux -- changed PCI ID from 32bit to 64bit for ROCm SMI HW monitor -- changed LdsBlockSizePerPad to LdsBlockSizePerPadA, B to specify LBSPP separately -- changed the default value of LdsPadA, B, LdsBlockSizePerPadA, B from 0 to -1 -- updated test cases according to parameter changes for LdsPad, LBSPP and ClusterLocalRead -- Replaced std::regex with fnmatch()/PathMatchSpec as a workaround to std::regex stack overflow known bug - -##### Fixes - -- hipcc compile append flag parallel-jobs=4 -- race condition in Stream-K that appeared with large grids and small sizes -- mismatch issue with LdsPad + LdsBlockSizePerPad!=0 and TailLoop -- mismatch issue with LdsPad + LdsBlockSizePerPad!=0 and SplitLds -- incorrect reject condition check for DirectToLds + LdsBlockSizePerPad=-1 case -- small fix for LdsPad optimization (LdsElement calculation) - -------------------- - -## ROCm 6.0.2 - -The ROCm 6.0.2 point release consists of minor bug fixes to improve the stability of MI300 GPU applications. This release introduces several new driver features for system qualification on our partner server offerings. - -#### hipFFT 1.0.13 - -hipFFT 1.0.13 for ROCm 6.0.2 - -##### Changes - -* Removed the Git submodule for shared files between rocFFT and hipFFT; instead, just copy the files - over (this should help simplify downstream builds and packaging) - -### Library changes in ROCm 6.0.2 - -| Library | Version | -|---------|---------| -| AMDMIGraphX | [2.8](https://github.com/ROCm/AMDMIGraphX/releases/tag/rocm-6.0.2) | -| composable_kernel | [0.2.0](https://github.com/ROCm/composable_kernel/releases/tag/rocm-6.0.2) | -| hipBLAS | [2.0.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-6.0.2) | -| hipCUB | [3.0.0](https://github.com/ROCm/hipCUB/releases/tag/rocm-6.0.2) | -| hipFFT | [1.0.13](https://github.com/ROCm/hipFFT/releases/tag/rocm-6.0.2) | -| hipRAND | [2.10.17](https://github.com/ROCm/hipRAND/releases/tag/rocm-6.0.2) | -| hipSOLVER | [2.0.0](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-6.0.2) | -| hipSPARSE | [3.0.0](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-6.0.2) | -| hipTensor | [1.1.0](https://github.com/ROCm/hipTensor/releases/tag/rocm-6.0.2) | -| MIOpen | [2.19.0](https://github.com/ROCm/MIOpen/releases/tag/rocm-6.0.2) | -| MIVisionX | [2.5.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-6.0.2) | -| rccl | [2.15.5](https://github.com/ROCm/rccl/releases/tag/rocm-6.0.2) | -| rocALUTION | [3.0.3](https://github.com/ROCm/rocALUTION/releases/tag/rocm-6.0.2) | -| rocBLAS | [4.0.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-6.0.2) | -| rocFFT | [1.0.25](https://github.com/ROCm/rocFFT/releases/tag/rocm-6.0.2) | -| rocm-cmake | [0.11.0](https://github.com/ROCm/rocm-cmake/releases/tag/rocm-6.0.2) | -| rocPRIM | [3.0.0](https://github.com/ROCm/rocPRIM/releases/tag/rocm-6.0.2) | -| rocRAND | 2.10.17 ⇒ [3.0.0](https://github.com/ROCm/rocRAND/releases/tag/rocm-6.0.2) | -| rocSOLVER | [3.24.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-6.0.2) | -| rocSPARSE | [3.0.2](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-6.0.2) | -| rocThrust | [3.0.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-6.0.2) | -| rocWMMA | [1.3.0](https://github.com/ROCm/rocWMMA/releases/tag/rocm-6.0.2) | -| rpp | [1.4.0](https://github.com/ROCm/rpp/releases/tag/rocm-6.0.2) | -| Tensile | [4.39.0](https://github.com/ROCm/Tensile/releases/tag/rocm-6.0.2) | - -#### rocRAND - -rocRAND 3.0.0 for ROCm 6.0.2 - -##### Changed - -- Generator classes from `rocrand.hpp` are no longer copyable, in previous versions these copies -would copy internal references to the generators and would lead to double free or memory leak errors. - These types should be moved instead of copied, and move constructors and operators are now defined - for them. - -##### Optimized - -- Improved MT19937 initialization and generation performance. - -##### Removed - -- Removed hipRAND submodule from rocRAND. hipRAND is now only available as a separate package. -- Removed references to and workarounds for deprecated hcc - -##### Fixed - -- `mt19937_engine` from `rocrand.hpp` is now move-constructible and move-assignable. Previously the -move constructor and move assignment operator was deleted for this class. -- Various fixes for the C++ wrapper header rocrand.hpp - - fixed the name of `mrg31k3p` it is now correctly spelled (was incorrectly named`mrg31k3a` in - previous versions). - - added missing `order` setter method for `threefry4x64` - - fixed the default ordering parameter for `lfsr113` -- Build error when using clang++ directly due to unsupported references to amdgpu-target - -------------------- - -## ROCm 6.0.0 - - - -ROCm 6.0 is a major release with new performance optimizations, expanded frameworks and library -support, and improved developer experience. This includes initial enablement of the AMD Instinct™ -MI300 series. Future releases will further enable and optimize this new platform. Key features include: - -* Improved performance in areas like lower precision math and attention layers. -* New hipSPARSELt library to accelerate AI workloads via AMD's sparse matrix core technique. -* Latest upstream support for popular AI frameworks like PyTorch, TensorFlow, and JAX. -* New support for libraries, such as DeepSpeed, ONNX-RT, and CuPy. -* Prepackaged HPC and AI containers on AMD Infinity Hub, with improved documentation and - tutorials on the [AMD ROCm Docs](https://rocm.docs.amd.com) site. -* Consolidated developer resources and training on the new AMD ROCm Developer Hub. - -The following section provide a release overview for ROCm 6.0. For additional details, you can refer to -the [Changelog](https://rocm.docs.amd.com/en/docs-6.0.0/about/CHANGELOG.html). - -### OS and GPU support changes - -AMD Instinct™ MI300A and MI300X Accelerator support has been enabled for limited operating -systems. - -* Ubuntu 22.04.3 (MI300A and MI300X) -* RHEL 8.9 (MI300A) -* SLES 15 SP5 (MI300A) - -We've added support for the following operating systems: - -* RHEL 9.3 -* RHEL 8.9 - -Note that, of ROCm 6.2, we've planned for end-of-support (EoS) for the following operating systems: - -* Ubuntu 20.04.5 -* SLES 15 SP4 -* RHEL/CentOS 7.9 - -### New ROCm meta package - -We've added a new ROCm meta package for easy installation of all ROCm core packages, tools, and -libraries. For example, the following command will install the full ROCm package: `apt-get install rocm` -(Ubuntu), or `yum install rocm` (RHEL). - -### Filesystem Hierarchy Standard - -ROCm 6.0 fully adopts the Filesystem Hierarchy Standard (FHS) reorganization goals. We've removed -the backward compatibility support for old file locations. - -### Compiler location change - -* The installation path of LLVM has been changed from `/opt/rocm-/llvm` to - `/opt/rocm-/lib/llvm`. For backward compatibility, a symbolic link is provided to the old - location and will be removed in a future release. -* The installation path of the device library bitcode has changed from `/opt/rocm-/amdgcn` to - `/opt/rocm-/lib/llvm/lib/clang//lib/amdgcn`. For backward compatibility, a symbolic link - is provided and will be removed in a future release. - -### Documentation - -CMake support has been added for documentation in the -[ROCm repository](https://github.com/ROCm/ROCm). - -### AMD Instinct™ MI50 end-of-support notice - -AMD Instinct MI50, Radeon Pro VII, and Radeon VII products (collectively gfx906 GPUs) enters -maintenance mode in ROCm 6.0. - -As outlined in [5.6.0](https://rocm.docs.amd.com/en/docs-5.6.0/release.html), ROCm 5.7 was the -final release for gfx906 GPUs in a fully supported state. - - * Henceforth, no new features and performance optimizations will be supported for the gfx906 GPUs. - * Bug fixes and critical security patches will continue to be supported for the gfx906 GPUs until Q2 - 2024 (end of maintenance \[EOM] will be aligned with the closest ROCm release). - * Bug fixes will be made up to the next ROCm point release. - * Bug fixes will not be backported to older ROCm releases for gfx906. - * Distribution and operating system updates will continue per the ROCm release cadence for gfx906 - GPUs until EOM. - -### Known issues - -* Hang is observed with rocSPARSE tests: [Issue 2726](https://github.com/ROCm/ROCm/issues/2726). -* AddressSanitizer instrumentation is incorrect for device global variables: - [Issue 2551](https://github.com/ROCm/ROCm/issues/2551). -* Dynamically loaded HIP runtime library references incorrect version of `hipDeviceGetProperties` - API: [Issue 2728](https://github.com/ROCm/ROCm/issues/2728). -* Memory access violations when running rocFFT-HMM: - [Issue 2730](https://github.com/ROCm/ROCm/issues/2730). - -### Library changes - -| Library | Version | -|---------|---------| -| AMDMIGraphX | ⇒ [2.8](https://github.com/ROCm/AMDMIGraphX/releases/tag/rocm-6.0.0) | -| HIP | [6.0.0](https://github.com/ROCm/HIP/releases/tag/rocm-6.0.0) | -| hipBLAS | ⇒ [2.0.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-6.0.0) | -| hipCUB | ⇒ [3.0.0](https://github.com/ROCm/hipCUB/releases/tag/rocm-6.0.0) | -| hipFFT | ⇒ [1.0.13](https://github.com/ROCm/hipFFT/releases/tag/rocm-6.0.0) | -| hipSOLVER | ⇒ [2.0.0](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-6.0.0) | -| hipSPARSE | ⇒ [3.0.0](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-6.0.0) | -| hipTensor | ⇒ [1.1.0](https://github.com/ROCm/hipTensor/releases/tag/rocm-6.0.0) | -| MIOpen | ⇒ [2.19.0](https://github.com/ROCm/MIOpen/releases/tag/rocm-6.0.0) | -| rccl | ⇒ [2.15.5](https://github.com/ROCm/rccl/releases/tag/rocm-6.0.0) | -| rocALUTION | ⇒ [3.0.3](https://github.com/ROCm/rocALUTION/releases/tag/rocm-6.0.0) | -| rocBLAS | ⇒ [4.0.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-6.0.0) | -| rocFFT | ⇒ [1.0.25](https://github.com/ROCm/rocFFT/releases/tag/rocm-6.0.0) | -| ROCgdb | [13.2](https://github.com/ROCm/ROCgdb/releases/tag/rocm-6.0.0) | -| rocm-cmake | ⇒ [0.11.0](https://github.com/ROCm/rocm-cmake/releases/tag/rocm-6.0.0) | -| rocPRIM | ⇒ [3.0.0](https://github.com/ROCm/rocPRIM/releases/tag/rocm-6.0.0) | -| rocprofiler | [2.0.0](https://github.com/ROCm/rocprofiler/releases/tag/rocm-6.0.0) | -| rocRAND | ⇒ [2.10.17](https://github.com/ROCm/rocRAND/releases/tag/rocm-6.0.0) | -| rocSOLVER | ⇒ [3.24.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-6.0.0) | -| rocSPARSE | ⇒ [3.0.2](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-6.0.0) | -| rocThrust | ⇒ [3.0.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-6.0.0) | -| rocWMMA | ⇒ [1.3.0](https://github.com/ROCm/rocWMMA/releases/tag/rocm-6.0.0) | -| Tensile | ⇒ [4.39.0](https://github.com/ROCm/Tensile/releases/tag/rocm-6.0.0) | - -#### AMDMIGraphX 2.8 - -MIGraphX 2.8 for ROCm 6.0.0 - -##### Additions - -* Support for TorchMIGraphX via PyTorch -* Boosted overall performance by integrating rocMLIR -* INT8 support for ONNX Runtime -* Support for ONNX version 1.14.1 -* Added new operators: `Qlinearadd`, `QlinearGlobalAveragePool`, `Qlinearconv`, `Shrink`, `CastLike`, - and `RandomUniform` -* Added an error message for when `gpu_targets` is not set during MIGraphX compilation -* Added parameter to set tolerances with `migraphx-driver` verify -* Added support for MXR files > 4 GB -* Added `MIGRAPHX_TRACE_MLIR` flag -* BETA added capability for using ROCm Composable Kernels via the `MIGRAPHX_ENABLE_CK=1` - environment variable - -##### Optimizations - -* Improved performance support for INT8 -* Improved time precision while benchmarking candidate kernels from CK or MLIR -* Removed contiguous from reshape parsing -* Updated the `ConstantOfShape` operator to support Dynamic Batch -* Simplified dynamic shapes-related operators to their static versions, where possible -* Improved debugging tools for accuracy issues -* Included a print warning about `miopen_fusion` while generating `mxr` -* General reduction in system memory usage during model compilation -* Created additional fusion opportunities during model compilation -* Improved debugging for matchers -* Improved general debug messages - -##### Fixes - -* Fixed scatter operator for nonstandard shapes with some models from ONNX Model Zoo -* Provided a compile option to improve the accuracy of some models by disabling Fast-Math -* Improved layernorm + pointwise fusion matching to ignore argument order -* Fixed accuracy issue with `ROIAlign` operator -* Fixed computation logic for the `Trilu` operator -* Fixed support for the DETR model - -##### Changes - -* Changed MIGraphX version to 2.8 -* Extracted the test packages into a separate deb file when building MIGraphX from source - -##### Removals - -* Removed building Python 2.7 bindings - -#### AMD SMI - -* Integrated the E-SMI library: You can now query CPU-related information directly through AMD SMI. - Metrics include power, energy, performance, and other system details. - -* Added support for gfx942 metrics: You can now query MI300 device metrics to get real-time - information. Metrics include power, temperature, energy, and performance. - -* Added support for compute and memory partitions - -#### HIP 6.0.0 - -HIP 6.0.0 for ROCm 6.0.0 - -##### Additions - -* New fields and structs for external resource interoperability - * `hipExternalMemoryHandleDesc_st` - * `hipExternalMemoryBufferDesc_st` - * `hipExternalSemaphoreHandleDesc_st` - * `hipExternalSemaphoreSignalParams_st` - * `hipExternalSemaphoreWaitParams_st Enumerations` - * `hipExternalMemoryHandleType_enum` - * `hipExternalSemaphoreHandleType_enum` - * `hipExternalMemoryHandleType_enum` - -* New environment variable `HIP_LAUNCH_BLOCKING` - * For serialization on kernel execution. The default value is 0 (disable); kernel will execute normally as - defined in the queue. When this environment variable is set as 1 (enable), HIP runtime will - serialize kernel enqueue; behaves the same as AMD_SERIALIZE_KERNEL. - -* More members are added in HIP struct `hipDeviceProp_t`, for new feature capabilities including: - * Texture - * `int maxTexture1DMipmap;` - * `int maxTexture2DMipmap[2];` - * `int maxTexture2DLinear[3];` - * `int maxTexture2DGather[2];` - * `int maxTexture3DAlt[3];` - * `int maxTextureCubemap;` - * `int maxTexture1DLayered[2];` - * `int maxTexture2DLayered[3];` - * `int maxTextureCubemapLayered[2];` - * Surface - * `int maxSurface1D;` - * `int maxSurface2D[2];` - * `int maxSurface3D[3];` - * `int maxSurface1DLayered[2];` - * `int maxSurface2DLayered[3];` - * `int maxSurfaceCubemap;` - * `int maxSurfaceCubemapLayered[2];` - * Device - * `hipUUID uuid;` - * `char luid[8];` this is an 8-byte unique identifier. Only valid on Windows - * `unsigned int luidDeviceNodeMask;` - -* LUID (Locally Unique Identifier) is supported for interoperability between devices. In HIP, more - members are added in the struct `hipDeviceProp_t`, as properties to identify each device: - * `char luid[8];` - * `unsigned int luidDeviceNodeMask;` - -:::{note} -HIP only supports LUID on Windows OS. -::: - -##### Changes - -* Some OpenGL Interop HIP APIs are moved from the hip_runtime_api header to a new header file hip_gl_interop.h for the AMD platform, as follows: - * `hipGLGetDevices` - * `hipGraphicsGLRegisterBuffer` - * `hipGraphicsGLRegisterImage` - -###### Changes impacting backward incompatibility - -* Data types for members in `HIP_MEMCPY3D` structure are changed from `unsigned int` to `size_t`. -* The value of the flag `hipIpcMemLazyEnablePeerAccess` is changed to `0x01`, which was previously - defined as `0` -* Some device property attributes are not currently supported in HIP runtime. In order to maintain - consistency, the following related enumeration names are changed in `hipDeviceAttribute_t` - * `hipDeviceAttributeName` is changed to `hipDeviceAttributeUnused1` - * `hipDeviceAttributeUuid` is changed to `hipDeviceAttributeUnused2` - * `hipDeviceAttributeArch` is changed to `hipDeviceAttributeUnused3` - * `hipDeviceAttributeGcnArch` is changed to `hipDeviceAttributeUnused4` - * `hipDeviceAttributeGcnArchName` is changed to `hipDeviceAttributeUnused5` -* HIP struct `hipArray` is removed from driver type header to comply with CUDA -* `hipArray_t` replaces `hipArray*`, as the pointer to array. - * This allows `hipMemcpyAtoH` and `hipMemcpyHtoA` to have the correct array type which is - equivalent to corresponding CUDA driver APIs. - -##### Fixes - -* Kernel launch maximum dimension validation is added specifically on gridY and gridZ in the HIP API `hipModule-LaunchKernel`. As a result,when `hipGetDeviceAttribute` is called for the value of `hipDeviceAttributeMaxGrid-Dim`, the behavior on the AMD platform is equivalent to NVIDIA. - -* The HIP stream synchronization behavior is changed in internal stream functions, in which a flag "wait" is added and set when the current stream is null pointer while executing stream synchronization on other explicitly created streams. This change avoids blocking of execution on null/default stream. The change won't affect usage of applications, and makes them behave the same on the AMD platform as NVIDIA. - -* Error handling behavior on unsupported GPU is fixed, HIP runtime will log out error message, instead of creating signal abortion error which is invisible to developers but continued kernel execution process. This is for the case when developers compile any application via hipcc, setting the option `--offload-arch` with GPU ID which is different from the one on the system. - -* HIP complex vector type multiplication and division operations. On AMD platform, some duplicated complex operators are removed to avoid compilation failures. In HIP, `hipFloatComplex` and `hipDoubleComplex` are defined as complex data types: `typedef float2 hipFloatComplex; typedef double2 hipDoubleComplex;` Any application that uses complex multiplication and division operations needs to replace '*' and '/' operators with the following: - * `hipCmulf()` and `hipCdivf()` for `hipFloatComplex` - * `hipCmul()` and `hipCdiv()` for `hipDoubleComplex` -Note: These complex operations are equivalent to corresponding types/functions on NVIDIA platform. - -##### Removals - -* Deprecated Heterogeneous Compute (HCC) symbols and flags are removed from the HIP source code, including: - * Build options on obsolete `HCC_OPTIONS` were removed from cmake. - * Micro definitions are removed: - * `HIP_INCLUDE_HIP_HCC_DETAIL_DRIVER_TYPES_H` - * `HIP_INCLUDE_HIP_HCC_DETAIL_HOST_DEFINES_H` - * Compilation flags for the platform definitions - * AMD platform - * `HIP_PLATFORM_HCC` - * `HCC` - * `HIP_ROCclr` - * NVIDIA platform - * `HIP_PLATFORM_NVCC` -* The `hcc_detail` and `nvcc_detail` directories in the clr repository are removed. -* Deprecated gcnArch is removed from hip device struct `hipDeviceProp_t`. -* Deprecated `enum hipMemoryType memoryType;` is removed from HIP struct `hipPointerAttribute_t` union. - -#### hipBLAS 2.0.0 - -hipBLAS 2.0.0 for ROCm 6.0.0 - -##### Additions - -* New option to define `HIPBLAS_USE_HIP_BFLOAT16` to switch API to use the `hip_bfloat16` type -* New `hipblasGemmExWithFlags` API - -##### Deprecations - -* `hipblasDatatype_t`; use `hipDataType` instead -* `hipblasComplex`; use `hipComplex` instead -* `hipblasDoubleComplex`; use `hipDoubleComplex` instead -* Use of `hipblasDatatype_t` for `hipblasGemmEx` for compute-type; use `hipblasComputeType_t` instead - -##### Removals - -* `hipblasXtrmm` (calculates B <- alpha * op(A) * B) has been replaced with `hipblasXtrmm` (calculates - C <- alpha * op(A) * B) - - -#### hipCUB 3.0.0 - -hipCUB 3.0.0 for ROCm 6.0.0 - -##### Changes - -* Removed `DOWNLOAD_ROCPRIM`: you can force rocPRIM to download using - `DEPENDENCIES_FORCE_DOWNLOAD` - -#### hipFFT 1.0.13 - -hipFFT 1.0.13 for ROCm 6.0.0 - -##### Changes - -* `hipfft-rider` has been renamed to `hipfft-bench`; it is controlled by the `BUILD_CLIENTS_BENCH` - CMake option (note that a link for the old file name is installed, and the old `BUILD_CLIENTS_RIDER` - CMake option is accepted for backwards compatibility, but both will be removed in a future release) -* Binaries in debug builds no longer have a `-d` suffix -* The minimum rocFFT required version has been updated to 1.0.21 - -##### Additions - -* `hipfftXtSetGPUs`, `hipfftXtMalloc, hipfftXtMemcpy`, `hipfftXtFree`, and `hipfftXtExecDescriptor` APIs - have been implemented to allow FFT computing on multiple devices in a single process - -#### hipSOLVER 2.0.0 - -hipSOLVER 2.0.0 for ROCm 6.0.0 - -##### Additions - -* Added hipBLAS as an optional dependency to `hipsolver-test` - * You can use the `BUILD_HIPBLAS_TESTS` CMake option to test the compatibility between hipSOLVER - and hipBLAS - -##### Changes - -* The `hipsolverOperation_t` type is now an alias of `hipblasOperation_t` -* The `hipsolverFillMode_t` type is now an alias of `hipblasFillMode_t` -* The `hipsolverSideMode_t` type is now an alias of `hipblasSideMode_t` - -##### Fixes - -* Tests for hipSOLVER info updates in `ORGBR/UNGBR`, `ORGQR/UNGQR`, `ORGTR/UNGTR`, - `ORMQR/UNMQR`, and `ORMTR/UNMTR` - -#### hipSPARSE 3.0.0 - -hipSPARSE 3.0.0 for ROCm 6.0.0 - -##### Additions - -* Added `hipsparseGetErrorName` and `hipsparseGetErrorString` - -##### Changes - -* Changed the `hipsparseSpSV_solve()` API function to match the cuSPARSE API -* Changed generic API functions to use const descriptors -* Improved documentation - -#### hipTensor 1.1.0 - -hipTensor 1.1.0 for ROCm 6.0.0 - -##### Additions - -* Architecture support for gfx942 -* Client tests configuration parameters now support YAML file input format - -##### Changes - -* Doxygen now treats warnings as errors - -##### Fixes - -* Client tests output redirections now behave accordingly -* Removed dependency static library deployment -* Security issues for documentation -* Compile issues in debug mode -* Corrected soft link for ROCm deployment - -#### MIOpen 2.19.0 - -MIOpen 2.19.0 for ROCm 6.0.0 - -##### Additions - -* ROCm 5.5 support for gfx1101 (Navi32) - -##### Changes - -* Tuning results for MLIR on ROCm 5.5 -* Bumped MLIR commit to 5.5.0 release tag - -##### Fixes - -* 3-D convolution host API bug -* `[HOTFIX][MI200][FP16]` has been disabled for `ConvHipImplicitGemmBwdXdlops` when FP16_ALT is - required - -#### MIVisionX - -* Added Comprehensive CTests to aid developers -* Introduced Doxygen support for complete API documentation -* Simplified dependencies for rocAL - -#### OpenMP - -* MI300: - * Added support for gfx942 targets - * Fixed declare target variable access in unified_shared_memory mode - * Enabled OMPX_APU_MAPS environment variable for MI200 and gfx942 - * Handled global pointers in forced USM (`OMPX_APU_MAPS`) - -* Nextgen AMDGPU plugin: - * Respect `GPU_MAX_HW_QUEUES` in the AMDGPU Nextgen plugin, which takes precedence over the - standard `LIBOMPTARGET_AMDGPU_NUM_HSA_QUEUES` environment variable - * Changed the default for `LIBOMPTARGET_AMDGPU_TEAMS_PER_CU` from 4 to 6 - * Fixed the behavior of the `OMPX_FORCE_SYNC_REGIONS` environment variable, which is used to - force synchronous target regions (the default is to use an asynchronous implementation) - * Added support for and enabled default of code object version 5 - * Implemented target OMPT callbacks and trace records support in the nextgen plugin - -* Specialized kernels: - * Removes redundant copying of arrays when xteam reductions are active but not offloaded - * Tuned the number of teams for BigJumpLoop - * Enables specialized kernel generation with nested OpenMP pragma, as long as there is no nested - omp-parallel directive - -##### Additions - -* `-fopenmp-runtimelib={lib,lib-perf,lib-debug}` to select libs -* Warning if mixed HIP / OpenMP offloading (i.e., if HIP language mode is active, but OpenMP target - directives are encountered) -* Introduced compile-time limit for the number of GPUs supported in a system: 16 GPUs in a single - node is currently the maximum supported - -##### Changes - -* Correctly compute number of waves when workgroup size is less than the wave size -* Implemented `LIBOMPTARGET_KERNEL_TRACE=3`, which prints DEVID traces and API timings -* ASAN support for openmp release, debug, and perf libraries -* Changed LDS lowering default to hybrid - -##### Fixes - -* Fixed RUNPATH for gdb plugin -* Fixed hang in OMPT support if flush trace is called when there are no helper threads - -#### rccl 2.15.5 - -RCCL 2.15.5 for ROCm 6.0.0 - -##### Changes - -* Compatibility with NCCL 2.15.5 -* Renamed the unit test executable to `rccl-UnitTests` - -##### Additions - -* HW-topology-aware binary tree implementation -* Experimental support for MSCCL -* New unit tests for hipGraph support -* NPKit integration - -##### Fixes - -* rocm-smi ID conversion -* Support for `HIP_VISIBLE_DEVICES` for unit tests -* Support for p2p transfers to non (HIP) visible devices - -##### Removals - -* Removed TransferBench from tools as it exists in standalone repo: - [https://github.com/ROCm/TransferBench](https://github.com/ROCm/TransferBench) - -#### rocALUTION 3.0.3 - -rocALUTION 3.0.3 for ROCm 6.0.0 - -##### Additions - -* Support for 64bit integer vectors -* Inclusive and exclusive sum functionality for vector classes -* Transpose functionality for `GlobalMatrix` and `LocalMatrix` -* `TripleMatrixProduct` functionality for `LocalMatrix` -* `Sort()` function for `LocalVector` class -* Multiple stream support to the HIP backend - -##### Optimizations - -* `GlobalMatrix::Apply()` now uses multiple streams to better hide communication - -##### Changes - -* Matrix dimensions and number of non-zeros are now stored using 64-bit integers -* Improved the ILUT preconditioner - -##### Removals - -* `LocalVector::GetIndexValues(ValueType*)` -* `LocalVector::SetIndexValues(const ValueType*)` -* `LocalMatrix::RSDirectInterpolation(const LocalVector&, const LocalVector&, LocalMatrix*, LocalMatrix*)` -* `LocalMatrix::RSExtPIInterpolation(const LocalVector&, const LocalVector&, bool, float, LocalMatrix*, LocalMatrix*)` -* `LocalMatrix::RugeStueben()` -* `LocalMatrix::AMGSmoothedAggregation(ValueType, const LocalVector&, const LocalVector&, LocalMatrix*, LocalMatrix*, int)` -* `LocalMatrix::AMGAggregation(const LocalVector&, LocalMatrix*, LocalMatrix*)` - -##### Fixes - -* Unit tests no longer ignore BCSR block dimension -* Fixed documentation typos -* Bug in multi-coloring for non-symmetric matrix patterns - -#### rocBLAS 4.0.0 - -rocBLAS 4.0.0 for ROCm 6.0.0 - -##### Additions - -* Beta API `rocblas_gemm_batched_ex3` and `rocblas_gemm_strided_batched_ex3` -* Input/output type f16_r/bf16_r and execution type f32_r support for Level 2 gemv_batched and - gemv_strided_batched -* Use of `rocblas_status_excluded_from_build` when calling functions that require Tensile (when using - rocBLAS built without Tensile) -* System for asynchronous kernel launches that set a `rocblas_status` failure based on a - `hipPeekAtLastError` discrepancy - -##### Optimizations - -* TRSM performance for small sizes (m < 32 && n < 32) - -##### Deprecations - -* Atomic operations will be disabled by default in a future release of rocBLAS (you can enable atomic - operations using the `rocblas_set_atomics_mode` function) - -##### Removals - -* `rocblas_gemm_ext2` API function -* In-place trmm API from Legacy BLAS is replaced by an API that supports both in-place and - out-of-place trmm -* int8x4 support is removed (int8 support is unchanged) -* `#define __STDC_WANT_IEC_60559_TYPES_EXT__` is removed from `rocblas-types.h` (if you want - ISO/IEC TS 18661-3:2015 functionality, you must define `__STDC_WANT_IEC_60559_TYPES_EXT__` - before including `float.h`, `math.h`, and `rocblas.h`) -* The default build removes device code for gfx803 architecture from the fat binary - -##### Fixes - -* Made offset calculations for 64-bit rocBLAS functions safe - * Fixes for very large leading dimension or increment potentially causing overflow: - * Level2: `gbmv`, `gemv`, `hbmv`, `sbmv`, `spmv`, `tbmv`, `tpmv`, `tbsv`, and `tpsv` -* Lazy loading supports heterogeneous architecture setup and load-appropriate tensile library files, - based on device architecture -* Guards against no-op kernel launches that result in a potential `hipGetLastError` - -##### Changes - -* Reduced the default verbosity of `rocblas-test` (you can see all tests by setting the - `GTEST_LISTENER=PASS_LINE_IN_LOG` environment variable) - -#### rocFFT 1.0.25 - -rocFFT 1.0.25 for ROCm 6.0.0 - -##### Additions - -* Implemented experimental APIs to allow computing FFTs on data distributed across multiple devices - in a single process - - * `rocfft_field` is a new type that can be added to a plan description to describe the layout of FFT - input or output - * `rocfft_field_add_brick` can be called to describe the brick decomposition of an FFT field, where each - brick can be assigned a different device - - These interfaces are still experimental and subject to change. Your feedback is appreciated. - You can raise questions and concerns by opening issues in the - [rocFFT issue tracker](https://github.com/ROCm/rocFFT/issues). - - Note that multi-device FFTs currently have several limitations (we plan to address these in future - releases): - - * Real-complex (forward or inverse) FFTs are not supported - * Planar format fields are not supported - * Batch (the `number_of_transforms` provided to `rocfft_plan_create`) must be 1 - * FFT input is gathered to the current device at run time, so all FFT data must fit on that device - -##### Optimizations - -* Improved the performance of several 2D/3D real FFTs supported by `2D_SINGLE` kernel. Offline - tuning provides more optimization for fx90a -* Removed an extra kernel launch from even-length, real-complex FFTs that use callbacks - -##### Changes - -* Built kernels in a solution map to the library kernel cache -* Real forward transforms (real-to-complex) no longer overwrite input; rocFFT may still overwrite real - inverse (complex-to-real) input, as this allows for faster performance - -* `rocfft-rider` and `dyna-rocfft-rider` have been renamed to `rocfft-bench` and `dyna-rocfft-bench`; - these are controlled by the `BUILD_CLIENTS_BENCH` CMake option - * Links for the former file names are installed, and the former `BUILD_CLIENTS_RIDER` CMake option - is accepted for compatibility, but both will be removed in a future release -* Binaries in debug builds no longer have a `-d` suffix - -##### Fixes - -* rocFFT now correctly handles load callbacks that convert data from a smaller data type (e.g., 16-bit - integers -> 32-bit float) - -#### ROCgdb 13.2 - -ROCgdb 13.2 for ROCm 6.0.0 - -##### Additions - -* Support for watchpoints on scratch memory addresses. -* Added support for gfx1100, gfx1101, and gfx1102. -* Added support for gfx942. - -##### Optimizations - -* Improved performances when handling the end of a process with a large number of threads. - -##### Known issues - -* On certain configurations, ROCgdb can show the following warning message: - `warning: Probes-based dynamic linker interface failed. Reverting to original interface.` - This does not affect ROCgdb's functionalities. - -* ROCgdb cannot debug a program on an AMDGPU device past a - `s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)` instruction. If an exception is reported after this - instruction has been executed (including asynchronous exceptions), the wave is killed and the - exceptions are only reported by the ROCm runtime. - -#### rocm-cmake 0.11.0 - -rocm-cmake 0.11.0 for ROCm 6.0.0 - -##### Changes - -* Improved validation, documentation, and rocm-docs-core integration for ROCMSphinxDoc - -##### Fixes - -* Fixed extra `make` flags passed for Clang-Tidy (ROCMClangTidy). -* Fixed issues with ROCMTest when using a module in a subdirectory - -#### ROCm Compiler - -* On MI300, kernel arguments can be preloaded into SGPRs rather than passed in memory. This - feature is enabled with a compiler option, which also controls the number of arguments to pass in - SGPRs. - -* Improved register allocation at -O0: Avoid compiler crashes ( 'ran out of registers during register allocation' ) - -* Improved generation of debug information: - * Improve compile time - * Avoid compiler crashes - -#### rocPRIM 3.0.0 - -rocPRIM 3.0.0 for ROCm 6.0.0 - -##### Additions - -* `block_sort::sort()` overload for keys and values with a dynamic size, for all block sort algorithms -* All `block_sort::sort()` overloads with a dynamic size are now supported for - `block_sort_algorithm::merge_sort` and `block_sort_algorithm::bitonic_sort` -* New two-way partition primitive `partition_two_way`, which can write to two separate iterators - -##### Optimizations - -* Improved `partition` performance - -##### Fixes - -* Fixed `rocprim::MatchAny` for devices with 64-bit warp size - * Note that `rocprim::MatchAny` is deprecated; use `rocprim::match_any` instead - -#### Roc Profiler 2.0.0 - -Roc Profiler 2.0.0 for ROCm 6.0.0 - -##### Additions - -* Updated supported GPU architectures in README with profiler versions -* Automatic ISA dumping for ATT. See README. -* CSV mode for ATT. See README. -* Added option to control kernel name truncation. -* Limit rocprof(v1) script usage to only supported architectures. -* Added Tool versioning to be able to run rocprofv2 using rocprof. See README for more information. -* Added Plugin Versioning way in rocprofv2. See README for more details. -* Added `--version` in rocprof and rocprofv2 to be able to see the current rocprof/v2 version along with ROCm version information. - -#### rocRAND 2.10.17 - -rocRAND 2.10.17 for ROCm 6.0.0 - -### Changes - -* Generator classes from `rocrand.hpp` are no longer copyable (in previous versions these copies - would copy internal references to the generators and would lead to double free or memory leak - errors) - * These types should be moved instead of copied; move constructors and operators are now - defined - -### Optimizations - -* Improved MT19937 initialization and generation performance - -### Removals - -* Removed the hipRAND submodule from rocRAND; hipRAND is now only available as a separate - package -* Removed references to, and workarounds for, the deprecated hcc - -### Fixes - -* `mt19937_engine` from `rocrand.hpp` is now move-constructible and move-assignable (the move - constructor and move assignment operator was deleted for this class) -* Various fixes for the C++ wrapper header `rocrand.hpp` - * The name of `mrg31k3p` it is now correctly spelled (was incorrectly named `mrg31k3a` in previous - versions) - * Added the missing `order` setter method for `threefry4x64` - * Fixed the default ordering parameter for `lfsr113` -* Build error when using Clang++ directly resulting from unsupported `amdgpu-target` references - -#### rocSOLVER 3.24.0 - -rocSOLVER 3.24.0 for ROCm 6.0.0 - -##### Additions - -* Cholesky refactorization for sparse matrices: `CSRRF_REFACTCHOL` -* Added `rocsolver_rfinfo_mode` and the ability to specify the desired refactorization routine (see `rocsolver_set_rfinfo_mode`) - -##### Changes - -* `CSRRF_ANALYSIS` and `CSRRF_SOLVE` now support sparse Cholesky factorization - -#### rocSPARSE 3.0.2 - -rocSPARSE 3.0.2 for ROCm 6.0.0 - -##### Changes - -* Function arguments for `rocsparse_spmv` -* Function arguments for `rocsparse_xbsrmv` routines -* When using host pointer mode, you must now call `hipStreamSynchronize` following `doti`, `dotci`, - `spvv`, and `csr2ell` -* Improved documentation -* Improved verbose output during argument checking on API function calls - -##### Removals - -* Auto stages from `spmv`, `spmm`, `spgemm`, `spsv`, `spsm`, and `spitsv` -* Formerly deprecated `rocsparse_spmm_ex` routine - -### Fixes - -* Bug in `rocsparse-bench` where the SpMV algorithm was not taken into account in CSR format -* BSR and GEBSR routines (`bsrmv`, `bsrsv`, `bsrmm`, `bsrgeam`, `gebsrmv`, `gebsrmm`) didn't always - show `block_dim==0` as an invalid size -* Passing `nnz = 0` to `doti` or `dotci` wasn't always returning a dot product of 0 - -### Additions - -* `rocsparse_inverse_permutation` -* Mixed-precisions for SpVV -* Uniform int8 precision for gather and scatter - -#### rocThrust 3.0.0 - -rocThrust 3.0.0 for ROCm 6.0.0 - -##### Additions - -* Updated to match upstream Thrust 2.0.1 -* `NV_IF_TARGET` macro from libcu++ for NVIDIA backend and HIP implementation for HIP backend - -##### Changes - -* The CMake build system now accepts `GPU_TARGETS` in addition to `AMDGPU_TARGETS` for - setting targeted GPU architectures - * `GPU_TARGETS=all` compiles for all supported architectures - * `AMDGPU_TARGETS` is only provided for backwards compatibility (`GPU_TARGETS` is preferred) -* Removed CUB symlink from the root of the repository -* Removed support for deprecated macros (`THRUST_DEVICE_BACKEND` and - `THRUST_HOST_BACKEND`) - -##### Known issues - -* The `THRUST_HAS_CUDART` macro, which is no longer used in Thrust (it's provided only for legacy - support) is replaced with `NV_IF_TARGET` and `THRUST_RDC_ENABLED` in the NVIDIA backend. The - HIP backend doesn't have a `THRUST_RDC_ENABLED` macro, so some branches in Thrust code may - be unreachable in the HIP backend. - -#### rocWMMA 1.3.0 - -rocWMMA 1.3.0 for ROCm 6.0.0 - -##### Additions - -* Support for gfx942 -* Support for f8, bf8, and xfloat32 data types -* support for `HIP_NO_HALF`, `__ HIP_NO_HALF_CONVERSIONS__`, and - `__ HIP_NO_HALF_OPERATORS__` (e.g., PyTorch environment) - -##### Changes - -* rocWMMA with hipRTC now supports `bfloat16_t` data type -* gfx11 WMMA now uses lane swap instead of broadcast for layout adjustment -* Updated samples GEMM parameter validation on host arch - -##### Fixes - -* Disabled GoogleTest static library deployment -* Extended tests now build in large code model - -#### Tensile 4.39.0 - -Tensile 4.39.0 for ROCm 6.0.0 - -##### Additions - -* Added `aquavanjaram` support: gfx942, fp8/bf8 datatype, xf32 datatype, and - stochastic rounding for various datatypes -* Added and updated tuning scripts -* Added `DirectToLds` support for larger data types with 32-bit global load (old parameter `DirectToLds` - is replaced with `DirectToLdsA` and `DirectToLdsB`), and the corresponding test cases -* Added the average of frequency, power consumption, and temperature information for the winner - kernels to the CSV file -* Added asmcap check for MFMA + const src -* Added support for wider local read + pack with v_perm (with `VgprForLocalReadPacking=True`) -* Added a new parameter to increase `miLatencyLeft` - -##### Optimizations - -* Enabled `InitAccVgprOpt` for `MatrixInstruction` cases -* Implemented local read related parameter calculations with `DirectToVgpr` -* Enabled dedicated vgpr allocation for local read + pack -* Optimized code initialization -* Optimized sgpr allocation -* Supported DGEMM TLUB + RLVW=2 for odd N (edge shift change) -* Enabled `miLatency` optimization for specific data types, and fixed - instruction scheduling - -##### Changes - -* Removed old code for DTL + (bpe * GlobalReadVectorWidth > 4) -* Changed/updated failed CI tests for gfx11xx, InitAccVgprOpt, and DTLds -* Removed unused `CustomKernels` and `ReplacementKernels` -* Added a reject condition for DTVB + TransposeLDS=False (not supported so far) -* Removed unused code for DirectToLds -* Updated test cases for DTV + TransposeLDS=False -* Moved the `MinKForGSU` parameter from `globalparameter` to `BenchmarkCommonParameter` to - support smaller K -* Changed how to calculate `latencyForLR` for miLatency -* Set minimum value of `latencyForLRCount` for 1LDSBuffer to avoid getting rejected by - overflowedResources=5 (related to miLatency) -* Refactored allowLRVWBforTLUandMI and renamed it as VectorWidthB -* Supported multi-gpu for different architectures in lazy library loading -* Enabled dtree library for batch > 1 -* Added problem scale feature for dtree selection -* Modified non-lazy load build to skip experimental logic - -##### Fixes - -* Predicate ordering for fp16alt impl round near zero mode to unbreak distance modes -* Boundary check for mirror dims and re-enable disabled mirror dims test cases -* Merge error affecting i8 with WMMA -* Mismatch issue with DTLds + TSGR + TailLoop -* Bug with `InitAccVgprOpt` + GSU>1 and a mismatch issue with PGR=0 -* Override for unloaded solutions when lazy loading -* Adding missing headers -* Boost link for a clean build on Ubuntu 22 -* Bug in `forcestoresc1` arch selection -* Compiler directive for gfx942 -* Formatting for `DecisionTree_test.cpp` - -### Library changes in ROCm 6.0.0 - -| Library | Version | -|---------|---------| -| AMDMIGraphX | 2.7 ⇒ [2.8](https://github.com/ROCm/AMDMIGraphX/releases/tag/rocm-6.0.0) | -| composable_kernel | [0.2.0](https://github.com/ROCm/composable_kernel/releases/tag/rocm-6.0.0) | -| hipBLAS | 1.1.0 ⇒ [2.0.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-6.0.0) | -| hipCUB | 2.13.1 ⇒ [3.0.0](https://github.com/ROCm/hipCUB/releases/tag/rocm-6.0.0) | -| hipFFT | 1.0.12 ⇒ [1.0.13](https://github.com/ROCm/hipFFT/releases/tag/rocm-6.0.0) | -| hipRAND | 2.10.16 ⇒ [2.10.17](https://github.com/ROCm/hipRAND/releases/tag/rocm-6.0.0) | -| hipSOLVER | 1.8.2 ⇒ [2.0.0](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-6.0.0) | -| hipSPARSE | 2.3.8 ⇒ [3.0.0](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-6.0.0) | -| hipTensor | [1.1.0](https://github.com/ROCm/hipTensor/releases/tag/rocm-6.0.0) | -| MIOpen | [2.19.0](https://github.com/ROCm/MIOpen/releases/tag/rocm-6.0.0) | -| MIVisionX | [2.5.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-6.0.0) | -| rccl | [2.15.5](https://github.com/ROCm/rccl/releases/tag/rocm-6.0.0) | -| rocALUTION | 2.1.11 ⇒ [3.0.3](https://github.com/ROCm/rocALUTION/releases/tag/rocm-6.0.0) | -| rocBLAS | 3.1.0 ⇒ [4.0.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-6.0.0) | -| rocFFT | 1.0.24 ⇒ [1.0.25](https://github.com/ROCm/rocFFT/releases/tag/rocm-6.0.0) | -| rocm-cmake | 0.10.0 ⇒ [0.11.0](https://github.com/ROCm/rocm-cmake/releases/tag/rocm-6.0.0) | -| rocPRIM | 2.13.1 ⇒ [3.0.0](https://github.com/ROCm/rocPRIM/releases/tag/rocm-6.0.0) | -| rocRAND | [2.10.17](https://github.com/ROCm/rocRAND/releases/tag/rocm-6.0.0) | -| rocSOLVER | 3.23.0 ⇒ [3.24.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-6.0.0) | -| rocSPARSE | 2.5.4 ⇒ [3.0.2](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-6.0.0) | -| rocThrust | 2.18.0 ⇒ [3.0.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-6.0.0) | -| rocWMMA | 1.2.0 ⇒ [1.3.0](https://github.com/ROCm/rocWMMA/releases/tag/rocm-6.0.0) | -| rpp | 1.2.0 ⇒ [1.4.0](https://github.com/ROCm/rpp/releases/tag/rocm-6.0.0) | -| Tensile | 4.38.0 ⇒ [4.39.0](https://github.com/ROCm/Tensile/releases/tag/rocm-6.0.0) | - -#### AMDMIGraphX - -MIGraphX 2.8 for ROCm 6.0.0 - -##### Additions - -* Support for MI300 GPUs -* Support for TorchMIGraphX via PyTorch -* Boosted overall performance by integrating rocMLIR -* INT8 support for ONNX Runtime -* Support for ONNX version 1.14.1 -* Added new operators: `Qlinearadd`, `QlinearGlobalAveragePool`, `Qlinearconv`, `Shrink`, `CastLike`, - and `RandomUniform` -* Added an error message for when `gpu_targets` is not set during MIGraphX compilation -* Added parameter to set tolerances with `migraphx-driver` verify -* Added support for MXR files > 4 GB -* Added `MIGRAPHX_TRACE_MLIR` flag -* BETA added capability for using ROCm Composable Kernels via the `MIGRAPHX_ENABLE_CK=1` - environment variable - -##### Optimizations - -* Improved performance support for INT8 -* Improved time precision while benchmarking candidate kernels from CK or MLIR -* Removed contiguous from reshape parsing -* Updated the `ConstantOfShape` operator to support Dynamic Batch -* Simplified dynamic shapes-related operators to their static versions, where possible -* Improved debugging tools for accuracy issues -* Included a print warning about `miopen_fusion` while generating `mxr` -* General reduction in system memory usage during model compilation -* Created additional fusion opportunities during model compilation -* Improved debugging for matchers -* Improved general debug messages - -##### Fixes - -* Fixed scatter operator for nonstandard shapes with some models from ONNX Model Zoo -* Provided a compile option to improve the accuracy of some models by disabling Fast-Math -* Improved layernorm + pointwise fusion matching to ignore argument order -* Fixed accuracy issue with `ROIAlign` operator -* Fixed computation logic for the `Trilu` operator -* Fixed support for the DETR model - -##### Changes - -* Changed MIGraphX version to 2.8 -* Extracted the test packages into a separate deb file when building MIGraphX from source - -##### Removals - -* Removed building Python 2.7 bindings - -#### hipBLAS - -hipBLAS 2.0.0 for ROCm 6.0.0 - -##### Added - -- added option to define HIPBLAS_USE_HIP_BFLOAT16 to switch API to use hip_bfloat16 type -- added hipblasGemmExWithFlags API - -##### Deprecated - -- hipblasDatatype_t is deprecated and will be removed in a future release and replaced with hipDataType -- hipblasComplex and hipblasDoubleComplex are deprecated and will be removed in a future release and replaced with hipComplex and hipDoubleComplex -- use of hipblasDatatype_t for hipblasGemmEx for compute-type is deprecated and will be replaced with hipblasComputeType_t in a future release - -##### Removed - -- hipblasXtrmm that calculates B <- alpha * op(A) * B is removed and replaced with hipblasXtrmm that calculates C <- alpha * op(A) * B - -#### hipCUB - -hipCUB 3.0.0 for ROCm 6.0.0 - -##### Changed - -- Removed `DOWNLOAD_ROCPRIM`, forcing rocPRIM to download can be done with `DEPENDENCIES_FORCE_DOWNLOAD`. - -#### hipFFT - -hipFFT 1.0.13 for ROCm 6.0.0 - -##### Changed - -- hipfft-rider has been renamed to hipfft-bench, controlled by the BUILD_CLIENTS_BENCH CMake option. A link for the - old file name is installed, and the old BUILD_CLIENTS_RIDER CMake option is accepted for compatibility but both - will be removed in a future release. -- Binaries in debug builds no longer have a "-d" suffix. -- The minimum rocFFT required version has been updated to 1.0.21. - -##### Added - -- Implemented hipfftXtSetGPUs, hipfftXtMalloc, hipfftXtMemcpy, hipfftXtFree, hipfftXtExecDescriptor APIs to allow computing FFTs on multiple devices in a single process. - -#### hipRAND - -hipRAND 2.10.17 for ROCm 6.0.0 - -##### Fixed - -- Fixed benchmark and unit test builds on Windows. - -#### hipSOLVER - -hipSOLVER 2.0.0 for ROCm 6.0.0 - -##### Added - -- Added hipBLAS as an optional dependency to hipsolver-test. Use the `BUILD_HIPBLAS_TESTS` CMake option to test compatibility between hipSOLVER and hipBLAS. - -##### Changed - -- Types hipsolverOperation_t, hipsolverFillMode_t, and hipsolverSideMode_t are now aliases of hipblasOperation_t, hipblasFillMode_t, and hipblasSideMode_t. - -##### Fixed - -- Fixed tests for hipsolver info updates in ORGBR/UNGBR, ORGQR/UNGQR, - ORGTR/UNGTR, ORMQR/UNMQR, and ORMTR/UNMTR. - -#### hipSPARSE - -hipSPARSE 3.0.0 for ROCm 6.0.0 - -##### Added - -- Added hipsparseGetErrorName and hipsparseGetErrorString - -##### Changed - -- Changed hipsparseSpSV_solve() API function to match cusparse API -- Changed generic API functions to use const descriptors -- Documentation improved - -#### hipTensor - -hipTensor 1.1.0 for ROCm 6.0.0 - -##### Additions - -* Architecture support for gfx940, gfx941, and gfx942 -* Client tests configuration parameters now support YAML file input format - -##### Changes - -* Doxygen now treats warnings as errors - -##### Fixes - -* Client tests output redirections now behave accordingly -* Removed dependency static library deployment -* Security issues for documentation -* Compile issues in debug mode -* Corrected soft link for ROCm deployment - -#### rocALUTION - -rocALUTION 3.0.3 for ROCm 6.0.0 - -##### Added - -- Added support for 64bit integer vectors -- Added inclusive and exclusive sum functionality for Vector classes -- Added Transpose functionality for Global/LocalMatrix -- Added TripleMatrixProduct functionality LocalMatrix -- Added Sort() function for LocalVector class -- Added multiple stream support to the HIP backend - -##### Optimized - -- GlobalMatrix::Apply() now uses multiple streams to better hide communication - -##### Changed - -- Matrix dimensions and number of non-zeros are now stored using 64bit integers -- Improved ILUT preconditioner - -##### Removed - -- Removed LocalVector::GetIndexValues(ValueType\*) -- Removed LocalVector::SetIndexValues(const ValueType\*) -- Removed LocalMatrix::RSDirectInterpolation(const LocalVector&, const LocalVector&, LocalMatrix\*, LocalMatrix\*) -- Removed LocalMatrix::RSExtPIInterpolation(const LocalVector&, const LocalVector&, bool, float, LocalMatrix\*, LocalMatrix\*) -- Removed LocalMatrix::RugeStueben() -- Removed LocalMatrix::AMGSmoothedAggregation(ValueType, const LocalVector&, const LocalVector&, LocalMatrix\*, LocalMatrix\*, int) -- Removed LocalMatrix::AMGAggregation(const LocalVector&, LocalMatrix\*, LocalMatrix\*) - -##### Fixed - -- Unit tests do not ignore BCSR block dimension anymore -- Fixed typos in the documentation -- Fixed a bug in multicoloring for non-symmetric matrix patterns - -#### rocBLAS - -rocBLAS 4.0.0 for ROCm 6.0.0 - -##### Added - -- Addition of beta API rocblas_gemm_batched_ex3 and rocblas_gemm_strided_batched_ex3 -- Added input/output type f16_r/bf16_r and execution type f32_r support for Level 2 gemv_batched and gemv_strided_batched -- Added rocblas_status_excluded_from_build to be used when calling functions which require Tensile when using rocBLAS built without Tensile -- Added system for async kernel launches setting a failure rocblas_status based on hipPeekAtLastError discrepancy - -##### Optimized - -- Trsm performance for small sizes m < 32 && n < 32 - -##### Deprecated - -- In a future release atomic operations will be disabled by default so results will be repeatable. Atomic operations can always be enabled or disabled using the function rocblas_set_atomics_mode. Enabling atomic operations can improve performance. - -##### Removed - -- rocblas_gemm_ext2 API function is removed -- in-place trmm API from Legacy BLAS is removed. It is replaced by an API that supports both in-place and out-of-place trmm -- int8x4 support is removed. int8 support is unchanged -- The #define STDC_WANT_IEC_60559_TYPES_EXT has been removed from rocblas-types.h. Users who want ISO/IEC TS 18661-3:2015 functionality must define STDC_WANT_IEC_60559_TYPES_EXT before including float.h, math.h, and rocblas.h -- The default build removes device code for gfx803 architecture from the fat binary - -##### Fixed - -- Make offset calculations for rocBLAS functions 64 bit safe. Fixes for very large leading dimension or increment potentially causing overflow: - - Level2: gbmv, gemv, hbmv, sbmv, spmv, tbmv, tpmv, tbsv, tpsv -- Lazy loading to support heterogeneous architecture setup and load appropriate tensile library files based on the device's architecture -- Guard against no-op kernel launches resulting in potential hipGetLastError - -##### Changed - -- Default verbosity of rocblas-test reduced. To see all tests set environment variable GTEST_LISTENER=PASS_LINE_IN_LOG - -#### rocFFT - -rocFFT 1.0.25 for ROCm 6.0.0 - -##### Added - -- Implemented experimental APIs to allow computing FFTs on data distributed across multiple devices in a single process. - - `rocfft_field` is a new type that can be added to a plan description, to describe layout of FFT input or output. `rocfft_field_add_brick` can be called one or more times to describe a brick decomposition of an FFT field, where each brick can be assigned a different device. - - These interfaces are still experimental and subject to change. We are interested to hear feedback on them. Questions and concerns may be raised by opening issues on the [rocFFT issue tracker](https://github.com/ROCmSoftwarePlatform/rocFFT/issues). - - Note that at this time, multi-device FFTs have several limitations: - - * Real-complex (forward or inverse) FFTs are not currently supported. - * Planar format fields are not currently supported. - * Batch (i.e. `number_of_transforms` provided to `rocfft_plan_create`) must be 1. - * The FFT input is gathered to the current device at execute time, so all of the FFT data must fit on that device. - - We expect these limitations to be removed in future releases. - -##### Optimizations - -- Improved performance of some small 2D/3D real FFTs supported by 2D_SINGLE kernel. gfx90a gets more optimization - by offline tuning. -- Removed an extra kernel launch from even-length real-complex FFTs that use callbacks. - -##### Changed - -- Built kernels in solution-map to library kernel cache. -- Real forward transforms (real-to-complex) no longer overwrite input. rocFFT still may overwrite real inverse (complex-to-real) input, as this allows for faster performance. - -- rocfft-rider and dyna-rocfft-rider have been renamed to rocfft-bench and dyna-rocfft-bench, controlled by the - BUILD_CLIENTS_BENCH CMake option. Links for the old file names are installed, and the old - BUILD_CLIENTS_RIDER CMake option is accepted for compatibility but both will be removed in a future release. -- Binaries in debug builds no longer have a "-d" suffix. - -##### Fixed - -- rocFFT now correctly handles load callbacks that convert data from a smaller data type (e.g. 16-bit integers -> 32-bit float). - -#### rocm-cmake - -rocm-cmake 0.11.0 for ROCm 6.0.0 - -##### Changed - -- ROCMSphinxDoc: Improved validation, documentation and rocm-docs-core integration. - -##### Fixed - -- ROCMClangTidy: Fixed extra make flags passed for clang tidy. -- ROCMTest: Fixed issues when using module in a subdirectory. - -#### rocPRIM - -rocPRIM 3.0.0 for ROCm 6.0.0 - -##### Added - -- `block_sort::sort()` overload for keys and values with a dynamic size, for all block sort algorithms. Additionally, all `block_sort::sort()` overloads with a dynamic size are now supported for `block_sort_algorithm::merge_sort` and `block_sort_algorithm::bitonic_sort`. -- New two-way partition primitive `partition_two_way` which can write to two separate iterators. - -##### Optimizations - -- Improved the performance of `partition`. - -##### Fixed - -- Fixed `rocprim::MatchAny` for devices with 64-bit warp size. The function `rocprim::MatchAny` is deprecated and `rocprim::match_any` is preferred instead. - -#### rocSOLVER - -rocSOLVER 3.24.0 for ROCm 6.0.0 - -##### Added - -- Cholesky refactorization for sparse matrices - - CSRRF_REFACTCHOL -- Added `rocsolver_rfinfo_mode` and the ability to specify the desired refactorization routine (see `rocsolver_set_rfinfo_mode`). - -##### Changed - -- CSRRF_ANALYSIS and CSRRF_SOLVE now support sparse Cholesky factorization - -#### rocSPARSE - -rocSPARSE 3.0.2 for ROCm 6.0.0 - -##### Added - -- Added rocsparse_inverse_permutation -- Added mixed precisions for SpVV -- Added uniform int8 precision for Gather and Scatter - -##### Optimized - -- Optimization to doti routine -- Optimization to spin-looping algorithms - -##### Changed - -- Changed rocsparse_spmv function arguments -- Changed rocsparse_xbsrmv routines function arguments -- doti, dotci, spvv, and csr2ell now require calling hipStreamSynchronize after when using host pointer mode -- Improved documentation -- Improved verbose output during argument checking on API function calls - -##### Deprecated - -- Deprecated rocsparse_spmv_ex -- Deprecated rocsparse_xbsrmv_ex routines - -##### Removed - -- Removed auto stages from spmv, spmm, spgemm, spsv, spsm, and spitsv. -- Removed rocsparse_spmm_ex routine - -##### Fixed - -- Fixed a bug in rocsparse-bench, where SpMV algorithm was not taken into account in CSR format -- Fixed the BSR/GEBSR routines bsrmv, bsrsv, bsrmm, bsrgeam, gebsrmv, gebsrmm so that block_dim==0 is considered an invalid size -- Fixed bug where passing nnz = 0 to doti or dotci did not always return a dot product of 0 - -#### rocThrust - -rocThrust 3.0.0 for ROCm 6.0.0 - -##### Added - -- Updated to match upstream Thrust 2.0.1 -- NV_IF_TARGET macro from libcu++ for NVIDIA backend and HIP implementation for HIP backend. - -##### Changed - -- The cmake build system now additionally accepts `GPU_TARGETS` in addition to `AMDGPU_TARGETS` for - setting the targeted gpu architectures. `GPU_TARGETS=all` will compile for all supported architectures. - `AMDGPU_TARGETS` is only provided for backwards compatibility, `GPU_TARGETS` should be preferred. - -##### Removed - -- Removed cub symlink from the root of the repository. -- Removed support for deprecated macros (THRUST_DEVICE_BACKEND and THRUST_HOST_BACKEND). - -##### Fixed - -- Fixed a segmentation fault when binary search / upper bound / lower bound / equal range was invoked with `hip_rocprim::execute_on_stream_base` policy. - -##### Known Issues - -- For NVIDIA backend, `NV_IF_TARGET` and `THRUST_RDC_ENABLED` intend to substitute the `THRUST_HAS_CUDART` macro, which is now no longer used in Thrust (provided for legacy support only). However, there is no `THRUST_RDC_ENABLED` macro available for the HIP backend, so some branches in Thrust's code may be unreachable in the HIP backend. - -#### rocWMMA - -rocWMMA 1.3.0 for ROCm 6.0.0 - -##### Added - -- Added support for gfx940, gfx941 and gfx942 targets -- Added support for f8, bf8 and xfloat32 datatypes -- Added support for HIP_NO_HALF, __ HIP_NO_HALF_CONVERSIONS__ and __ HIP_NO_HALF_OPERATORS__ (e.g. pytorch environment) - -##### Changed - -- rocWMMA with hipRTC now supports bfloat16_t datatype -- gfx11 wmma now uses lane swap instead of broadcast for layout adjustment -- Updated samples GEMM parameter validation on host arch - -##### Fixed - -- Disabled gtest static library deployment -- Extended tests now build in large code model - -#### rpp - -rpp for ROCm 6.0.0 - -##### Added - -* New Tests - -##### Optimizations - -* Readme Updates - -##### Changed - -* **Backend** - Default Backend set to `HIP` - -##### Fixed - -* Minor bugs and warnings - -##### Tested Configurations - -* Linux distribution - + Ubuntu - `18.04` / `20.04` - + CentOS - `8` -* ROCm: rocm-core - `5.0.0.50000-49` -* Clang - Version `6.0` -* CMake - Version `3.22.3` -* Boost - Version `1.72` -* IEEE 754-based half-precision floating-point library - Version `1.12.0` - -##### Rpp 1.3.0 - - - -##### Rpp 1.2.0 - - - -##### Known Issues - -* `CPU` only backend not enabled - -##### Rpp 1.1.0 - - - -##### Rpp 1.0.0 - - - -##### Rpp 0.99 - - - -##### Rpp 0.98 - - - -##### Rpp 0.97 - - - -##### Rpp 0.96 - - - -##### Rpp 0.95 - - - -##### Rpp 0.93 - - - -#### Tensile - -Tensile 4.39.0 for ROCm 6.0.0 - -##### Added - -- Added aquavanjaram support: gfx940/gfx941/gfx942, fp8/bf8 datatype, xf32 datatype, and stochastic rounding for various datatypes -- Added/updated tuning scripts -- Added DirectToLds support for larger data types with 32bit global load (old parameter DirectToLds is replaced with DirectToLdsA and DirectToLdsB), and the corresponding test cases -- Added the average of frequency, power consumption, and temperature information for the winner kernels to the CSV file -- Added asmcap check for MFMA + const src -- Added support for wider local read + pack with v_perm (with VgprForLocalReadPacking=True) -- Added a new parameter to increase miLatencyLeft - -##### Optimizations - -- Enabled InitAccVgprOpt for MatrixInstruction cases -- Implemented local read related parameter calculations with DirectToVgpr -- Adjusted miIssueLatency for gfx940 -- Enabled dedicated vgpr allocation for local read + pack -- Optimized code initialization -- Optimized sgpr allocation -- Supported DGEMM TLUB + RLVW=2 for odd N (edge shift change) -- Enabled miLatency optimization for (gfx940/gfx941 + MFMA) for specific data types, and fixed instruction scheduling - -##### Changed - -- Removed old code for DTL + (bpe * GlobalReadVectorWidth > 4) -- Changed/updated failed CI tests for gfx11xx, InitAccVgprOpt, and DTLds -- Removed unused CustomKernels and ReplacementKernels -- Added a reject condition for DTVB + TransposeLDS=False (not supported so far) -- Removed unused code for DirectToLds -- Updated test cases for DTV + TransposeLDS=False -- Moved parameter MinKForGSU from globalparameter to BenchmarkCommonParameter to support smaller K -- Changed how to calculate latencyForLR for miLatency -- Set minimum value of latencyForLRCount for 1LDSBuffer to avoid getting rejected by overflowedResources=5 (related to miLatency) -- Refactored allowLRVWBforTLUandMI and renamed it as VectorWidthB -- Supported multi-gpu for different architectures in lazy library loading -- Enabled dtree library for batch > 1 -- Added problem scale feature for dtree selection -- Enabled ROCm SMI for gfx940/941. -- Modified non-lazy load build to skip experimental logic - -##### Fixed - -- Fixed predicate ordering for fp16alt impl round near zero mode to unbreak distance modes -- Fixed boundary check for mirror dims and re-enable disabled mirror dims test cases -- Fixed merge error affecting i8 with wmma -- Fixed mismatch issue with DTLds + TSGR + TailLoop -- Fixed a bug with InitAccVgprOpt + GSU>1 and a mismatch issue with PGR=0 -- Fixed override for unloaded solutions when lazy loading -- Fixed build some errors (adding missing headers) -- Fixed boost link for a clean build on ubuntu22 -- Fixed bug in forcestoresc1 arch selection -- Fixed compiler directive for gfx941 and gfx942 -- Fixed formatting for DecisionTree_test.cpp - -------------------- - -## ROCm 5.7.1 - - - -### What's new in this release - -ROCm 5.7.1 is a point release with several bug fixes in the HIP runtime. - -#### Installing all GPU AddressSanitizer packages with a single command - -ROCm 5.7.1 simplifies the installation steps for the optional AddressSanitizer (ASan) packages. This -release provides the meta package *rocm-ml-sdk-asan* for ease of ASan installation. The following -command can be used to install all ASan packages rather than installing each package separately, - - sudo apt-get install rocm-ml-sdk-asan - -For more detailed information about using the GPU AddressSanitizer, refer to the -[user guide](https://rocm.docs.amd.com/en/docs-5.7.1/understand/using_gpu_sanitizer.html) - -### ROCm libraries - -#### rocBLAS -A new functionality rocblas-gemm-tune and an environment variable -ROCBLAS_TENSILE_GEMM_OVERRIDE_PATH are added to rocBLAS in the ROCm 5.7.1 release. - -`rocblas-gemm-tune` is used to find the best-performing GEMM kernel for each GEMM problem set. It -has a command line interface, which mimics the --yaml input used by rocblas-bench. To generate the -expected --yaml input, profile logging can be used, by setting the environment variable -ROCBLAS_LAYER4. - -For more information on rocBLAS logging, see Logging in rocBLAS, in the -[API Reference Guide](https://rocm.docs.amd.com/projects/rocBLAS/en/docs-5.7.1/API_Reference_Guide.html#logging-in-rocblas). - -An example input file: Expected output (note selected GEMM idx may differ): Where the far right values -(solution_index) are the indices of the best-performing kernels for those GEMMs in the rocBLAS kernel -library. These indices can be directly used in future GEMM calls. See -` rocBLAS/samples/example_user_driven_tuning.cpp` for sample code of directly using kernels via their -indices. - -If the output is stored in a file, the results can be used to override default kernel selection with the -kernels found by setting the environment variable ROCBLAS_TENSILE_GEMM_OVERRIDE_PATH, which -points to the stored file. - -For more details, refer to the -[rocBLAS Programmer's Guide](https://rocm.docs.amd.com/projects/rocBLAS/en/docs-5.7.1/Programmers_Guide.html). - -#### HIP 5.7.1 (for ROCm 5.7.1) - -ROCm 5.7.1 is a point release with several bug fixes in the HIP runtime. - -### Defect fixes - -The `hipPointerGetAttributes` API returns the correct HIP memory type as `hipMemoryTypeManaged` -for managed memory. - -### Library changes in ROCm 5.7.1 - -| Library | Version | -|---------|---------| -| AMDMIGraphX | [2.7](https://github.com/ROCm/AMDMIGraphX/releases/tag/rocm-5.7.1) | -| composable_kernel | [0.2.0](https://github.com/ROCm/composable_kernel/releases/tag/rocm-5.7.1) | -| hipBLAS | [1.1.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-5.7.1) | -| hipCUB | [2.13.1](https://github.com/ROCm/hipCUB/releases/tag/rocm-5.7.1) | -| hipFFT | [1.0.12](https://github.com/ROCm/hipFFT/releases/tag/rocm-5.7.1) | -| hipRAND | [2.10.16](https://github.com/ROCm/hipRAND/releases/tag/rocm-5.7.1) | -| hipSOLVER | 1.8.1 ⇒ [1.8.2](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-5.7.1) | -| hipSPARSE | [2.3.8](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-5.7.1) | -| MIOpen | [2.19.0](https://github.com/ROCm/MIOpen/releases/tag/rocm-5.7.1) | -| MIVisionX | [2.5.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-5.7.1) | -| rocALUTION | [2.1.11](https://github.com/ROCm/rocALUTION/releases/tag/rocm-5.7.1) | -| rocBLAS | [3.1.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-5.7.1) | -| rocFFT | [1.0.24](https://github.com/ROCm/rocFFT/releases/tag/rocm-5.7.1) | -| rocm-cmake | [0.10.0](https://github.com/ROCm/rocm-cmake/releases/tag/rocm-5.7.1) | -| rocPRIM | [2.13.1](https://github.com/ROCm/rocPRIM/releases/tag/rocm-5.7.1) | -| rocRAND | [2.10.17](https://github.com/ROCm/rocRAND/releases/tag/rocm-5.7.1) | -| rocSOLVER | [3.23.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-5.7.1) | -| rocSPARSE | [2.5.4](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-5.7.1) | -| rocThrust | [2.18.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-5.7.1) | -| rocWMMA | [1.2.0](https://github.com/ROCm/rocWMMA/releases/tag/rocm-5.7.1) | -| rpp | [1.2.0](https://github.com/ROCm/rpp/releases/tag/rocm-5.7.1) | -| Tensile | [4.38.0](https://github.com/ROCm/Tensile/releases/tag/rocm-5.7.1) | - -#### hipSOLVER - -hipSOLVER 1.8.2 for ROCm 5.7.1 - -##### Fixed - -- Fixed conflicts between the hipsolver-dev and -asan packages by excluding - hipsolver_module.f90 from the latter - -------------------- - -## ROCm 5.7.0 - - - -### Release highlights for ROCm 5.7 - -New features include: - -* A new library (hipTensor) -* Optimizations for rocRAND and MIVisionX -* AddressSanitizer for host and device code (GPU) is now available as a beta - -Note that ROCm 5.7.0 is EOS for MI50. 5.7 versions of ROCm are the last major releases in the ROCm 5 -series. This release is Linux-only. - -:::{important} -The next major ROCm release (ROCm 6.0) will not be backward compatible with the ROCm 5 series. -Changes will include: splitting LLVM packages into more manageable sizes, changes to the HIP runtime -API, splitting rocRAND and hipRAND into separate packages, and reorganizing our file structure. -::: - -#### AMD Instinct™ MI50 end-of-support notice - -AMD Instinct MI50, Radeon Pro VII, and Radeon VII products (collectively gfx906 GPUs) will enter -maintenance mode starting Q3 2023. - -As outlined in [5.6.0](https://rocm.docs.amd.com/en/docs-5.6.0/release.html), ROCm 5.7 will be the -final release for gfx906 GPUs to be in a fully supported state. - -* ROCm 6.0 release will show MI50s as "under maintenance" for - {doc}`Linux` and - {doc}`Windows` - -* No new features and performance optimizations will be supported for the gfx906 GPUs beyond this - major release (ROCm 5.7). - -* Bug fixes and critical security patches will continue to be supported for the gfx906 GPUs until Q2 - 2024 (end of maintenance \[EOM] will be aligned with the closest ROCm release). - -* Bug fixes during the maintenance will be made to the next ROCm point release. - -* Bug fixes will not be backported to older ROCm releases for gfx906. - -* Distribution and operating system updates will continue per the ROCm release cadence for gfx906 - GPUs until EOM. - -#### Feature updates - -##### Non-hostcall HIP printf - -**Current behavior** - -The current version of HIP printf relies on hostcalls, which, in turn, rely on PCIe atomics. However, PCle -atomics are unavailable in some environments, and, as a result, HIP-printf does not work in those -environments. Users may see the following error from runtime (with AMD_LOG_LEVEL 1 and above): - -```shell - Pcie atomics not enabled, hostcall not supported -``` - -**Workaround** - -The ROCm 5.7 release introduces an alternative to the current hostcall-based implementation that -leverages an older OpenCL-based printf scheme, which does not rely on hostcalls/PCIe atomics. - -:::{note} -This option is less robust than hostcall-based implementation and is intended to be a -workaround when hostcalls do not work. -::: - -The printf variant is now controlled via a new compiler option -mprintf-kind=. This is -supported only for HIP programs and takes the following values, - -* “hostcall” – This currently available implementation relies on hostcalls, which require the system to - support PCIe atomics. It is the default scheme. - -* “buffered” – This implementation leverages the older printf scheme used by OpenCL; it relies on a - memory buffer where printf arguments are stored during the kernel execution, and then the runtime - handles the actual printing once the kernel finishes execution. - -**NOTE**: With the new workaround: - -* The printf buffer is fixed size and non-circular. After the buffer is filled, calls to printf will not result in - additional output. - -* The printf call returns either 0 (on success) or -1 (on failure, due to full buffer), unlike the hostcall - scheme that returns the number of characters printed. - -##### Beta release of LLVM AddressSanitizer (ASan) with the GPU - -The ROCm 5.7 release introduces the beta release of LLVM AddressSanitizer (ASan) with the GPU. The -LLVM ASan provides a process that allows developers to detect runtime addressing errors in -applications and libraries. The detection is achieved using a combination of compiler-added -instrumentation and runtime techniques, including function interception and replacement. - -Until now, the LLVM ASan process was only available for traditional purely CPU applications. However, -ROCm has extended this mechanism to additionally allow the detection of some addressing errors on -the GPU in heterogeneous applications. Ideally, developers should treat heterogeneous HIP and -OpenMP applications like pure CPU applications. However, this simplicity has not been achieved yet. - -Refer to the documentation on LLVM ASan with the GPU at -[LLVM AddressSanitizer User Guide](../conceptual/using-gpu-sanitizer.md). - -:::{note} -The beta release of LLVM ASan for ROCm is currently tested and validated on Ubuntu 20.04. -::: - -#### Defect fixes - -The following defects are fixed in ROCm v5.7: - -* Test hangs observed in HMM RCCL - -* NoGpuTst test of Catch2 fails with Docker - -* Failures observed with non-HMM HIP directed catch2 tests with XNACK+ - -* Multiple test failures and test hangs observed in hip-directed catch2 tests with xnack+ - -#### HIP 5.7.0 - -##### Optimizations - -##### Additions - -* Added `meta_group_size`/`rank` for getting the number of tiles and rank of a tile in the partition - -* Added new APIs supporting Windows only, under development on Linux - - * `hipMallocMipmappedArray` for allocating a mipmapped array on the device - - * `hipFreeMipmappedArray` for freeing a mipmapped array on the device - - * `hipGetMipmappedArrayLevel` for getting a mipmap level of a HIP mipmapped array - - * `hipMipmappedArrayCreate` for creating a mipmapped array - - * `hipMipmappedArrayDestroy` for destroy a mipmapped array - - * `hipMipmappedArrayGetLevel` for getting a mipmapped array on a mipmapped level - -##### Changes - -##### Fixes - -##### Known issues - -* HIP memory type enum values currently don't support equivalent value to - `cudaMemoryTypeUnregistered`, due to HIP functionality backward compatibility. -* HIP API `hipPointerGetAttributes` could return invalid value in case the input memory pointer was not - allocated through any HIP API on device or host. - -##### Upcoming changes for HIP in ROCm 6.0 release - -* Removal of `gcnarch` from hipDeviceProp_t structure - -* Addition of new fields in hipDeviceProp_t structure - - * maxTexture1D - - * maxTexture2D - - * maxTexture1DLayered - - * maxTexture2DLayered - - * sharedMemPerMultiprocessor - - * deviceOverlap - - * asyncEngineCount - - * surfaceAlignment - - * unifiedAddressing - - * computePreemptionSupported - - * hostRegisterSupported - - * uuid - -* Removal of deprecated code -hip-hcc codes from hip code tree - -* Correct hipArray usage in HIP APIs such as `hipMemcpyAtoH` and `hipMemcpyHtoA` - -* HIPMEMCPY_3D fields correction to avoid truncation of "size_t" to "unsigned int" inside - `hipMemcpy3D()` - -* Renaming of 'memoryType' in `hipPointerAttribute_t` structure to 'type' - -* Correct `hipGetLastError` to return the last error instead of last API call's return code - -* Update `hipExternalSemaphoreHandleDesc` to add "unsigned int reserved[16]" - -* Correct handling of flag values in `hipIpcOpenMemHandle` for `hipIpcMemLazyEnablePeerAccess` - -* Remove `hiparray*` and make it opaque with `hipArray_t` - -### Library changes in ROCm 5.7.0 - -| Library | Version | -|---------|---------| -| AMDMIGraphX | 2.5 ⇒ [2.7](https://github.com/ROCm/AMDMIGraphX/releases/tag/rocm-5.7.0) | -| composable_kernel | [0.2.0](https://github.com/ROCm/composable_kernel/releases/tag/rocm-5.7.0) | -| hipBLAS | 0.54.0 ⇒ [1.1.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-5.7.0) | -| hipCUB | [2.13.1](https://github.com/ROCm/hipCUB/releases/tag/rocm-5.7.0) | -| hipFFT | [1.0.12](https://github.com/ROCm/hipFFT/releases/tag/rocm-5.7.0) | -| hipRAND | [2.10.16](https://github.com/ROCm/hipRAND/releases/tag/rocm-5.7.0) | -| hipSOLVER | 1.8.0 ⇒ [1.8.1](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-5.7.0) | -| hipSPARSE | 2.3.7 ⇒ [2.3.8](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-5.7.0) | -| MIOpen | [2.19.0](https://github.com/ROCm/MIOpen/releases/tag/rocm-5.7.0) | -| MIVisionX | 2.4.0 ⇒ [2.5.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-5.7.0) | -| rocALUTION | 2.1.9 ⇒ [2.1.11](https://github.com/ROCm/rocALUTION/releases/tag/rocm-5.7.0) | -| rocBLAS | 3.0.0 ⇒ [3.1.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-5.7.0) | -| rocFFT | 1.0.23 ⇒ [1.0.24](https://github.com/ROCm/rocFFT/releases/tag/rocm-5.7.0) | -| rocm-cmake | 0.9.0 ⇒ [0.10.0](https://github.com/ROCm/rocm-cmake/releases/tag/rocm-5.7.0) | -| rocPRIM | 2.13.0 ⇒ [2.13.1](https://github.com/ROCm/rocPRIM/releases/tag/rocm-5.7.0) | -| rocRAND | [2.10.17](https://github.com/ROCm/rocRAND/releases/tag/rocm-5.7.0) | -| rocSOLVER | 3.22.0 ⇒ [3.23.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-5.7.0) | -| rocSPARSE | 2.5.2 ⇒ [2.5.4](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-5.7.0) | -| rocThrust | [2.18.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-5.7.0) | -| rocWMMA | 1.1.0 ⇒ [1.2.0](https://github.com/ROCm/rocWMMA/releases/tag/rocm-5.7.0) | -| rpp | [1.2.0](https://github.com/ROCm/rpp/releases/tag/rocm-5.7.0) | -| Tensile | 4.37.0 ⇒ [4.38.0](https://github.com/ROCm/Tensile/releases/tag/rocm-5.7.0) | - -#### AMDMIGraphX - -MIGraphX 2.7 for ROCm 5.7.0 - -##### Added - -- Enabled hipRTC to not require dev packages for migraphx runtime and allow the ROCm install to be in a different directory than it was during build time -- Add support for multi-target execution -- Added Dynamic Batch support with C++/Python APIs -- Add migraphx.create_argument to python API -- Added dockerfile example for Ubuntu 22.04 -- Add TensorFlow supported ops in driver similar to exist onnx operator list -- Add a MIGRAPHX_TRACE_MATCHES_FOR env variable to filter the matcher trace -- Improved debugging by printing max,min,mean and stddev values for TRACE_EVAL = 2 -- use fast_math flag instead of ENV flag for GELU -- Print message from driver if offload copy is set for compiled program - -##### Optimizations - -- Optimized for ONNX Runtime 1.14.0 -- Improved compile times by only building for the GPU on the system -- Improve performance of pointwise/reduction kernels when using NHWC layouts -- Load specific version of the migraphx_py library -- Annotate functions with the block size so the compiler can do a better job of optimizing -- Enable reshape on nonstandard shapes -- Use half HIP APIs to compute max and min -- Added support for broadcasted scalars to unsqueeze operator -- Improved multiplies with dot operator -- Handle broadcasts across dot and concat -- Add verify namespace for better symbol resolution - -##### Fixed - -- Resolved accuracy issues with FP16 resnet50 -- Update cpp generator to handle inf from float -- Fix assertion error during verify and make DCE work with tuples -- Fix convert operation for NaNs -- Fix shape typo in API test -- Fix compile warnings for shadowing variable names -- Add missing specialization for the `nullptr` for the hash function - -##### Changed - -- Bumped version of half library to 5.6.0 -- Bumped CI to support rocm 5.6 -- Make building tests optional -- replace np.bool with bool as per numpy request - -##### Removed - -- Removed int8x4 rocBlas calls due to deprecation -- removed std::reduce usage since not all OS' support it - -#### composable_kernel - -CK 0.2.0 for ROCm 5.7.0 - -##### Fixed - -- Fixed a bug in 6-dimensional kernels (#555). -- Fixed grouped ConvBwdWeight test case failure (#524). - -##### Optimizations - -- Improve proformance of normalization kernel - -##### Added - -- Added support on NAVI3x. -- Added user tutorial (#563). -- Added more instances for irregular GEMM sizes (#560). -- Added inter-wave consumer-producer programming model for GEMM kernels (#310). -- Added multi-D GEMM client APIs (#534). -- Added multi-embeddings support (#542). -- Added Navi3x blockwise GEMM and real GEMM support (#541). -- Added Navi grouped ConvBwdWeight support (#505). - -##### Changed - -- Changed ... - -#### hipBLAS - -hipBLAS 1.1.0 for ROCm 5.7.0 - -##### Changed - -- updated documentation requirements - -##### Dependencies - -- dependency rocSOLVER now depends on rocSPARSE - -#### hipSOLVER - -hipSOLVER 1.8.1 for ROCm 5.7.0 - -##### Changed - -- Changed hipsolver-test sparse input data search paths to be relative to the test executable - -#### hipSPARSE - -hipSPARSE 2.3.8 for ROCm 5.7.0 - -##### Improved - -- Fix compilation failures when using cusparse 12.1.0 backend -- Fix compilation failures when using cusparse 12.0.0 backend -- Fix compilation failures when using cusparse 10.1 (non-update versions) as backend -- Minor improvements - -#### MIVisionX - -MIVisionX for ROCm 5.7.0 - -##### Added - -* CTest - OpenVX Tests -* Hardware Support - -##### Optimizations - -* CMakeList Cleanup - -##### Changed - -* rocAL - PyBind Link to prebuilt library - + PyBind11 - + RapidJSON -* Setup Updates -* RPP Version - 1.2.0 -* Dockerfiles - Updates & bugfix - -##### Fixed - -* rocAL bug fix and updates - -##### Tested Configurations - -* Windows `10` / `11` -* Linux distribution - + Ubuntu - `20.04` / `22.04` - + CentOS - `7` / `8` - + RHEL - `8` / `9` - + SLES - `15-SP4` -* ROCm: rocm-core - `5.4.3.50403-121` -* miopen-hip - `2.19.0.50403-121` -* miopen-opencl - `2.18.0.50300-63` -* migraphx - `2.4.0.50403-121` -* Protobuf - [V3.12.4](https://github.com/protocolbuffers/protobuf/releases/tag/v3.12.4) -* OpenCV - [4.6.0](https://github.com/opencv/opencv/releases/tag/4.6.0) -* RPP - [1.2.0](https://github.com/GPUOpen-ProfessionalCompute-Libraries/rpp/releases/tag/1.2.0) -* FFMPEG - [n4.4.2](https://github.com/FFmpeg/FFmpeg/releases/tag/n4.4.2) -* Dependencies for all the above packages -* MIVisionX Setup Script - `V2.5.4` - -##### Known Issues - -* OpenCV 4.X support for some apps missing - -##### Mivisionx Dependency Map - - - -##### Hip Backend - -**Docker Image:** `sudo docker build -f docker/ubuntu20/{DOCKER_LEVEL_FILE_NAME}.dockerfile -t {mivisionx-level-NUMBER} .` - -- ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `new component added to the level` -- ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `existing component from the previous level` - -| Build Level | MIVisionX Dependencies | Modules | Libraries and Executables | Docker Tag | -| ----------- | -------------------------------------------------- | ------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Level_1` | cmake <br> gcc <br> g++ | amd_openvx <br> utilities | ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libopenvx.so` - OpenVX&trade; Lib - CPU <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libvxu.so` - OpenVX&trade; immediate node Lib - CPU <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `runvx` - OpenVX&trade; Graph Executor - CPU with Display OFF | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-1?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_2` | ROCm HIP <br> +Level 1 | amd_openvx <br> amd_openvx_extensions <br> utilities | ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libopenvx.so` - OpenVX&trade; Lib - CPU/GPU <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libvxu.so` - OpenVX&trade; immediate node Lib - CPU/GPU <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `runvx` - OpenVX&trade; Graph Executor - Display OFF | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-2?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_3` | OpenCV <br> FFMPEG <br> +Level 2 | amd_openvx <br> amd_openvx_extensions <br> utilities | ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libopenvx.so` - OpenVX&trade; Lib <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvxu.so` - OpenVX&trade; immediate node Lib <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libvx_amd_media.so` - OpenVX&trade; Media Extension <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libvx_opencv.so` - OpenVX&trade; OpenCV InterOp Extension <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `mv_compile` - Neural Net Model Compile <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `runvx` - OpenVX&trade; Graph Executor - Display ON | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-3?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_4` | MIOpenGEMM <br> MIOpen <br> ProtoBuf <br> +Level 3 | amd_openvx <br> amd_openvx_extensions <br> apps <br> utilities | ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libopenvx.so` - OpenVX&trade; Lib <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvxu.so` - OpenVX&trade; immediate node Lib <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvx_amd_media.so` - OpenVX&trade; Media Extension <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvx_opencv.so` - OpenVX&trade; OpenCV InterOp Extension <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `mv_compile` - Neural Net Model Compile <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `runvx` - OpenVX&trade; Graph Executor - Display ON <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libvx_nn.so` - OpenVX&trade; Neural Net Extension | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-4?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_5` | AMD_RPP <br> rocAL deps <br> +Level 4 | amd_openvx <br> amd_openvx_extensions <br> apps <br> rocAL <br> utilities | ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libopenvx.so` - OpenVX&trade; Lib <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvxu.so` - OpenVX&trade; immediate node Lib <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvx_amd_media.so` - OpenVX&trade; Media Extension <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvx_opencv.so` - OpenVX&trade; OpenCV InterOp Extension <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `mv_compile` - Neural Net Model Compile <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `runvx` - OpenVX&trade; Graph Executor - Display ON <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvx_nn.so` - OpenVX&trade; Neural Net Extension <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libvx_rpp.so` - OpenVX&trade; RPP Extension <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `librocal.so` - Radeon Augmentation Library <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `rocal_pybind.so` - rocAL Pybind Lib | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-5?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | - -##### Opencl Backend - -**Docker Image:** `sudo docker build -f docker/ubuntu20/{DOCKER_LEVEL_FILE_NAME}.dockerfile -t {mivisionx-level-NUMBER} .` - -- ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `new component added to the level` -- ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `existing component from the previous level` - -| Build Level | MIVisionX Dependencies | Modules | Libraries and Executables | Docker Tag | -| ----------- | -------------------------------------------------- | ------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Level_1` | cmake <br> gcc <br> g++ | amd_openvx <br> utilities | ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libopenvx.so` - OpenVX&trade; Lib - CPU <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libvxu.so` - OpenVX&trade; immediate node Lib - CPU <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `runvx` - OpenVX&trade; Graph Executor - CPU with Display OFF | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-1?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_2` | ROCm OpenCL <br> +Level 1 | amd_openvx <br> amd_openvx_extensions <br> utilities | ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libopenvx.so` - OpenVX&trade; Lib - CPU/GPU <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libvxu.so` - OpenVX&trade; immediate node Lib - CPU/GPU <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libvx_loomsl.so` - Loom 360 Stitch Lib <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `loom_shell` - 360 Stitch App <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `runcl` - OpenCL&trade; program debug App <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `runvx` - OpenVX&trade; Graph Executor - Display OFF | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-2?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_3` | OpenCV <br> FFMPEG <br> +Level 2 | amd_openvx <br> amd_openvx_extensions <br> utilities | ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libopenvx.so` - OpenVX&trade; Lib <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvxu.so` - OpenVX&trade; immediate node Lib <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvx_loomsl.so` - Loom 360 Stitch Lib <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `loom_shell` - 360 Stitch App <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `runcl` - OpenCL&trade; program debug App <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libvx_amd_media.so` - OpenVX&trade; Media Extension <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libvx_opencv.so` - OpenVX&trade; OpenCV InterOp Extension <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `mv_compile` - Neural Net Model Compile <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `runvx` - OpenVX&trade; Graph Executor - Display ON | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-3?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_4` | MIOpenGEMM <br> MIOpen <br> ProtoBuf <br> +Level 3 | amd_openvx <br> amd_openvx_extensions <br> apps <br> utilities | ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libopenvx.so` - OpenVX&trade; Lib <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvxu.so` - OpenVX&trade; immediate node Lib <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvx_loomsl.so` - Loom 360 Stitch Lib <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `loom_shell` - 360 Stitch App <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvx_amd_media.so` - OpenVX&trade; Media Extension <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvx_opencv.so` - OpenVX&trade; OpenCV InterOp Extension <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `mv_compile` - Neural Net Model Compile <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `runcl` - OpenCL&trade; program debug App <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `runvx` - OpenVX&trade; Graph Executor - Display ON <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libvx_nn.so` - OpenVX&trade; Neural Net Extension <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `inference_server_app` - Cloud Inference App | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-4?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_5` | AMD_RPP <br> rocAL deps <br> +Level 4 | amd_openvx <br> amd_openvx_extensions <br> apps <br> rocAL <br> utilities | ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libopenvx.so` - OpenVX&trade; Lib <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvxu.so` - OpenVX&trade; immediate node Lib <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvx_loomsl.so` - Loom 360 Stitch Lib <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `loom_shell` - 360 Stitch App <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvx_amd_media.so` - OpenVX&trade; Media Extension <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvx_opencv.so` - OpenVX&trade; OpenCV InterOp Extension <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `mv_compile` - Neural Net Model Compile <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `runcl` - OpenCL&trade; program debug App <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `runvx` - OpenVX&trade; Graph Executor - Display ON <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvx_nn.so` - OpenVX&trade; Neural Net Extension <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `inference_server_app` - Cloud Inference App <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libvx_rpp.so` - OpenVX&trade; RPP Extension <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `librocal.so` - Radeon Augmentation Library <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `rocal_pybind.so` - rocAL Pybind Lib | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-5?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | - -**NOTE:** OpenVX and the OpenVX logo are trademarks of the Khronos Group Inc. - -#### rocALUTION - -rocALUTION 2.1.11 for ROCm 5.7.0 - -##### Added - -- Added support for gfx940, gfx941 and gfx942 - -##### Improved - -- Fixed OpenMP runtime issue with Windows toolchain - -#### rocBLAS - -rocBLAS 3.1.0 for ROCm 5.7.0 - -##### Added - -- yaml lock step argument scanning for rocblas-bench and rocblas-test clients. See Programmers Guide for details. -- rocblas-gemm-tune is used to find the best performing GEMM kernel for each of a given set of GEMM problems. - -##### Fixed - -- make offset calculations for rocBLAS functions 64 bit safe. Fixes for very large leading dimensions or increments potentially causing overflow: - - Level 1: axpy, copy, rot, rotm, scal, swap, asum, dot, iamax, iamin, nrm2 - - Level 2: gemv, symv, hemv, trmv, ger, syr, her, syr2, her2, trsv - - Level 3: gemm, symm, hemm, trmm, syrk, herk, syr2k, her2k, syrkx, herkx, trsm, trtri, dgmm, geam - - General: set_vector, get_vector, set_matrix, get_matrix - - Related fixes: internal scalar loads with > 32bit offsets - - fix in-place functionality for all trtri sizes - -##### Changed - -- dot when using rocblas_pointer_mode_host is now synchronous to match legacy BLAS as it stores results in host memory -- enhanced reporting of installation issues caused by runtime libraries (Tensile) -- standardized internal rocblas C++ interface across most functions - -##### Deprecated - -- Removal of __STDC_WANT_IEC_60559_TYPES_EXT__ define in future release - -##### Dependencies - -- optional use of AOCL BLIS 4.0 on Linux for clients -- optional build tool only dependency on python psutil - -#### rocFFT - -rocFFT 1.0.24 for ROCm 5.7.0 - -##### Optimizations - -- Improved performance of complex forward/inverse 1D FFTs (2049 <= length <= 131071) that use Bluestein's algorithm. - -##### Added - -- Implemented a solution map version converter and finish the first conversion from ver.0 to ver.1. Where version 1 removes some incorrect kernels (sbrc/sbcr using half_lds) - -##### Changed - -- Moved rocfft_rtc_helper executable to lib/rocFFT directory on Linux. -- Moved library kernel cache to lib/rocFFT directory. - -#### rocm-cmake - -rocm-cmake 0.10.0 for ROCm 5.7.0 - -##### Added - -- Added ROCMTest module -- ROCMCreatePackage: Added support for ASAN packages - -#### rocPRIM - -rocPRIM 2.13.1 for ROCm 5.7.0 - -##### Changed - -- Deprecated configuration `radix_sort_config` for device-level radix sort as it no longer matches the algorithm's parameters. New configuration `radix_sort_config_v2` is preferred instead. -- Removed erroneous implementation of device-level `inclusive_scan` and `exclusive_scan`. The prior default implementation using lookback-scan now is the only available implementation. -- The benchmark metric indicating the bytes processed for `exclusive_scan_by_key` and `inclusive_scan_by_key` has been changed to incorporate the key type. Furthermore, the benchmark log has been changed such that these algorithms are reported as `scan` and `scan_by_key` instead of `scan_exclusive` and `scan_inclusive`. -- Deprecated configurations `scan_config` and `scan_by_key_config` for device-level scans, as they no longer match the algorithm's parameters. New configurations `scan_config_v2` and `scan_by_key_config_v2` are preferred instead. - -##### Fixed - -- Fixed build issue caused by missing header in `thread/thread_search.hpp`. - -#### rocSOLVER - -rocSOLVER 3.23.0 for ROCm 5.7.0 - -##### Added - -- LU factorization without pivoting for block tridiagonal matrices: - - GEBLTTRF_NPVT now supports interleaved\_batched format -- Linear system solver without pivoting for block tridiagonal matrices: - - GEBLTTRS_NPVT now supports interleaved\_batched format - -##### Fixed - -- Fixed stack overflow in sparse tests on Windows - -##### Changed - -- Changed rocsolver-test sparse input data search paths to be relative to the test executable -- Changed build scripts to default to compressed debug symbols in Debug builds - -#### rocSPARSE - -rocSPARSE 2.5.4 for ROCm 5.7.0 - -##### Added - -- Added more mixed precisions for SpMV, (matrix: float, vectors: double, calculation: double) and (matrix: rocsparse_float_complex, vectors: rocsparse_double_complex, calculation: rocsparse_double_complex) -- Added support for gfx940, gfx941 and gfx942 - -##### Improved - -- Fixed a bug in csrsm and bsrsm - -##### Known Issues - -In csritlu0, the algorithm rocsparse_itilu0_alg_sync_split_fusion has some accuracy issues to investigate with XNACK enabled. The fallback is rocsparse_itilu0_alg_sync_split. - -#### rocWMMA - -rocWMMA 1.2.0 for ROCm 5.7.0 - -##### Changed - -- Fixed a bug with synchronization -- Updated rocWMMA cmake versioning - -#### rpp - -rpp for ROCm 5.7.0 - -##### Added - -* New Tests - -##### Optimizations - -* Readme Updates - -##### Changed - -* **Backend** - Default Backend set to `HIP` - -##### Fixed - -* Minor bugs and warnings - -##### Tested Configurations - -* Linux distribution - + Ubuntu - `18.04` / `20.04` - + CentOS - `8` -* ROCm: rocm-core - `5.0.0.50000-49` -* Clang - Version `6.0` -* CMake - Version `3.22.3` -* Boost - Version `1.72` -* IEEE 754-based half-precision floating-point library - Version `1.12.0` - -##### Known Issues - -* `CPU` only backend not enabled - -##### Rpp 1.1.0 - - - -##### Rpp 1.0.0 - - - -##### Rpp 0.99 - - - -##### Rpp 0.98 - - - -##### Rpp 0.97 - - - -##### Rpp 0.96 - - - -##### Rpp 0.95 - - - -##### Rpp 0.93 - - - -#### Tensile - -Tensile 4.38.0 for ROCm 5.7.0 - -##### Added - -- Added support for FP16 Alt Round Near Zero Mode (this feature allows the generation of alternate kernels with intermediate rounding instead of truncation) -- Added user-driven solution selection feature - -##### Optimizations - -- Enabled LocalSplitU with MFMA for I8 data type -- Optimized K mask code in mfmaIter -- Enabled TailLoop code in NoLoadLoop to prefetch global/local read -- Enabled DirectToVgpr in TailLoop for NN, TN, and TT matrix orientations -- Optimized DirectToLds test cases to reduce the test duration - -##### Changed - -- Removed DGEMM NT custom kernels and related test cases -- Changed noTailLoop logic to apply noTailLoop only for NT -- Changed the range of AssertFree0ElementMultiple and Free1 -- Unified aStr, bStr generation code in mfmaIter - -##### Fixed - -- Fixed LocalSplitU mismatch issue for SGEMM -- Fixed BufferStore=0 and Ldc != Ldd case -- Fixed mismatch issue with TailLoop + MatrixInstB > 1 - -------------------- - -## ROCm 5.6.1 - - - -### What's new in this release - -ROCm 5.6.1 is a point release with several bug fixes in the HIP runtime. - -#### HIP 5.6.1 (for ROCm 5.6.1) - -### Defect fixes - -* `hipMemcpy` device-to-device (inter-device) is now asynchronous with respect to the host -* Enabled xnack+ check in HIP catch2 tests hang when executing tests -* Memory leak when code object files are loaded/unloaded via hipModuleLoad/hipModuleUnload APIs -* Using `hipGraphAddMemFreeNode` no longer results in a crash - -### Library changes in ROCm 5.6.1 - -| Library | Version | -|---------|---------| -| AMDMIGraphX | [2.5](https://github.com/ROCm/AMDMIGraphX/releases/tag/rocm-5.6.1) | -| hipBLAS | [0.53.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-5.6.1) | -| hipCUB | [2.13.1](https://github.com/ROCm/hipCUB/releases/tag/rocm-5.6.1) | -| hipFFT | [1.0.12](https://github.com/ROCm/hipFFT/releases/tag/rocm-5.6.1) | -| hipRAND | [2.10.16](https://github.com/ROCm/hipRAND/releases/tag/rocm-5.6.1) | -| hipSOLVER | [1.8.0](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-5.6.1) | -| hipSPARSE | 2.3.6 ⇒ [2.3.7](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-5.6.1) | -| MIOpen | [2.19.0](https://github.com/ROCm/MIOpen/releases/tag/rocm-5.6.1) | -| MIVisionX | [2.4.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-5.6.1) | -| rccl | [2.15.5](https://github.com/ROCm/rccl/releases/tag/rocm-5.6.1) | -| rocALUTION | [2.1.9](https://github.com/ROCm/rocALUTION/releases/tag/rocm-5.6.1) | -| rocBLAS | [3.0.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-5.6.1) | -| rocFFT | [1.0.23](https://github.com/ROCm/rocFFT/releases/tag/rocm-5.6.1) | -| rocm-cmake | [0.9.0](https://github.com/ROCm/rocm-cmake/releases/tag/rocm-5.6.1) | -| rocPRIM | [2.13.0](https://github.com/ROCm/rocPRIM/releases/tag/rocm-5.6.1) | -| rocRAND | [2.10.17](https://github.com/ROCm/rocRAND/releases/tag/rocm-5.6.1) | -| rocSOLVER | [3.22.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-5.6.1) | -| rocSPARSE | [2.5.2](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-5.6.1) | -| rocThrust | [2.18.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-5.6.1) | -| rocWMMA | [1.1.0](https://github.com/ROCm/rocWMMA/releases/tag/rocm-5.6.1) | -| Tensile | [4.37.0](https://github.com/ROCm/Tensile/releases/tag/rocm-5.6.1) | - -#### hipSPARSE - -hipSPARSE 2.3.7 for ROCm 5.6.1 - -##### Bugfix - -- Reverted an undocumented API change in hipSPARSE 2.3.6 that affected hipsparseSpSV_solve function - -------------------- - -## ROCm 5.6.0 - - - -### Release highlights - -ROCm 5.6 consists of several AI software ecosystem improvements to our fast-growing user base.  A -few examples include: - -* New documentation portal at https://rocm.docs.amd.com -* Ongoing software enhancements for LLMs, ensuring full compliance with the HuggingFace unit test - suite -* OpenAI Triton, CuPy, HIP Graph support, and many other library performance enhancements -* Improved ROCm deployment and development tools, including CPU-GPU (rocGDB) debugger, - profiler, and docker containers -* New pseudorandom generators are available in rocRAND. Added support for half-precision - transforms in hipFFT/rocFFT. Added LU refactorization and linear system solver for sparse matrices in - rocSOLVER. - -### OS and GPU support changes - -* SLES15 SP5 support was added this release. SLES15 SP3 support was dropped. -* AMD Instinct MI50, Radeon Pro VII, and Radeon VII products (collectively referred to as gfx906 GPUs) - will be entering the maintenance mode starting Q3 2023. This will be aligned with ROCm 5.7 GA - release date. - * No new features and performance optimizations will be supported for the gfx906 GPUs beyond - ROCm 5.7 - * Bug fixes / critical security patches will continue to be supported for the gfx906 GPUs till Q2 2024 - (EOM will be aligned with the closest ROCm release) - * Bug fixes during the maintenance will be made to the next ROCm point release - * Bug fixes will not be back ported to older ROCm releases for this SKU - * Distro / Operating system updates will continue per the ROCm release cadence for gfx906 GPUs till - EOM. - -### AMDSMI CLI 23.0.0.4 - -#### Additions - -* AMDSMI CLI tool enabled for Linux Bare Metal & Guest - -* Package: amd-smi-lib - -#### Known issues - -* not all Error Correction Code (ECC) fields are currently supported - -* RHEL 8 & SLES 15 have extra install steps - -### Kernel modules (DKMS) - -#### Fixes - -* Stability fix for multi GPU system reproducible via ROCm_Bandwidth_Test as reported in - [Issue 2198](https://github.com/ROCm/ROCm/issues/2198). - -### HIP 5.6 (for ROCm 5.6) - -#### Optimizations - -* Consolidation of hipamd, rocclr and OpenCL projects in clr -* Optimized lock for graph global capture mode - -#### Additions - -* Added hipRTC support for amd_hip_fp16 -* Added hipStreamGetDevice implementation to get the device associated with the stream -* Added HIP_AD_FORMAT_SIGNED_INT16 in hipArray formats -* hipArrayGetInfo for getting information about the specified array -* hipArrayGetDescriptor for getting 1D or 2D array descriptor -* hipArray3DGetDescriptor to get 3D array descriptor - -#### Changes - -* hipMallocAsync to return success for zero size allocation to match hipMalloc -* Separation of hipcc perl binaries from HIP project to hipcc project. hip-devel package depends on newly added hipcc package -* Consolidation of hipamd, ROCclr, and OpenCL repositories into a single repository called clr. Instructions are updated to build HIP from sources in the HIP Installation guide -* Removed hipBusBandwidth and hipCommander samples from hip-tests - -#### Fixes - -* Fixed regression in hipMemCpyParam3D when offset is applied - -#### Known issues - -* Limited testing on xnack+ configuration - * Multiple HIP tests failures (gpuvm fault or hangs) -* hipSetDevice and hipSetDeviceFlags APIs return hipErrorInvalidDevice instead of hipErrorNoDevice, on a system without GPU -* Known memory leak when code object files are loaded/unloaded via hipModuleLoad/hipModuleUnload APIs. Issue will be fixed in a future ROCm release - -#### Upcoming changes in future release - -* Removal of gcnarch from hipDeviceProp_t structure -* Addition of new fields in hipDeviceProp_t structure - * maxTexture1D - * maxTexture2D - * maxTexture1DLayered - * maxTexture2DLayered - * sharedMemPerMultiprocessor - * deviceOverlap - * asyncEngineCount - * surfaceAlignment - * unifiedAddressing - * computePreemptionSupported - * uuid -* Removal of deprecated code - * hip-hcc codes from hip code tree -* Correct hipArray usage in HIP APIs such as hipMemcpyAtoH and hipMemcpyHtoA -* HIPMEMCPY_3D fields correction (unsigned int -> size_t) -* Renaming of 'memoryType' in hipPointerAttribute_t structure to 'type' - -### ROCgdb-13 (For ROCm 5.6.0) - -#### Optimizations - -* Improved performances when handling the end of a process with a large number of threads. - -#### Known issues - -* On certain configurations, ROCgdb can show the following warning message: - - `warning: Probes-based dynamic linker interface failed. Reverting to original interface.` - - This does not affect ROCgdb's functionalities. - -### ROCprofiler (for ROCm 5.6.0) - -In ROCm 5.6 the `rocprofilerv1` and `rocprofilerv2` include and library files of -ROCm 5.5 are split into separate files. The `rocmtools` files that were -deprecated in ROCm 5.5 have been removed. - - | ROCm 5.6 | rocprofilerv1 | rocprofilerv2 | - |-----------------|-------------------------------------|----------------------------------------| - | **Tool script** | `bin/rocprof` | `bin/rocprofv2` | - | **API include** | `include/rocprofiler/rocprofiler.h` | `include/rocprofiler/v2/rocprofiler.h` | - | **API library** | `lib/librocprofiler.so.1` | `lib/librocprofiler.so.2` | - -The ROCm Profiler Tool that uses `rocprofilerV1` can be invoked using the -following command: - -```sh -rocprof … -``` - -To write a custom tool based on the `rocprofilerV1` API do the following: - -```C -main.c: -#include // Use the rocprofilerV1 API -int main() { - // Use the rocprofilerV1 API - return 0; -} -``` - -This can be built in the following manner: - -```sh -gcc main.c -I/opt/rocm-5.6.0/include -L/opt/rocm-5.6.0/lib -lrocprofiler64 -``` - -The resulting `a.out` will depend on -`/opt/rocm-5.6.0/lib/librocprofiler64.so.1`. - -The ROCm Profiler that uses `rocprofilerV2` API can be invoked using the -following command: - -```sh -rocprofv2 … -``` - -To write a custom tool based on the `rocprofilerV2` API do the following: - -```C -main.c: -#include // Use the rocprofilerV2 API -int main() { - // Use the rocprofilerV2 API - return 0; -} -``` - -This can be built in the following manner: - -```sh -gcc main.c -I/opt/rocm-5.6.0/include -L/opt/rocm-5.6.0/lib -lrocprofiler64-v2 -``` - -The resulting `a.out` will depend on -`/opt/rocm-5.6.0/lib/librocprofiler64.so.2`. - -#### Optimizations - -* Improved Test Suite - -#### Additions - -* 'end_time' need to be disabled in roctx_trace.txt - -#### Fixes - -* rocprof in ROcm/5.4.0 gpu selector broken. -* rocprof in ROCm/5.4.1 fails to generate kernel info. -* rocprof clobbers LD_PRELOAD. - -### Library changes in ROCm 5.6.0 - -| Library | Version | -|---------|---------| -| AMDMIGraphX | [2.5](https://github.com/ROCm/AMDMIGraphX/releases/tag/rocm-5.6.0) | -| hipBLAS | [0.53.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-5.6.0) | -| hipCUB | [2.13.1](https://github.com/ROCm/hipCUB/releases/tag/rocm-5.6.0) | -| hipFFT | 1.0.11 ⇒ [1.0.12](https://github.com/ROCm/hipFFT/releases/tag/rocm-5.6.0) | -| hipRAND | [2.10.16](https://github.com/ROCm/hipRAND/releases/tag/rocm-5.6.0) | -| hipSOLVER | 1.7.0 ⇒ [1.8.0](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-5.6.0) | -| hipSPARSE | 2.3.5 ⇒ [2.3.6](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-5.6.0) | -| MIOpen | [2.19.0](https://github.com/ROCm/MIOpen/releases/tag/rocm-5.6.0) | -| MIVisionX | 2.3.0 ⇒ [2.4.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-5.6.0) | -| rccl | [2.15.5](https://github.com/ROCm/rccl/releases/tag/rocm-5.6.0) | -| rocALUTION | 2.1.8 ⇒ [2.1.9](https://github.com/ROCm/rocALUTION/releases/tag/rocm-5.6.0) | -| rocBLAS | 2.47.0 ⇒ [3.0.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-5.6.0) | -| rocFFT | 1.0.22 ⇒ [1.0.23](https://github.com/ROCm/rocFFT/releases/tag/rocm-5.6.0) | -| rocm-cmake | 0.8.1 ⇒ [0.9.0](https://github.com/ROCm/rocm-cmake/releases/tag/rocm-5.6.0) | -| rocPRIM | [2.13.0](https://github.com/ROCm/rocPRIM/releases/tag/rocm-5.6.0) | -| rocRAND | [2.10.17](https://github.com/ROCm/rocRAND/releases/tag/rocm-5.6.0) | -| rocSOLVER | 3.21.0 ⇒ [3.22.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-5.6.0) | -| rocSPARSE | 2.5.1 ⇒ [2.5.2](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-5.6.0) | -| rocThrust | 2.17.0 ⇒ [2.18.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-5.6.0) | -| rocWMMA | 1.0 ⇒ [1.1.0](https://github.com/ROCm/rocWMMA/releases/tag/rocm-5.6.0) | -| Tensile | 4.36.0 ⇒ [4.37.0](https://github.com/ROCm/Tensile/releases/tag/rocm-5.6.0) | - -#### hipFFT - -hipFFT 1.0.12 for ROCm 5.6.0 - -##### Added - -- Implemented the hipfftXtMakePlanMany, hipfftXtGetSizeMany, hipfftXtExec APIs, to allow requesting half-precision transforms. - -##### Changed - -- Added --precision argument to benchmark/test clients. --double is still accepted but is deprecated as a method to request a double-precision transform. - -#### hipSOLVER - -hipSOLVER 1.8.0 for ROCm 5.6.0 - -##### Added - -- Added compatibility API with hipsolverRf prefix - -#### hipSPARSE - -hipSPARSE 2.3.6 for ROCm 5.6.0 - -##### Added - -- Added SpGEMM algorithms - -##### Changed - -- For hipsparseXbsr2csr and hipsparseXcsr2bsr, blockDim == 0 now returns HIPSPARSE_STATUS_INVALID_SIZE - -#### MIVisionX - -MIVisionX for ROCm 5.6.0 - -##### Added - -* OpenVX FP16 Support -* rocAL - CPU, HIP, & OCL backends -* AMD RPP - CPU, HIP, & OCL backends -* MIVisionX Setup Support for RHEL -* Extended OS Support -* Docker Support for Ubuntu `22.04` -* Tests - -##### Optimizations - -* CMakeList Cleanup -* MIGraphX Extension Updates -* rocAL - Documentation -* CMakeList Updates & Cleanup - -##### Changed - -* rocAL - Changing Python Lib Path -* Docker Support - Ubuntu 18 Support Dropped -* RPP - Link to Version 1.0.0 -* rocAL - support updates -* Setup Updates - -##### Fixed - -* rocAL bug fix and updates -* AMD RPP - bug fixes -* CMakeLists - Issues -* RPATH - Link Issues - -##### Tested Configurations - -* Windows `10` / `11` -* Linux distribution - + Ubuntu - `20.04` / `22.04` - + CentOS - `7` / `8` - + RHEL - `8` / `9` - + SLES - `15-SP3` -* ROCm: rocm-core - `5.4.3.50403-121` -* miopen-hip - `2.19.0.50403-121` -* miopen-opencl - `2.18.0.50300-63` -* migraphx - `2.4.0.50403-121` -* Protobuf - [V3.12.4](https://github.com/protocolbuffers/protobuf/releases/tag/v3.12.4) -* OpenCV - [4.6.0](https://github.com/opencv/opencv/releases/tag/4.6.0) -* RPP - [1.0.0](https://github.com/GPUOpen-ProfessionalCompute-Libraries/rpp/releases/tag/1.0.0) -* FFMPEG - [n4.4.2](https://github.com/FFmpeg/FFmpeg/releases/tag/n4.4.2) -* Dependencies for all the above packages -* MIVisionX Setup Script - `V2.4.2` - -##### Known Issues - -* OpenCV 4.X support for some apps missing - -##### Mivisionx Dependency Map - -**Docker Image:** `sudo docker build -f docker/ubuntu20/{DOCKER_LEVEL_FILE_NAME}.dockerfile -t {mivisionx-level-NUMBER} .` - -- ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `new component added to the level` -- ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `existing component from the previous level` - -| Build Level | MIVisionX Dependencies | Modules | Libraries and Executables | Docker Tag | -| ----------- | -------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Level_1` | cmake <br> gcc <br> g++ | amd_openvx <br> utilities | ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libopenvx.so` - OpenVX&trade; Lib - CPU <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libvxu.so` - OpenVX&trade; immediate node Lib - CPU <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `runvx` - OpenVX&trade; Graph Executor - CPU with Display OFF | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-1?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_2` | ROCm OpenCL <br> +Level 1 | amd_openvx <br> amd_openvx_extensions <br> utilities | ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libopenvx.so` - OpenVX&trade; Lib - CPU/GPU <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libvxu.so` - OpenVX&trade; immediate node Lib - CPU/GPU <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libvx_loomsl.so` - Loom 360 Stitch Lib <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `loom_shell` - 360 Stitch App <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `runcl` - OpenCL&trade; program debug App <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `runvx` - OpenVX&trade; Graph Executor - Display OFF | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-2?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_3` | OpenCV <br> FFMPEG <br> +Level 2 | amd_openvx <br> amd_openvx_extensions <br> utilities | ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libopenvx.so` - OpenVX&trade; Lib <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvxu.so` - OpenVX&trade; immediate node Lib <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvx_loomsl.so` - Loom 360 Stitch Lib <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `loom_shell` - 360 Stitch App <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `runcl` - OpenCL&trade; program debug App <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libvx_amd_media.so` - OpenVX&trade; Media Extension <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libvx_opencv.so` - OpenVX&trade; OpenCV InterOp Extension <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `mv_compile` - Neural Net Model Compile <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `runvx` - OpenVX&trade; Graph Executor - Display ON | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-3?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_4` | MIOpenGEMM <br> MIOpen <br> ProtoBuf <br> +Level 3 | amd_openvx <br> amd_openvx_extensions <br> apps <br> utilities | ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libopenvx.so` - OpenVX&trade; Lib <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvxu.so` - OpenVX&trade; immediate node Lib <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvx_loomsl.so` - Loom 360 Stitch Lib <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `loom_shell` - 360 Stitch App <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvx_amd_media.so` - OpenVX&trade; Media Extension <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvx_opencv.so` - OpenVX&trade; OpenCV InterOp Extension <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `mv_compile` - Neural Net Model Compile <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `runcl` - OpenCL&trade; program debug App <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `runvx` - OpenVX&trade; Graph Executor - Display ON <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libvx_nn.so` - OpenVX&trade; Neural Net Extension <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `inference_server_app` - Cloud Inference App | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-4?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_5` | AMD_RPP <br> rocAL deps <br> +Level 4 | amd_openvx <br> amd_openvx_extensions <br> apps <br> rocAL <br> utilities | ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libopenvx.so` - OpenVX&trade; Lib <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvxu.so` - OpenVX&trade; immediate node Lib <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvx_loomsl.so` - Loom 360 Stitch Lib <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `loom_shell` - 360 Stitch App <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvx_amd_media.so` - OpenVX&trade; Media Extension <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvx_opencv.so` - OpenVX&trade; OpenCV InterOp Extension <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `mv_compile` - Neural Net Model Compile <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `runcl` - OpenCL&trade; program debug App <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `runvx` - OpenVX&trade; Graph Executor - Display ON <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `libvx_nn.so` - OpenVX&trade; Neural Net Extension <br> ![#1589F0](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/blue_square.png) `inference_server_app` - Cloud Inference App <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `libvx_rpp.so` - OpenVX&trade; RPP Extension <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `librocal.so` - Radeon Augmentation Library <br> ![#c5f015](https://raw.githubusercontent.com/GPUOpen-ProfessionalCompute-Libraries/MIVisionX/develop/docs/data/green_square.png) `rocal_pybind.so` - rocAL Pybind Lib | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-5?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | - -**NOTE:** OpenVX and the OpenVX logo are trademarks of the Khronos Group Inc. - -#### rocALUTION - -rocALUTION 2.1.9 for ROCm 5.6.0 - -##### Improved - -- Fixed synchronization issues in level 1 routines - -#### rocBLAS - -rocBLAS 3.0.0 for ROCm 5.6.0 - -##### Optimizations - -- Improved performance of Level 2 rocBLAS GEMV on gfx90a GPU for non-transposed problems having small matrices and larger batch counts. Performance enhanced for problem sizes when m and n <= 32 and batch_count >= 256. -- Improved performance of rocBLAS syr2k for single, double, and double-complex precision, and her2k for double-complex precision. Slightly improved performance for general sizes on gfx90a. - -##### Added - -- Added bf16 inputs and f32 compute support to Level 1 rocBLAS Extension functions axpy_ex, scal_ex and nrm2_ex. - -##### Deprecated - -- trmm inplace is deprecated. It will be replaced by trmm that has both inplace and out-of-place functionality -- rocblas_query_int8_layout_flag() is deprecated and will be removed in a future release -- rocblas_gemm_flags_pack_int8x4 enum is deprecated and will be removed in a future release -- rocblas_set_device_memory_size() is deprecated and will be replaced by a future function rocblas_increase_device_memory_size() -- rocblas_is_user_managing_device_memory() is deprecated and will be removed in a future release - -##### Removed - -- is_complex helper was deprecated and now removed. Use rocblas_is_complex instead. -- The enum truncate_t and the value truncate was deprecated and now removed from. It was replaced by rocblas_truncate_t and rocblas_truncate, respectively. -- rocblas_set_int8_type_for_hipblas was deprecated and is now removed. -- rocblas_get_int8_type_for_hipblas was deprecated and is now removed. - -##### Dependencies - -- build only dependency on python joblib added as used by Tensile build -- fix for cmake install on some OS when performed by install.sh -d --cmake_install - -##### Fixed - -- make trsm offset calculations 64 bit safe - -##### Changed - -- refactor rotg test code - -#### rocFFT - -rocFFT 1.0.23 for ROCm 5.6.0 - -##### Added - -- Implemented half-precision transforms, which can be requested by passing rocfft_precision_half to rocfft_plan_create. -- Implemented a hierarchical solution map which saves how to decompose a problem and the kernels to be used. -- Implemented a first version of offline-tuner to support tuning kernels for C2C/Z2Z problems. - -##### Changed - -- Replaced std::complex with hipComplex data types for data generator. -- FFT plan dimensions are now sorted to be row-major internally where possible, which produces better plans if the dimensions were accidentally specified in a different order (column-major, for example). -- Added --precision argument to benchmark/test clients. --double is still accepted but is deprecated as a method to request a double-precision transform. - -##### Fixed - -- Fixed over-allocation of LDS in some real-complex kernels, which was resulting in kernel launch failure. - -#### rocm-cmake - -rocm-cmake 0.9.0 for ROCm 5.6.0 - -##### Added - -- Added the option ROCM_HEADER_WRAPPER_WERROR - - Compile-time C macro in the wrapper headers causes errors to be emitted instead of warnings. - - Configure-time CMake option sets the default for the C macro. - -#### rocSOLVER - -rocSOLVER 3.22.0 for ROCm 5.6.0 - -##### Added - -- LU refactorization for sparse matrices - - CSRRF_ANALYSIS - - CSRRF_SUMLU - - CSRRF_SPLITLU - - CSRRF_REFACTLU -- Linear system solver for sparse matrices - - CSRRF_SOLVE -- Added type `rocsolver_rfinfo` for use with sparse matrix routines - -##### Optimized - -- Improved the performance of BDSQR and GESVD when singular vectors are requested - -##### Fixed - -- BDSQR and GESVD should no longer hang when the input contains `NaN` or `Inf` - -#### rocSPARSE - -rocSPARSE 2.5.2 for ROCm 5.6.0 - -##### Improved - -- Fixed a memory leak in csritsv -- Fixed a bug in csrsm and bsrsm - -#### rocThrust - -rocThrust 2.18.0 for ROCm 5.6.0 - -##### Fixed - -- `lower_bound`, `upper_bound`, and `binary_search` failed to compile for certain types. - -##### Changed - -- Updated `docs` directory structure to match the standard of [rocm-docs-core](https://github.com/RadeonOpenCompute/rocm-docs-core). - -#### rocWMMA - -rocWMMA 1.1.0 for ROCm 5.6.0 - -##### Added - -- Added cross-lane operation backends (Blend, Permute, Swizzle and Dpp) -- Added GPU kernels for rocWMMA unit test pre-process and post-process operations (fill, validation) -- Added performance gemm samples for half, single and double precision -- Added rocWMMA cmake versioning -- Added vectorized support in coordinate transforms -- Included ROCm smi for runtime clock rate detection -- Added fragment transforms for transpose and change data layout - -##### Changed - -- Default to GPU rocBLAS validation against rocWMMA -- Re-enabled int8 gemm tests on gfx9 -- Upgraded to C++17 -- Restructured unit test folder for consistency -- Consolidated rocWMMA samples common code - -#### Tensile - -Tensile 4.37.0 for ROCm 5.6.0 - -##### Added - -- Added user driven tuning API -- Added decision tree fallback feature -- Added SingleBuffer + AtomicAdd option for GlobalSplitU -- DirectToVgpr support for fp16 and Int8 with TN orientation -- Added new test cases for various functions -- Added SingleBuffer algorithm for ZGEMM/CGEMM -- Added joblib for parallel map calls -- Added support for MFMA + LocalSplitU + DirectToVgprA+B -- Added asmcap check for MIArchVgpr -- Added support for MFMA + LocalSplitU -- Added frequency, power, and temperature data to the output - -##### Optimizations - -- Improved the performance of GlobalSplitU with SingleBuffer algorithm -- Reduced the running time of the extended and pre_checkin tests -- Optimized the Tailloop section of the assembly kernel -- Optimized complex GEMM (fixed vgpr allocation, unified CGEMM and ZGEMM code in MulMIoutAlphaToArch) -- Improved the performance of the second kernel of MultipleBuffer algorithm - -##### Changed - -- Updated custom kernels with 64-bit offsets -- Adapted 64-bit offset arguments for assembly kernels -- Improved temporary register re-use to reduce max sgpr usage -- Removed some restrictions on VectorWidth and DirectToVgpr -- Updated the dependency requirements for Tensile -- Changed the range of AssertSummationElementMultiple -- Modified the error messages for more clarity -- Changed DivideAndReminder to vectorStaticRemainder in case quotient is not used -- Removed dummy vgpr for vectorStaticRemainder -- Removed tmpVgpr parameter from vectorStaticRemainder/Divide/DivideAndReminder -- Removed qReg parameter from vectorStaticRemainder - -##### Fixed - -- Fixed tmp sgpr allocation to avoid over-writing values (alpha) -- 64-bit offset parameters for post kernels -- Fixed gfx908 CI test failures -- Fixed offset calculation to prevent overflow for large offsets -- Fixed issues when BufferLoad and BufferStore are equal to zero -- Fixed StoreCInUnroll + DirectToVgpr + no useInitAccVgprOpt mismatch -- Fixed DirectToVgpr + LocalSplitU + FractionalLoad mismatch -- Fixed the memory access error related to StaggerU + large stride -- Fixed ZGEMM 4x4 MatrixInst mismatch -- Fixed DGEMM 4x4 MatrixInst mismatch -- Fixed ASEM + GSU + NoTailLoop opt mismatch -- Fixed AssertSummationElementMultiple + GlobalSplitU issues -- Fixed ASEM + GSU + TailLoop inner unroll - -------------------- - -## ROCm 5.5.1 - - -### What's new in this release - -#### HIP SDK for Windows - -AMD is pleased to announce the availability of the HIP SDK for Windows as part -of ROCm software. The -[HIP SDK OS and GPU support page](https://rocm.docs.amd.com/en/docs-5.5.1/release/windows_support.html) -lists the versions of Windows and GPUs validated by AMD. HIP SDK features on -Windows are described in detail in our -[What is ROCm?](https://rocm.docs.amd.com/en/docs-5.5.1/rocm.html#rocm-on-windows) -page and differs from the Linux feature set. Visit -[Quick Start](https://rocm.docs.amd.com/en/docs-5.5.1/deploy/windows/quick_start.html#) -page to get started. Known issues are tracked on -[GitHub](https://github.com/ROCm/ROCm/issues?q=is%3Aopen+label%3A5.5.1+label%3A%22Verified+Issue%22+label%3AWindows). - -#### HIP API change - -The following HIP API is updated in the ROCm 5.5.1 release: - -##### `hipDeviceSetCacheConfig` - -* The return value for `hipDeviceSetCacheConfig` is updated from `hipErrorNotSupported` to - `hipSuccess` - -### Library changes in ROCm 5.5.1 - -| Library | Version | -|---------|---------| -| AMDMIGraphX | [2.5](https://github.com/ROCm/AMDMIGraphX/releases/tag/rocm-5.5.1) | -| hipBLAS | [0.54.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-5.5.1) | -| hipBLASLt | [0.1.0](https://github.com/ROCm/hipBLASLt/releases/tag/rocm-5.5.1) | -| hipCUB | [2.13.1](https://github.com/ROCm/hipCUB/releases/tag/rocm-5.5.1) | -| hipFFT | [1.0.11](https://github.com/ROCm/hipFFT/releases/tag/rocm-5.5.1) | -| hipRAND | [2.10.16](https://github.com/ROCm/hipRAND/releases/tag/rocm-5.5.1) | -| hipSOLVER | [1.7.0](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-5.5.1) | -| hipSPARSE | [2.3.5](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-5.5.1) | -| MIOpen | [2.19.0](https://github.com/ROCm/MIOpen/releases/tag/rocm-5.5.1) | -| MIVisionX | [2.3.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-5.5.1) | -| rccl | [2.15.5](https://github.com/ROCm/rccl/releases/tag/rocm-5.5.1) | -| rocALUTION | [2.1.8](https://github.com/ROCm/rocALUTION/releases/tag/rocm-5.5.1) | -| rocBLAS | [2.47.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-5.5.1) | -| rocFFT | [1.0.22](https://github.com/ROCm/rocFFT/releases/tag/rocm-5.5.1) | -| rocm-cmake | [0.8.1](https://github.com/ROCm/rocm-cmake/releases/tag/rocm-5.5.1) | -| rocPRIM | [2.13.0](https://github.com/ROCm/rocPRIM/releases/tag/rocm-5.5.1) | -| rocRAND | [2.10.17](https://github.com/ROCm/rocRAND/releases/tag/rocm-5.5.1) | -| rocSOLVER | [3.21.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-5.5.1) | -| rocSPARSE | [2.5.1](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-5.5.1) | -| rocThrust | [2.17.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-5.5.1) | -| rocWMMA | [1.0](https://github.com/ROCm/rocWMMA/releases/tag/rocm-5.5.1) | -| Tensile | [4.36.0](https://github.com/ROCm/Tensile/releases/tag/rocm-5.5.1) | - -------------------- - -## ROCm 5.5.0 - - -### What's new in this release - -#### HIP enhancements - -The ROCm v5.5 release consists of the following HIP enhancements: - -##### Enhanced stack size limit - -In this release, the stack size limit is increased from 16k to 131056 bytes (or 128K - 16). -Applications requiring to update the stack size can use hipDeviceSetLimit API. - -##### `hipcc` changes - -The following hipcc changes are implemented in this release: - -* `hipcc` will not implicitly link to `libpthread` and `librt`, as they are no longer a link time dependence - for HIP programs.  Applications that depend on these libraries must explicitly link to them. -* `-use-staticlib` and `-use-sharedlib` options are deprecated. - -##### Future changes - -* Separation of `hipcc` binaries (Perl scripts) from HIP to `hipcc` project. Users will access separate - `hipcc` package for installing `hipcc` binaries in future ROCm releases. - -* In a future ROCm release, the following samples will be removed from the `hip-tests` project. - * `hipBusbandWidth` at - * `hipCommander` at - - Note that the samples will continue to be available in previous release branches. -* Removal of gcnarch from hipDeviceProp_t structure -* Addition of new fields in hipDeviceProp_t structure - * maxTexture1D - * maxTexture2D - * maxTexture1DLayered - * maxTexture2DLayered - * sharedMemPerMultiprocessor - * deviceOverlap - * asyncEngineCount - * surfaceAlignment - * unifiedAddressing - * computePreemptionSupported - * hostRegisterSupported - * uuid -* Removal of deprecated code - * hip-hcc codes from hip code tree -* Correct hipArray usage in HIP APIs such as hipMemcpyAtoH and hipMemcpyHtoA -* HIPMEMCPY_3D fields correction to avoid truncation of "size_t" to "unsigned int" inside hipMemcpy3D() -* Renaming of 'memoryType' in hipPointerAttribute_t structure to 'type' -* Correct hipGetLastError to return the last error instead of last API call's return code -* Update hipExternalSemaphoreHandleDesc to add "unsigned int reserved\[16]" -* Correct handling of flag values in hipIpcOpenMemHandle for hipIpcMemLazyEnablePeerAccess -* Remove hiparray* and make it opaque with hipArray_t - -##### New HIP APIs in this release - -:::{note} -This is a pre-official version (beta) release of the new APIs and may contain unresolved issues. -::: - -###### Memory management HIP APIs - -The new memory management HIP API is as follows: - -* Sets information on the specified pointer \[BETA]. - - ```cpp - hipError_t hipPointerSetAttribute(const void* value, hipPointer_attribute attribute, hipDeviceptr_t ptr); - ``` - -###### Module management HIP APIs - -The new module management HIP APIs are as follows: - -* Launches kernel $f$ with launch parameters and shared memory on stream with arguments passed - to `kernelParams`, where thread blocks can cooperate and synchronize as they run. - - ```cpp - hipError_t hipModuleLaunchCooperativeKernel(hipFunction_t f, unsigned int gridDimX, unsigned int gridDimY, unsigned int gridDimZ, unsigned int blockDimX, unsigned int blockDimY, unsigned int blockDimZ, unsigned int sharedMemBytes, hipStream_t stream, void** kernelParams); - ``` - -* Launches kernels on multiple devices where thread blocks can cooperate and synchronize as they - run. - - ```cpp - hipError_t hipModuleLaunchCooperativeKernelMultiDevice(hipFunctionLaunchParams* launchParamsList, unsigned int numDevices, unsigned int flags); - ``` - -###### HIP graph management APIs - -The new HIP graph management APIs are as follows: - -* Creates a memory allocation node and adds it to a graph \[BETA] - - ```cpp - hipError_t hipGraphAddMemAllocNode(hipGraphNode_t* pGraphNode, hipGraph_t graph, const hipGraphNode_t* pDependencies, size_t numDependencies, hipMemAllocNodeParams* pNodeParams); - ``` - -* Return parameters for memory allocation node \[BETA] - - ```cpp - hipError_t hipGraphMemAllocNodeGetParams(hipGraphNode_t node, hipMemAllocNodeParams* pNodeParams); - ``` - -* Creates a memory free node and adds it to a graph \[BETA] - - ```cpp - hipError_t hipGraphAddMemFreeNode(hipGraphNode_t* pGraphNode, hipGraph_t graph, const hipGraphNode_t* pDependencies, size_t numDependencies, void* dev_ptr); - ``` - -* Returns parameters for memory free node \[BETA]. - - ```cpp - hipError_t hipGraphMemFreeNodeGetParams(hipGraphNode_t node, void* dev_ptr); - ``` - -* Write a DOT file describing graph structure \[BETA]. - - ```cpp - hipError_t hipGraphDebugDotPrint(hipGraph_t graph, const char* path, unsigned int flags); - ``` - -* Copies attributes from source node to destination node \[BETA]. - - ```cpp - hipError_t hipGraphKernelNodeCopyAttributes(hipGraphNode_t hSrc, hipGraphNode_t hDst); - ``` - -* Enables or disables the specified node in the given graphExec \[BETA] - - ```cpp - hipError_t hipGraphNodeSetEnabled(hipGraphExec_t hGraphExec, hipGraphNode_t hNode, unsigned int isEnabled); - ``` - -* Query whether a node in the given graphExec is enabled \[BETA] - - ```cpp - hipError_t hipGraphNodeGetEnabled(hipGraphExec_t hGraphExec, hipGraphNode_t hNode, unsigned int* isEnabled); - ``` - -##### OpenMP enhancements - -This release consists of the following OpenMP enhancements: - -* Additional support for OMPT functions `get_device_time` and `get_record_type` -* Added support for min/max fast fp atomics on AMD GPUs -* Fixed the use of the abs function in C device regions - -### Deprecations and warnings - -#### HIP deprecation - -The `hipcc` and `hipconfig` Perl scripts are deprecated. In a future release, compiled binaries will be -available as `hipcc.bin` and `hipconfig.bin` as replacements for the Perl scripts. - -:::{note} -There will be a transition period where the Perl scripts and compiled binaries are available before the -scripts are removed. There will be no functional difference between the Perl scripts and their compiled -binary counterpart. No user action is required. Once these are available, users can optionally switch to -`hipcc.bin` and `hipconfig.bin`. The `hipcc`/`hipconfig` soft link will be assimilated to point from -`hipcc`/`hipconfig` to the respective compiled binaries as the default option. -::: - -##### Linux file system hierarchy standard for ROCm - -ROCm packages have adopted the Linux foundation file system hierarchy standard in this release to ensure ROCm components follow open source conventions for Linux-based distributions. While moving to a new file system hierarchy, ROCm ensures backward compatibility with its 5.1 version or older file system hierarchy. See below for a detailed explanation of the new file system hierarchy and backward compatibility. - -##### New file system hierarchy - -The following is the new file system hierarchy:4 - -```text -/opt/rocm- - | --bin - | --All externally exposed Binaries - | --libexec - | -- - | -- Component specific private non-ISA executables (architecture independent) - | --include - | -- - | --
- | --lib - | --lib.so -> lib.so.major -> lib.so.major.minor.patch - (public libraries linked with application) - | -- (component specific private library, executable data) - | -- - | --components - | --.config.cmake - | --share - | --html//*.html - | --info//*.[pdf, md, txt] - | --man - | --doc - | -- - | -- - | -- - | -- (arch independent non-executable) - | --samples - -``` - -:::{note} -ROCm will not support backward compatibility with the v5.1(old) file system hierarchy in its next major -release. -::: - -For more information, refer to . - -##### Backward compatibility with older file systems - -ROCm has moved header files and libraries to its new location as indicated in the above structure and -included symbolic-link and wrapper header files in its old location for backward compatibility. - -:::{note} -ROCm will continue supporting backward compatibility until the next major release. -::: -##### Wrapper header files - -Wrapper header files are placed in the old location (`/opt/rocm-xxx//include`) with a -warning message to include files from the new location (`/opt/rocm-xxx/include`) as shown in the -example below: - -```cpp -// Code snippet from hip_runtime.h -#pragma message “This file is deprecated. Use file from include path /opt/rocm-ver/include/ and prefix with hip”. -#include "hip/hip_runtime.h" -``` - -The wrapper header files’ backward compatibility deprecation is as follows: - -* `#pragma` message announcing deprecation -- ROCm v5.2 release -* `#pragma` message changed to `#warning` -- Future release -* `#warning` changed to `#error` -- Future release -* Backward compatibility wrappers removed -- Future release - -##### Library files - -Library files are available in the `/opt/rocm-xxx/lib` folder. For backward compatibility, the old library -location (`/opt/rocm-xxx//lib`) has a soft link to the library at the new location. - -Example: - -```bash -$ ls -l /opt/rocm/hip/lib/ -total 4 -drwxr-xr-x 4 root root 4096 May 12 10:45 cmake -lrwxrwxrwx 1 root root 24 May 10 23:32 libamdhip64.so -> ../../lib/libamdhip64.so -``` - -##### CMake config files - -All CMake configuration files are available in the `/opt/rocm-xxx/lib/cmake/` folder. -For backward compatibility, the old CMake locations (`/opt/rocm-xxx//lib/cmake`) -consist of a soft link to the new CMake config. - -Example: - -```bash -$ ls -l /opt/rocm/hip/lib/cmake/hip/ -total 0 -lrwxrwxrwx 1 root root 42 May 10 23:32 hip-config.cmake -> ../../../../lib/cmake/hip/hip-config.cmake -``` - -#### ROCm support for Code Object V3 deprecated - -Support for Code Object v3 is deprecated and will be removed in a future release. - -#### Comgr V3.0 changes - -The following APIs and macros have been marked as deprecated. These are expected to be removed in -a future ROCm release and coincides with the release of Comgr v3.0. - -##### API changes - -* `amd_comgr_action_info_set_options()` -* `amd_comgr_action_info_get_options()` - -##### Actions and data types - -* `AMD_COMGR_ACTION_ADD_DEVICE_LIBRARIES` -* `AMD_COMGR_ACTION_COMPILE_SOURCE_TO_FATBIN` - -For replacements, see the `AMD_COMGR_ACTION_INFO_GET`/`SET_OPTION_LIST APIs`, and the -`AMD_COMGR_ACTION_COMPILE_SOURCE_(WITH_DEVICE_LIBS)_TO_BC` macros. - -#### Deprecated environment variables - -The following environment variables are removed in this ROCm release: - -* `GPU_MAX_COMMAND_QUEUES` -* `GPU_MAX_WORKGROUP_SIZE_2D_X` -* `GPU_MAX_WORKGROUP_SIZE_2D_Y` -* `GPU_MAX_WORKGROUP_SIZE_3D_X` -* `GPU_MAX_WORKGROUP_SIZE_3D_Y` -* `GPU_MAX_WORKGROUP_SIZE_3D_Z` -* `GPU_BLIT_ENGINE_TYPE` -* `GPU_USE_SYNC_OBJECTS` -* `AMD_OCL_SC_LIB` -* `AMD_OCL_ENABLE_MESSAGE_BOX` -* `GPU_FORCE_64BIT_PTR` -* `GPU_FORCE_OCL20_32BIT` -* `GPU_RAW_TIMESTAMP` -* `GPU_SELECT_COMPUTE_RINGS_ID` -* `GPU_USE_SINGLE_SCRATCH` -* `GPU_ENABLE_LARGE_ALLOCATION` -* `HSA_LOCAL_MEMORY_ENABLE` -* `HSA_ENABLE_COARSE_GRAIN_SVM` -* `GPU_IFH_MODE` -* `OCL_SYSMEM_REQUIREMENT` -* `OCL_CODE_CACHE_ENABLE` -* `OCL_CODE_CACHE_RESET` - -### Known issues in this release - -The following are the known issues in this release. - -#### `DISTRIBUTED`/`TEST_DISTRIBUTED_SPAWN` fails - -When user applications call `ncclCommAbort` to destruct communicators and then create new -communicators repeatedly, subsequent communicators may fail to initialize. - -This issue is under investigation and will be resolved in a future release. - -### Library changes in ROCm 5.5.0 - -| Library | Version | -|---------|---------| -| AMDMIGraphX | [2.5](https://github.com/ROCm/AMDMIGraphX/releases/tag/rocm-5.5.0) | -| hipBLAS | 0.53.0 ⇒ [0.54.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-5.5.0) | -| hipBLASLt | [0.1.0](https://github.com/ROCm/hipBLASLt/releases/tag/rocm-5.5.0) | -| hipCUB | 2.13.0 ⇒ [2.13.1](https://github.com/ROCm/hipCUB/releases/tag/rocm-5.5.0) | -| hipFFT | 1.0.10 ⇒ [1.0.11](https://github.com/ROCm/hipFFT/releases/tag/rocm-5.5.0) | -| hipRAND | [2.10.16](https://github.com/ROCm/hipRAND/releases/tag/rocm-5.5.0) | -| hipSOLVER | 1.6.0 ⇒ [1.7.0](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-5.5.0) | -| hipSPARSE | 2.3.3 ⇒ [2.3.5](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-5.5.0) | -| MIOpen | [2.19.0](https://github.com/ROCm/MIOpen/releases/tag/rocm-5.5.0) | -| MIVisionX | [2.3.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-5.5.0) | -| rccl | 2.13.4 ⇒ [2.15.5](https://github.com/ROCm/rccl/releases/tag/rocm-5.5.0) | -| rocALUTION | 2.1.3 ⇒ [2.1.8](https://github.com/ROCm/rocALUTION/releases/tag/rocm-5.5.0) | -| rocBLAS | 2.46.0 ⇒ [2.47.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-5.5.0) | -| rocFFT | 1.0.21 ⇒ [1.0.22](https://github.com/ROCm/rocFFT/releases/tag/rocm-5.5.0) | -| rocm-cmake | 0.8.0 ⇒ [0.8.1](https://github.com/ROCm/rocm-cmake/releases/tag/rocm-5.5.0) | -| rocPRIM | 2.12.0 ⇒ [2.13.0](https://github.com/ROCm/rocPRIM/releases/tag/rocm-5.5.0) | -| rocRAND | 2.10.16 ⇒ [2.10.17](https://github.com/ROCm/rocRAND/releases/tag/rocm-5.5.0) | -| rocSOLVER | 3.20.0 ⇒ [3.21.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-5.5.0) | -| rocSPARSE | 2.4.0 ⇒ [2.5.1](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-5.5.0) | -| rocThrust | [2.17.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-5.5.0) | -| rocWMMA | 0.9 ⇒ [1.0](https://github.com/ROCm/rocWMMA/releases/tag/rocm-5.5.0) | -| Tensile | 4.35.0 ⇒ [4.36.0](https://github.com/ROCm/Tensile/releases/tag/rocm-5.5.0) | - -#### AMDMIGraphX - -MIGraphX 2.5 for ROCm 5.5.0 - -##### Added - -- Y-Model feature to store tuning information with the optimized model -- Added Python 3.10 bindings -- Accuracy checker tool based on ONNX Runtime -- ONNX Operators parse_split, and Trilu -- Build support for ROCm MLIR -- Added migraphx-driver flag to print optimizations in python (--python) -- Added JIT implementation of the Gather and Pad operator which results in better handling of larger tensor sizes. - -##### Optimizations - -- Improved performance of Transformer based models -- Improved performance of the Pad, Concat, Gather, and Pointwise operators -- Improved onnx/pb file loading speed -- Added general optimize pass which runs several passes such as simplify_reshapes/algebra and DCE in loop. - -##### Fixed - -- Improved parsing Tensorflow Protobuf files -- Resolved various accuracy issues with some onnx models -- Resolved a gcc-12 issue with mivisionx -- Improved support for larger sized models and batches -- Use --offload-arch instead of --cuda-gpu-arch for the HIP compiler -- Changes inside JIT to use float accumulator for large reduce ops of half type to avoid overflow. -- Changes inside JIT to temporarily use cosine to compute sine function. - -##### Changed - -- Changed version/location of 3rd party build dependencies to pick up fixes - -#### hipBLAS - -hipBLAS 0.54.0 for ROCm 5.5.0 - -##### Added - -- added option to opt-in to use __half for hipblasHalf type in the API for c++ users who define HIPBLAS_USE_HIP_HALF -- added scripts to plot performance for multiple functions -- data driven hipblas-bench and hipblas-test execution via external yaml format data files -- client smoke test added for quick validation using command hipblas-test --yaml hipblas_smoke.yaml - -##### Fixed - -- fixed datatype conversion functions to support more rocBLAS/cuBLAS datatypes -- fixed geqrf to return successfully when nullptrs are passed in with n == 0 || m == 0 -- fixed getrs to return successfully when given nullptrs with corresponding size = 0 -- fixed getrs to give info = -1 when transpose is not an expected type -- fixed gels to return successfully when given nullptrs with corresponding size = 0 -- fixed gels to give info = -1 when transpose is not in ('N', 'T') for real cases or not in ('N', 'C') for complex cases - -##### Changed - -- changed reference code for Windows to OpenBLAS -- hipblas client executables all now begin with hipblas- prefix - -#### hipBLASLt - -hipBLASLt 0.1.0 for ROCm 5.5.0 - -##### Added - -- Enable hipBLASLt APIs -- Support gfx90a -- Support problem type: fp32, fp16, bf16 -- Support activation: relu, gelu -- Support bias vector -- Support Scale D vector -- Integreate with tensilelite kernel generator -- Add Gtest: hipblaslt-test -- Add full function tool: hipblaslt-bench -- Add sample app: example_hipblaslt_preference - -##### Optimizations - -- Gridbase solution search algorithm for untuned size -- Tune 10k sizes for each problem type - -#### hipCUB - -hipCUB 2.13.1 for ROCm 5.5.0 - -##### Added - -- Benchmarks for `BlockShuffle`, `BlockLoad`, and `BlockStore`. - -##### Changed - -- CUB backend references CUB and Thrust version 1.17.2. -- Improved benchmark coverage of `BlockScan` by adding `ExclusiveScan`, benchmark coverage of `BlockRadixSort` by adding `SortBlockedToStriped`, and benchmark coverage of `WarpScan` by adding `Broadcast`. - -##### Fixed - -- Windows HIP SDK support - -##### Known Issues - -- `BlockRadixRankMatch` is currently broken under the rocPRIM backend. -- `BlockRadixRankMatch` with a warp size that does not exactly divide the block size is broken under the CUB backend. - -#### hipFFT - -hipFFT 1.0.11 for ROCm 5.5.0 - -##### Fixed - -- Fixed old version rocm include/lib folders not removed on upgrade. - -#### hipRAND - -hipRAND 2.10.16 for ROCm 5.5.0 - -##### Added - -- rocRAND backend support for Sobol 64, Scrambled Sobol 32 and 64, and MT19937. -- `hiprandGenerateLongLong` for generating 64-bits uniformly distributed integers with Sobol 64 and Scrambled Sobol 64. - -##### Changed - -- Python 2.7 is no longer officially supported. - -#### hipSOLVER - -hipSOLVER 1.7.0 for ROCm 5.5.0 - -##### Added - -- Added functions - - gesvdj - - hipsolverSgesvdj_bufferSize, hipsolverDgesvdj_bufferSize, hipsolverCgesvdj_bufferSize, hipsolverZgesvdj_bufferSize - - hipsolverSgesvdj, hipsolverDgesvdj, hipsolverCgesvdj, hipsolverZgesvdj - - gesvdjBatched - - hipsolverSgesvdjBatched_bufferSize, hipsolverDgesvdjBatched_bufferSize, hipsolverCgesvdjBatched_bufferSize, hipsolverZgesvdjBatched_bufferSize - - hipsolverSgesvdjBatched, hipsolverDgesvdjBatched, hipsolverCgesvdjBatched, hipsolverZgesvdjBatched - -#### hipSPARSE - -hipSPARSE 2.3.5 for ROCm 5.5.0 - -##### Improved - -- Fixed an issue, where the rocm folder was not removed on upgrade of meta packages -- Fixed a compilation issue with cusparse backend -- Added more detailed messages on unit test failures due to missing input data -- Improved documentation -- Fixed a bug with deprecation messages when using gcc9 (Thanks @Maetveis) - -#### MIOpen - -MIOpen 2.19.0 for ROCm 5.5.0 - -##### Added - -- ROCm 5.5 support for gfx1101 (Navi32) - -##### Changed - -- Tuning results for MLIR on ROCm 5.5 -- Bumping MLIR commit to 5.5.0 release tag - -##### Fixed - -- Fix 3d convolution Host API bug -- [HOTFIX][MI200][FP16] Disabled ConvHipImplicitGemmBwdXdlops when FP16_ALT is required. - -#### rccl - -RCCL 2.15.5 for ROCm 5.5.0 - -##### Changed - -- Compatibility with NCCL 2.15.5 -- Unit test executable renamed to rccl-UnitTests - -##### Added - -- HW-topology aware binary tree implementation -- Experimental support for MSCCL -- New unit tests for hipGraph support -- NPKit integration - -##### Fixed - -- rocm-smi ID conversion -- Support for HIP_VISIBLE_DEVICES for unit tests -- Support for p2p transfers to non (HIP) visible devices - -##### Removed - -- Removed TransferBench from tools. Exists in standalone repo: https://github.com/ROCmSoftwarePlatform/TransferBench - -#### rocALUTION - -rocALUTION 2.1.8 for ROCm 5.5.0 - -##### Added - -- Added build support for Navi32 - -##### Improved - -- Fixed a typo in MPI backend -- Fixed a bug with the backend when HIP support is disabled -- Fixed a bug in SAAMG hierarchy building on HIP backend -- Improved SAAMG hierarchy build performance on HIP backend - -##### Changed - -- LocalVector::GetIndexValues(ValueType\*) is deprecated, use LocalVector::GetIndexValues(const LocalVector&, LocalVector\*) instead -- LocalVector::SetIndexValues(const ValueType\*) is deprecated, use LocalVector::SetIndexValues(const LocalVector&, const LocalVector&) instead -- LocalMatrix::RSDirectInterpolation(const LocalVector&, const LocalVector&, LocalMatrix\*, LocalMatrix\*) is deprecated, use LocalMatrix::RSDirectInterpolation(const LocalVector&, const LocalVector&, LocalMatrix\*) instead -- LocalMatrix::RSExtPIInterpolation(const LocalVector&, const LocalVector&, bool, float, LocalMatrix\*, LocalMatrix\*) is deprecated, use LocalMatrix::RSExtPIInterpolation(const LocalVector&, const LocalVector&, bool, LocalMatrix\*) instead -- LocalMatrix::RugeStueben() is deprecated -- LocalMatrix::AMGSmoothedAggregation(ValueType, const LocalVector&, const LocalVector&, LocalMatrix\*, LocalMatrix\*, int) is deprecated, use LocalMatrix::AMGAggregation(ValueType, const LocalVector&, const LocalVector&, LocalMatrix\*, int) instead -- LocalMatrix::AMGAggregation(const LocalVector&, LocalMatrix\*, LocalMatrix\*) is deprecated, use LocalMatrix::AMGAggregation(const LocalVector&, LocalMatrix\*) instead - -#### rocBLAS - -rocBLAS 2.47.0 for ROCm 5.5.0 - -##### Added - -- added functionality rocblas_geam_ex for matrix-matrix minimum operations -- added HIP Graph support as beta feature for rocBLAS Level 1, Level 2, and Level 3(pointer mode host) functions -- added beta features API. Exposed using compiler define ROCBLAS_BETA_FEATURES_API -- added support for vector initialization in the rocBLAS test framework with negative increments -- added windows build documentation for forthcoming support using ROCm HIP SDK -- added scripts to plot performance for multiple functions - -##### Optimizations - -- improved performance of Level 2 rocBLAS GEMV for float and double precision. Performance enhanced by 150-200% for certain problem sizes when (m==n) measured on a gfx90a GPU. -- improved performance of Level 2 rocBLAS GER for float, double and complex float precisions. Performance enhanced by 5-7% for certain problem sizes measured on a gfx90a GPU. -- improved performance of Level 2 rocBLAS SYMV for float and double precisions. Performance enhanced by 120-150% for certain problem sizes measured on both gfx908 and gfx90a GPUs. - -##### Fixed - -- fixed setting of executable mode on client script rocblas_gentest.py to avoid potential permission errors with clients rocblas-test and rocblas-bench -- fixed deprecated API compatibility with Visual Studio compiler -- fixed test framework memory exception handling for Level 2 functions when the host memory allocation exceeds the available memory - -##### Changed - -- install.sh internally runs rmake.py (also used on windows) and rmake.py may be used directly by developers on linux (use --help) -- rocblas client executables all now begin with rocblas- prefix - -##### Removed - -- install.sh removed options -o --cov as now Tensile will use the default COV format, set by cmake define Tensile_CODE_OBJECT_VERSION=default - -#### rocFFT - -rocFFT 1.0.22 for ROCm 5.5.0 - -##### Optimizations - -- Improved performance of 1D lengths < 2048 that use Bluestein's algorithm. -- Reduced time for generating code during plan creation. -- Optimized 3D R2C/C2R lengths 32, 84, 128. -- Optimized batched small 1D R2C/C2R cases. - -##### Added - -- Added gfx1101 to default AMDGPU_TARGETS. - -##### Changed - -- Moved client programs to C++17. -- Moved planar kernels and infrequently used Stockham kernels to be runtime-compiled. -- Moved transpose, real-complex, Bluestein, and Stockham kernels to library kernel cache. - -##### Fixed - -- Removed zero-length twiddle table allocations, which fixes errors from hipMallocManaged. -- Fixed incorrect freeing of HIP stream handles during twiddle computation when multiple devices are present. - -#### rocm-cmake - -rocm-cmake 0.8.1 for ROCm 5.5.0 - -##### Fixed - -- ROCMInstallTargets: Added compatibility symlinks for included cmake files in `<ROCM>/lib/cmake/<PACKAGE>`. - -##### Changed - -- ROCMHeaderWrapper: The wrapper header deprecation message is now a deprecation warning. - -#### rocPRIM - -rocPRIM 2.13.0 for ROCm 5.5.0 - -##### Added - -- New block level `radix_rank` primitive. -- New block level `radix_rank_match` primitive. - -##### Changed - -- Improved the performance of `block_radix_sort` and `device_radix_sort`. - -##### Known Issues - -- Disabled GPU error messages relating to incorrect warp operation usage with Navi GPUs on Windows, due to GPU printf performance issues on Windows. - -##### Fixed - -- Fixed benchmark build on Windows - -#### rocRAND - -rocRAND 2.10.17 for ROCm 5.5.0 - -##### Added - -- MT19937 pseudo random number generator based on M. Matsumoto and T. Nishimura, 1998, Mersenne Twister: A 623-dimensionally equidistributed uniform pseudorandom number generator. -- New benchmark for the device API using Google Benchmark, `benchmark_rocrand_device_api`, replacing `benchmark_rocrand_kernel`. `benchmark_rocrand_kernel` is deprecated and will be removed in a future version. Likewise, `benchmark_curand_host_api` is added to replace `benchmark_curand_generate` and `benchmark_curand_device_api` is added to replace `benchmark_curand_kernel`. -- experimental HIP-CPU feature -- ThreeFry pseudorandom number generator based on Salmon et al., 2011, "Parallel random numbers: as easy as 1, 2, 3". - -##### Changed - -- Python 2.7 is no longer officially supported. - -##### Fixed - -- Windows HIP SDK support - -#### rocSOLVER - -rocSOLVER 3.21.0 for ROCm 5.5.0 - -##### Added - -- SVD for general matrices using Jacobi algorithm: - - GESVDJ (with batched and strided\_batched versions) -- LU factorization without pivoting for block tridiagonal matrices: - - GEBLTTRF_NPVT (with batched and strided\_batched versions) -- Linear system solver without pivoting for block tridiagonal matrices: - - GEBLTTRS_NPVT (with batched and strided\_batched, versions) -- Product of triangular matrices - - LAUUM -- Added experimental hipGraph support for rocSOLVER functions - -##### Optimized - -- Improved the performance of SYEVJ/HEEVJ. - -##### Changed - -- STEDC, SYEVD/HEEVD and SYGVD/HEGVD now use fully implemented Divide and Conquer approach. - -##### Fixed - -- SYEVJ/HEEVJ should now be invariant under matrix scaling. -- SYEVJ/HEEVJ should now properly output the eigenvalues when no sweeps are executed. -- Fixed GETF2\_NPVT and GETRF\_NPVT input data initialization in tests and benchmarks. -- Fixed rocblas missing from the dependency list of the rocsolver deb and rpm packages. - -#### rocSPARSE - -rocSPARSE 2.5.1 for ROCm 5.5.0 - -##### Added - -- Added bsrgemm and spgemm for BSR format -- Added bsrgeam -- Added build support for Navi32 -- Added experimental hipGraph support for some rocSPARSE routines -- Added csritsv, spitsv csr iterative triangular solve -- Added mixed precisions for SpMV -- Added batched SpMM for transpose A in COO format with atomic atomic algorithm - -##### Improved - -- Optimization to csr2bsr -- Optimization to csr2csr_compress -- Optimization to csr2coo -- Optimization to gebsr2csr -- Optimization to csr2gebsr -- Fixes to documentation -- Fixes a bug in COO SpMV gridsize -- Fixes a bug in SpMM gridsize when using very large matrices - -##### Known Issues - -- In csritlu0, the algorithm rocsparse_itilu0_alg_sync_split_fusion has some accuracy issues to investigate with XNACK enabled. The fallback is rocsparse_itilu0_alg_sync_split. - -#### rocWMMA - -rocWMMA 1.0 for ROCm 5.5.0 - -##### Added - -- Added support for wave32 on gfx11+ -- Added infrastructure changes to support hipRTC -- Added performance tracking system - -##### Changed - -- Modified the assignment of hardware information -- Modified the data access for unsigned datatypes -- Added library config to support multiple architectures - -#### Tensile - -Tensile 4.36.0 for ROCm 5.5.0 - -##### Added - -- Add functions for user-driven tuning -- Add GFX11 support: HostLibraryTests yamls, rearragne FP32(C)/FP64(C) instruction order, archCaps for instruction renaming condition, adjust vgpr bank for A/B/C for optimize, separate vscnt and vmcnt, dual mac -- Add binary search for Grid-Based algorithm -- Add reject condition for (StoreCInUnroll + BufferStore=0) and (DirectToVgpr + ScheduleIterAlg<3 + PrefetchGlobalRead==2) -- Add support for (DirectToLds + hgemm + NN/NT/TT) and (DirectToLds + hgemm + GlobalLoadVectorWidth < 4) -- Add support for (DirectToLds + hgemm(TLU=True only) or sgemm + NumLoadsCoalesced > 1) -- Add GSU SingleBuffer algorithm for HSS/BSS -- Add gfx900:xnack-, gfx1032, gfx1034, gfx1035 -- Enable gfx1031 support - -##### Optimizations - -- Use AssertSizeLessThan for BufferStoreOffsetLimitCheck if it is smaller than MT1 -- Improve InitAccVgprOpt - -##### Changed - -- Use global_atomic for GSU instead of flat and global_store for debug code -- Replace flat_load/store with global_load/store -- Use global_load/store for BufferLoad/Store=0 and enable scheduling -- LocalSplitU support for HGEMM+HPA when MFMA disabled -- Update Code Object Version -- Type cast local memory to COMPUTE_DATA_TYPE in LDS to avoid precision loss -- Update asm cap cache arguments -- Unify SplitGlobalRead into ThreadSeparateGlobalRead and remove SplitGlobalRead -- Change checks, error messages, assembly syntax, and coverage for DirectToLds -- Remove unused cmake file -- Clean up the LLVM dependency code -- Update ThreadSeparateGlobalRead test cases for PrefetchGlobalRead=2 -- Update sgemm/hgemm test cases for DirectToLds and ThreadSepareteGlobalRead - -##### Fixed - -- Add build-id to header of compiled source kernels -- Fix solution index collisions -- Fix h beta vectorwidth4 correctness issue for WMMA -- Fix an error with BufferStore=0 -- Fix mismatch issue with (StoreCInUnroll + PrefetchGlobalRead=2) -- Fix MoveMIoutToArch bug -- Fix flat load correctness issue on I8 and flat store correctness issue -- Fix mismatch issue with BufferLoad=0 + TailLoop for large array sizes -- Fix code generation error with BufferStore=0 and StoreCInUnrollPostLoop -- Fix issues with DirectToVgpr + ScheduleIterAlg<3 -- Fix mismatch issue with DGEMM TT + LocalReadVectorWidth=2 -- Fix mismatch issue with PrefetchGlobalRead=2 -- Fix mismatch issue with DirectToVgpr + PrefetchGlobalRead=2 + small tile size -- Fix an error with PersistentKernel=0 + PrefetchAcrossPersistent=1 + PrefetchAcrossPersistentMode=1 -- Fix mismatch issue with DirectToVgpr + DirectToLds + only 1 iteration in unroll loop case -- Remove duplicate GSU kernels: for GSU = 1, GSUAlgorithm SingleBuffer and MultipleBuffer kernels are identical -- Fix for failing CI tests due to CpuThreads=0 -- Fix mismatch issue with DirectToLds + PrefetchGlobalRead=2 -- Remove the reject condition for ThreadSeparateGlobalRead and DirectToLds (HGEMM, SGEMM only) -- Modify reject condition for minimum lanes of ThreadSeparateGlobalRead (SGEMM or larger data type only) - -------------------- - -## ROCm 5.4.3 - -### Deprecations and warnings - -#### HIP Perl scripts deprecation - -The `hipcc` and `hipconfig` Perl scripts are deprecated. In a future release, compiled binaries will be -available as `hipcc.bin` and `hipconfig.bin` as replacements for the Perl scripts. - -:::{note} -There will be a transition period where the Perl scripts and compiled binaries are available before the -scripts are removed. There will be no functional difference between the Perl scripts and their compiled -binary counterpart. No user action is required. Once these are available, users can optionally switch to -`hipcc.bin` and `hipconfig.bin`. The `hipcc`/`hipconfig` soft link will be assimilated to point from -`hipcc`/`hipconfig` to the respective compiled binaries as the default option. -::: - -##### Linux file system hierarchy standard for ROCm - -ROCm packages have adopted the Linux foundation file system hierarchy standard in this release to -ensure ROCm components follow open source conventions for Linux-based distributions. While -moving to a new file system hierarchy, ROCm ensures backward compatibility with its 5.1 version or -older file system hierarchy. See below for a detailed explanation of the new file system hierarchy and -backward compatibility. - -##### New file system hierarchy - -The following is the new file system hierarchy:4 - -```text -/opt/rocm- - | --bin - | --All externally exposed Binaries - | --libexec - | -- - | -- Component specific private non-ISA executables (architecture independent) - | --include - | -- - | --
- | --lib - | --lib.so -> lib.so.major -> lib.so.major.minor.patch - (public libraries linked with application) - | -- (component specific private library, executable data) - | -- - | --components - | --.config.cmake - | --share - | --html//*.html - | --info//*.[pdf, md, txt] - | --man - | --doc - | -- - | -- - | -- - | -- (arch independent non-executable) - | --samples - -``` - -:::{note} -ROCm will not support backward compatibility with the v5.1(old) file system hierarchy in its next major -release. -::: - -For more information, refer to . - -##### Backward compatibility with older file systems - -ROCm has moved header files and libraries to its new location as indicated in the above structure and -included symbolic-link and wrapper header files in its old location for backward compatibility. - -:::{note} -ROCm will continue supporting backward compatibility until the next major release. -::: - -##### Wrapper header files - -Wrapper header files are placed in the old location (`/opt/rocm-xxx//include`) with a -warning message to include files from the new location (`/opt/rocm-xxx/include`) as shown in the -example below: - -```cpp -// Code snippet from hip_runtime.h -#pragma message “This file is deprecated. Use file from include path /opt/rocm-ver/include/ and prefix with hip”. -#include "hip/hip_runtime.h" -``` - -The wrapper header files’ backward compatibility deprecation is as follows: - -* `#pragma` message announcing deprecation -- ROCm v5.2 release -* `#pragma` message changed to `#warning` -- Future release -* `#warning` changed to `#error` -- Future release -* Backward compatibility wrappers removed -- Future release - -##### Library files - -Library files are available in the `/opt/rocm-xxx/lib` folder. For backward compatibility, the old library -location (`/opt/rocm-xxx//lib`) has a soft link to the library at the new location. - -Example: - -```bash -$ ls -l /opt/rocm/hip/lib/ -total 4 -drwxr-xr-x 4 root root 4096 May 12 10:45 cmake -lrwxrwxrwx 1 root root 24 May 10 23:32 libamdhip64.so -> ../../lib/libamdhip64.so -``` - -##### CMake config files - -All CMake configuration files are available in the `/opt/rocm-xxx/lib/cmake/` folder. For -backward compatibility, the old CMake locations (`/opt/rocm-xxx//lib/cmake`) consist of -a soft link to the new CMake config. - -Example: - -```bash -$ ls -l /opt/rocm/hip/lib/cmake/hip/ -total 0 -lrwxrwxrwx 1 root root 42 May 10 23:32 hip-config.cmake -> ../../../../lib/cmake/hip/hip-config.cmake -``` - -### Defect fixes - -#### Compiler improvements - -In ROCm v5.4.3, improvements to the compiler address errors with the following signatures: - -* "error: unhandled SGPR spill to memory" -* "cannot scavenge register without an emergency spill slot!" -* "error: ran out of registers during register allocation" - -### Known issues - -#### Compiler option error at runtime - -Some users may encounter a “Cannot find Symbol” error at runtime when using `-save-temps`. While -most `-save-temps` use cases work correctly, this error may appear occasionally. - -This issue is under investigation, and the known workaround is not to use `-save-temps` when the error -appears. - -### Library changes in ROCm 5.4.3 - -| Library | Version | -|---------|---------| -| hipBLAS | [0.53.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-5.4.3) | -| hipCUB | [2.13.0](https://github.com/ROCm/hipCUB/releases/tag/rocm-5.4.3) | -| hipFFT | [1.0.10](https://github.com/ROCm/hipFFT/releases/tag/rocm-5.4.3) | -| hipSOLVER | [1.6.0](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-5.4.3) | -| hipSPARSE | [2.3.3](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-5.4.3) | -| MIVisionX | [2.3.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-5.4.3) | -| rccl | [2.13.4](https://github.com/ROCm/rccl/releases/tag/rocm-5.4.3) | -| rocALUTION | [2.1.3](https://github.com/ROCm/rocALUTION/releases/tag/rocm-5.4.3) | -| rocBLAS | [2.46.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-5.4.3) | -| rocFFT | 1.0.20 ⇒ [1.0.21](https://github.com/ROCm/rocFFT/releases/tag/rocm-5.4.3) | -| rocm-cmake | [0.8.0](https://github.com/ROCm/rocm-cmake/releases/tag/rocm-5.4.3) | -| rocPRIM | [2.12.0](https://github.com/ROCm/rocPRIM/releases/tag/rocm-5.4.3) | -| rocRAND | [2.10.16](https://github.com/ROCm/rocRAND/releases/tag/rocm-5.4.3) | -| rocSOLVER | [3.20.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-5.4.3) | -| rocSPARSE | [2.4.0](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-5.4.3) | -| rocThrust | [2.17.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-5.4.3) | -| rocWMMA | [0.9](https://github.com/ROCm/rocWMMA/releases/tag/rocm-5.4.3) | -| Tensile | [4.35.0](https://github.com/ROCm/Tensile/releases/tag/rocm-5.4.3) | - -#### rocFFT - -rocFFT 1.0.21 for ROCm 5.4.3 - -##### Fixed - -- Removed source directory from rocm_install_targets call to prevent installation of rocfft.h in an unintended location. - -------------------- - -## ROCm 5.4.2 - -### Deprecations and warnings - -#### HIP Perl scripts deprecation - -The `hipcc` and `hipconfig` Perl scripts are deprecated. In a future release, compiled binaries will be -available as `hipcc.bin` and `hipconfig.bin` as replacements for the Perl scripts. - -:::{note} -There will be a transition period where the Perl scripts and compiled binaries are available before the -scripts are removed. There will be no functional difference between the Perl scripts and their compiled -binary counterpart. No user action is required. Once these are available, users can optionally switch to -`hipcc.bin` and `hipconfig.bin`. The `hipcc`/`hipconfig` soft link will be assimilated to point from -`hipcc`/`hipconfig` to the respective compiled binaries as the default option. -::: - -#### `hipcc` options deprecation - -The following hipcc options are being deprecated and will be removed in a future release: - -* The `--amdgpu-target` option is being deprecated, and user must use the `–offload-arch` option to - specify the GPU architecture. -* The `--amdhsa-code-object-version` option is being deprecated. Users can use the Clang/LLVM - option `-mllvm -mcode-object-version` to debug issues related to code object versions. -* The `--hipcc-func-supp`/`--hipcc-no-func-supp` options are being deprecated, as the function calls - are already supported in production on AMD GPUs. - -### Known issues - -Under certain circumstances typified by high register pressure, users may encounter a compiler abort -with one of the following error messages: - -* > `error: unhandled SGPR spill to memory` - -* > `cannot scavenge register without an emergency spill slot!` - -* > `error: ran out of registers during register allocation` - -This is a known issue and will be fixed in a future release. - -### Library changes in ROCm 5.4.2 - -| Library | Version | -|---------|---------| -| hipBLAS | [0.53.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-5.4.2) | -| hipCUB | [2.13.0](https://github.com/ROCm/hipCUB/releases/tag/rocm-5.4.2) | -| hipFFT | [1.0.10](https://github.com/ROCm/hipFFT/releases/tag/rocm-5.4.2) | -| hipSOLVER | [1.6.0](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-5.4.2) | -| hipSPARSE | [2.3.3](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-5.4.2) | -| MIVisionX | [2.3.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-5.4.2) | -| rccl | [2.13.4](https://github.com/ROCm/rccl/releases/tag/rocm-5.4.2) | -| rocALUTION | [2.1.3](https://github.com/ROCm/rocALUTION/releases/tag/rocm-5.4.2) | -| rocBLAS | [2.46.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-5.4.2) | -| rocFFT | [1.0.20](https://github.com/ROCm/rocFFT/releases/tag/rocm-5.4.2) | -| rocm-cmake | [0.8.0](https://github.com/ROCm/rocm-cmake/releases/tag/rocm-5.4.2) | -| rocPRIM | [2.12.0](https://github.com/ROCm/rocPRIM/releases/tag/rocm-5.4.2) | -| rocRAND | [2.10.16](https://github.com/ROCm/rocRAND/releases/tag/rocm-5.4.2) | -| rocSOLVER | [3.20.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-5.4.2) | -| rocSPARSE | [2.4.0](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-5.4.2) | -| rocThrust | [2.17.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-5.4.2) | -| rocWMMA | [0.9](https://github.com/ROCm/rocWMMA/releases/tag/rocm-5.4.2) | -| Tensile | [4.35.0](https://github.com/ROCm/Tensile/releases/tag/rocm-5.4.2) | - -------------------- - -## ROCm 5.4.1 - -### What's new in this release - -#### HIP enhancements - -The ROCm v5.4.1 release consists of the following new HIP API: - -##### New HIP API - hipLaunchHostFunc - -The following new HIP API is introduced in the ROCm v5.4.1 release. - -:::{note} -This is a pre-official version (beta) release of the new APIs. -::: - -```cpp -hipError_t hipLaunchHostFunc(hipStream_t stream, hipHostFn_t fn, void* userData); -``` - -This swaps the stream capture mode of a thread. - -```text -@param [in] mode - Pointer to mode value to swap with the current mode -``` - -This parameter returns `#hipSuccess`, `#hipErrorInvalidValue`. - -For more information, refer to the HIP API documentation at -/bundle/HIP_API_Guide/page/modules.html. - -### Deprecations and warnings - -#### HIP Perl scripts deprecation - -The `hipcc` and `hipconfig` Perl scripts are deprecated. In a future release, compiled binaries will be -available as `hipcc.bin` and `hipconfig.bin` as replacements for the Perl scripts. - -:::{note} -There will be a transition period where the Perl scripts and compiled binaries are available before the -scripts are removed. There will be no functional difference between the Perl scripts and their compiled -binary counterpart. No user action is required. Once these are available, users can optionally switch to -`hipcc.bin` and `hipconfig.bin`. The `hipcc`/`hipconfig` soft link will be assimilated to point from -`hipcc`/`hipconfig` to the respective compiled binaries as the default option. -::: - -### IFWI fixes - -These defects were identified and documented as known issues in previous ROCm releases and are -fixed in this release. - -#### AMD Instinct™ MI200 firmware IFWI maintenance update #3 - -This IFWI release fixes the following issue in AMD Instinct™ MI210/MI250 Accelerators. - -After prolonged periods of operation, certain MI200 Instinct™ Accelerators may perform in a degraded -way resulting in application failures. - -In this package, AMD delivers a new firmware version for MI200 GPU accelerators and a firmware -installation tool – AMD FW FLASH 1.2. - -| GPU | Productionp part number | SKU | IFWI name | -|-------|------------|--------|---------------| -| MI210 | 113-D673XX | D67302 | D6730200V.110 | -| MI210 | 113-D673XX | D67301 | D6730100V.073 | -| MI250 | 113-D652XX | D65209 | D6520900.073 | -| MI250 | 113-D652XX | D65210 | D6521000.073 | - -Instructions on how to download and apply MI200 maintenance updates are available at: - - - -#### AMD Instinct™ MI200 SRIOV virtualization support - -Maintenance update #3, combined with ROCm 5.4.1, now provides SRIOV virtualization support for all -AMD Instinct™ MI200 devices. - -### Library changes in ROCm 5.4.1 - -| Library | Version | -|---------|---------| -| hipBLAS | [0.53.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-5.4.1) | -| hipCUB | [2.13.0](https://github.com/ROCm/hipCUB/releases/tag/rocm-5.4.1) | -| hipFFT | [1.0.10](https://github.com/ROCm/hipFFT/releases/tag/rocm-5.4.1) | -| hipSOLVER | [1.6.0](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-5.4.1) | -| hipSPARSE | [2.3.3](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-5.4.1) | -| MIVisionX | [2.3.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-5.4.1) | -| rccl | [2.13.4](https://github.com/ROCm/rccl/releases/tag/rocm-5.4.1) | -| rocALUTION | [2.1.3](https://github.com/ROCm/rocALUTION/releases/tag/rocm-5.4.1) | -| rocBLAS | [2.46.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-5.4.1) | -| rocFFT | 1.0.19 ⇒ [1.0.20](https://github.com/ROCm/rocFFT/releases/tag/rocm-5.4.1) | -| rocm-cmake | [0.8.0](https://github.com/ROCm/rocm-cmake/releases/tag/rocm-5.4.1) | -| rocPRIM | [2.12.0](https://github.com/ROCm/rocPRIM/releases/tag/rocm-5.4.1) | -| rocRAND | [2.10.16](https://github.com/ROCm/rocRAND/releases/tag/rocm-5.4.1) | -| rocSOLVER | [3.20.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-5.4.1) | -| rocSPARSE | [2.4.0](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-5.4.1) | -| rocThrust | [2.17.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-5.4.1) | -| rocWMMA | [0.9](https://github.com/ROCm/rocWMMA/releases/tag/rocm-5.4.1) | -| Tensile | [4.35.0](https://github.com/ROCm/Tensile/releases/tag/rocm-5.4.1) | - -#### rocFFT - -rocFFT 1.0.20 for ROCm 5.4.1 - -##### Fixed - -- Fixed incorrect results on strided large 1D FFTs where batch size does not equal the stride. - -------------------- - -## ROCm 5.4.0 - - -### What's new in this release - -#### HIP enhancements - -The ROCm v5.4 release consists of the following HIP enhancements: - -##### Support for wall_clock64 - -A new timer function wall_clock64() is supported, which returns wall clock count at a constant -frequency on the device. - -```cpp -long long int wall_clock64(); -``` - -It returns wall clock count at a constant frequency on the device, which can be queried via HIP API with -the hipDeviceAttributeWallClockRate attribute of the device in the HIP application code. - -Example: - -```cpp -int wallClkRate = 0; //in kilohertz -+HIPCHECK(hipDeviceGetAttribute(&wallClkRate, hipDeviceAttributeWallClockRate, deviceId)); -``` - -Where hipDeviceAttributeWallClockRate is a device attribute. - -:::{note} -The wall clock frequency is a per-device attribute. -::: - -##### New registry added for GPU_MAX_HW_QUEUES - -The GPU_MAX_HW_QUEUES registry defines the maximum number of independent hardware queues -allocated per process per device. - -The environment variable controls how many independent hardware queues HIP runtime can create -per process, per device. If the application allocates more HIP streams than this number, then the HIP -runtime reuses the same hardware queues for the new streams in a round-robin manner. - -:::{note} -This maximum number does not apply to hardware queues created for CU-masked HIP streams or -cooperative queues for HIP Cooperative Groups (there is only one queue per device). -::: - -For more details, refer to the HIP Programming Guide. - -#### New HIP APIs in this release - -The following new HIP APIs are available in the ROCm v5.4 release. - -:::{note} -This is a pre-official version (beta) release of the new APIs. -::: - -##### Error handling - -```cpp -hipError_t hipDrvGetErrorName(hipError_t hipError, const char** errorString); -``` - -This returns HIP errors in the text string format. - -```cpp -hipError_t hipDrvGetErrorString(hipError_t hipError, const char** errorString); -``` - -This returns text string messages with more details about the error. - -For more information, refer to the HIP API Guide. - -##### HIP tests source separation - -With ROCm v5.4, a separate GitHub project is created at - - - -This contains HIP catch2 tests and samples, and new tests will continue to develop. - -In future ROCm releases, catch2 tests and samples will be removed from the HIP project. - -### OpenMP enhancements - -This release consists of the following OpenMP enhancements: - -* Enable new device RTL in libomptarget as default. -* New flag `-fopenmp-target-fast` to imply `-fopenmp-target-ignore-env-vars -fopenmp-assume-no-thread-state -fopenmp-assume-no-nested-parallelism`. -* Support for the collapse clause and non-unit stride in cases where the no-loop specialized kernel is - generated. -* Initial implementation of optimized cross-team sum reduction for float and double type scalars. -* Pool-based optimization in the OpenMP runtime to reduce locking during data transfer. - -### Deprecations and warnings - -#### HIP Perl scripts deprecation - -The `hipcc` and `hipconfig` Perl scripts are deprecated. In a future release, compiled binaries will be -available as `hipcc.bin` and `hipconfig.bin` as replacements for the Perl scripts. - -:::{note} -There will be a transition period where the Perl scripts and compiled binaries are available before the -scripts are removed. There will be no functional difference between the Perl scripts and their compiled -binary counterpart. No user action is required. Once these are available, users can optionally switch to -`hipcc.bin` and `hipconfig.bin`. The `hipcc`/`hipconfig` soft link will be assimilated to point from -`hipcc`/`hipconfig` to the respective compiled binaries as the default option. -::: - -##### Linux file system hierarchy standard for ROCm - -ROCm packages have adopted the Linux foundation file system hierarchy standard in this release to -ensure ROCm components follow open source conventions for Linux-based distributions. While -moving to a new file system hierarchy, ROCm ensures backward compatibility with its 5.1 version or -older file system hierarchy. See below for a detailed explanation of the new file system hierarchy and -backward compatibility. - -##### New file system hierarchy - -The following is the new file system hierarchy: - -```text -/opt/rocm- - | --bin - | --All externally exposed Binaries - | --libexec - | -- - | -- Component specific private non-ISA executables (architecture independent) - | --include - | -- - | --
- | --lib - | --lib.so -> lib.so.major -> lib.so.major.minor.patch - (public libraries linked with application) - | -- (component specific private library, executable data) - | -- - | --components - | --.config.cmake - | --share - | --html//*.html - | --info//*.[pdf, md, txt] - | --man - | --doc - | -- - | -- - | -- - | -- (arch independent non-executable) - | --samples - -``` - -:::{note} -ROCm will not support backward compatibility with the v5.1(old) file system hierarchy in its next major -release. -::: - -For more information, refer to . - -##### Backward compatibility with older file systems - -ROCm has moved header files and libraries to its new location as indicated in the above structure and -included symbolic-link and wrapper header files in its old location for backward compatibility. - -:::{note} -ROCm will continue supporting backward compatibility until the next major release. -::: - -##### Wrapper header files - -Wrapper header files are placed in the old location (`/opt/rocm-xxx//include`) with a -warning message to include files from the new location (`/opt/rocm-xxx/include`) as shown in the -example below: - -```cpp -// Code snippet from hip_runtime.h -#pragma message “This file is deprecated. Use file from include path /opt/rocm-ver/include/ and prefix with hip”. -#include "hip/hip_runtime.h" -``` - -The wrapper header files’ backward compatibility deprecation is as follows: - -* `#pragma` message announcing deprecation -- ROCm v5.2 release -* `#pragma` message changed to `#warning` -- Future release -* `#warning` changed to `#error` -- Future release -* Backward compatibility wrappers removed -- Future release - -##### Library files - -Library files are available in the `/opt/rocm-xxx/lib` folder. For backward compatibility, the old library -location (`/opt/rocm-xxx//lib`) has a soft link to the library at the new location. - -Example: - -```bash -$ ls -l /opt/rocm/hip/lib/ -total 4 -drwxr-xr-x 4 root root 4096 May 12 10:45 cmake -lrwxrwxrwx 1 root root 24 May 10 23:32 libamdhip64.so -> ../../lib/libamdhip64.so -``` - -##### CMake config files - -All CMake configuration files are available in the `/opt/rocm-xxx/lib/cmake/` folder. For -backward compatibility, the old CMake locations (`/opt/rocm-xxx//lib/cmake`) consist of -a soft link to the new CMake config. - -Example: - -```bash -$ ls -l /opt/rocm/hip/lib/cmake/hip/ -total 0 -lrwxrwxrwx 1 root root 42 May 10 23:32 hip-config.cmake -> ../../../../lib/cmake/hip/hip-config.cmake -``` - -### Defect fixes - -The following defects are fixed in this release. - -These defects were identified and documented as known issues in previous ROCm releases and are -fixed in this release. - -#### Memory allocated using hipHostMalloc() with flags didn't exhibit fine-grain behavior - -##### Issue - -The test was incorrectly using the `hipDeviceAttributePageableMemoryAccess` device attribute to -determine coherent support. - -##### Fix - -`hipHostMalloc()` allocates memory with fine-grained access by default when the environment variable -`HIP_HOST_COHERENT=1` is used. - -For more information, refer to {doc}`hip:doxygen/html/index`. - - -#### SoftHang with `hipStreamWithCUMask` test on AMD Instinct™ - -##### Issue - -On GFX10 GPUs, kernel execution hangs when it is launched on streams created using -`hipStreamWithCUMask`. - -##### Fix - -On GFX10 GPUs, each workgroup processor encompasses two compute units, and the compute units -must be enabled as a pair. The `hipStreamWithCUMask` API unit test cases are updated to set compute -unit mask (cuMask) in pairs for GFX10 GPUs. - -#### ROCm tools GPU IDs - -The HIP language device IDs are not the same as the GPU IDs reported by the tools. GPU IDs are -globally unique and guaranteed to be consistent across APIs and processes. - -GPU IDs reported by ROCTracer and ROCProfiler or ROCm Tools are HSA Driver Node ID of that GPU, -as it is a unique ID for that device in that particular node. - -### Library changes in ROCm 5.4.0 - -| Library | Version | -|---------|---------| -| hipBLAS | 0.52.0 ⇒ [0.53.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-5.4.0) | -| hipCUB | 2.12.0 ⇒ [2.13.0](https://github.com/ROCm/hipCUB/releases/tag/rocm-5.4.0) | -| hipFFT | 1.0.9 ⇒ [1.0.10](https://github.com/ROCm/hipFFT/releases/tag/rocm-5.4.0) | -| hipSOLVER | 1.5.0 ⇒ [1.6.0](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-5.4.0) | -| hipSPARSE | 2.3.1 ⇒ [2.3.3](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-5.4.0) | -| MIVisionX | [2.3.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-5.4.0) | -| rccl | 2.12.10 ⇒ [2.13.4](https://github.com/ROCm/rccl/releases/tag/rocm-5.4.0) | -| rocALUTION | 2.1.0 ⇒ [2.1.3](https://github.com/ROCm/rocALUTION/releases/tag/rocm-5.4.0) | -| rocBLAS | 2.45.0 ⇒ [2.46.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-5.4.0) | -| rocFFT | 1.0.18 ⇒ [1.0.19](https://github.com/ROCm/rocFFT/releases/tag/rocm-5.4.0) | -| rocm-cmake | [0.8.0](https://github.com/ROCm/rocm-cmake/releases/tag/rocm-5.4.0) | -| rocPRIM | 2.11.0 ⇒ [2.12.0](https://github.com/ROCm/rocPRIM/releases/tag/rocm-5.4.0) | -| rocRAND | 2.10.15 ⇒ [2.10.16](https://github.com/ROCm/rocRAND/releases/tag/rocm-5.4.0) | -| rocSOLVER | 3.19.0 ⇒ [3.20.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-5.4.0) | -| rocSPARSE | 2.2.0 ⇒ [2.4.0](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-5.4.0) | -| rocThrust | 2.16.0 ⇒ [2.17.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-5.4.0) | -| rocWMMA | 0.8 ⇒ [0.9](https://github.com/ROCm/rocWMMA/releases/tag/rocm-5.4.0) | -| Tensile | 4.34.0 ⇒ [4.35.0](https://github.com/ROCm/Tensile/releases/tag/rocm-5.4.0) | - -#### hipBLAS - -hipBLAS 0.53.0 for ROCm 5.4.0 - -##### Added - -- Allow for selection of int8 datatype -- Added support for hipblasXgels and hipblasXgelsStridedBatched operations (with s,d,c,z precisions), - only supported with rocBLAS backend -- Added support for hipblasXgelsBatched operations (with s,d,c,z precisions) - -#### hipCUB - -hipCUB 2.13.0 for ROCm 5.4.0 - -##### Added - -- CMake functionality to improve build parallelism of the test suite that splits compilation units by -function or by parameters. -- New overload for `BlockAdjacentDifference::SubtractLeftPartialTile` that takes a predecessor item. - -##### Changed - -- Improved build parallelism of the test suite by splitting up large compilation units for `DeviceRadixSort`, -`DeviceSegmentedRadixSort` and `DeviceSegmentedSort`. -- CUB backend references CUB and thrust version 1.17.1. - -#### hipFFT - -hipFFT 1.0.10 for ROCm 5.4.0 - -##### Added - -- Added hipfftExtPlanScaleFactor API to efficiently multiply each output element of a FFT by a given scaling factor. Result scaling must be supported in the backend FFT library. - -##### Changed - -- When hipFFT is built against the rocFFT backend, rocFFT 1.0.19 or higher is now required. - -#### hipSOLVER - -hipSOLVER 1.6.0 for ROCm 5.4.0 - -##### Added - -- Added compatibility-only functions - - gesvdaStridedBatched - - hipsolverDnSgesvdaStridedBatched_bufferSize, hipsolverDnDgesvdaStridedBatched_bufferSize, hipsolverDnCgesvdaStridedBatched_bufferSize, hipsolverDnZgesvdaStridedBatched_bufferSize - - hipsolverDnSgesvdaStridedBatched, hipsolverDnDgesvdaStridedBatched, hipsolverDnCgesvdaStridedBatched, hipsolverDnZgesvdaStridedBatched - -#### hipSPARSE - -hipSPARSE 2.3.3 for ROCm 5.4.0 - -##### Added - -- Added hipsparseCsr2cscEx2_bufferSize and hipsparseCsr2cscEx2 routines - -##### Changed - -- HIPSPARSE_ORDER_COLUMN has been renamed to HIPSPARSE_ORDER_COL to match cusparse - -#### rccl - -RCCL 2.13.4 for ROCm 5.4.0 - -##### Changed - -- Compatibility with NCCL 2.13.4 -- Improvements to RCCL when running with hipGraphs -- RCCL_ENABLE_HIPGRAPH environment variable is no longer necessary to enable hipGraph support -- Minor latency improvements - -##### Fixed - -- Resolved potential memory access error due to asynchronous memset - -#### rocALUTION - -rocALUTION 2.1.3 for ROCm 5.4.0 - -##### Added - -- Added build support for Navi31 and Navi33 -- Added support for non-squared global matrices - -##### Improved - -- Fixed a memory leak in MatrixMult on HIP backend -- Global structures can now be used with a single process - -##### Changed - -- Switched GTest death test style to 'threadsafe' -- GlobalVector::GetGhostSize() is deprecated and will be removed -- ParallelManager::GetGlobalSize(), ParallelManager::GetLocalSize(), ParallelManager::SetGlobalSize() and ParallelManager::SetLocalSize() are deprecated and will be removed -- Vector::GetGhostSize() is deprecated and will be removed -- Multigrid::SetOperatorFormat(unsigned int) is deprecated and will be removed, use Multigrid::SetOperatorFormat(unsigned int, int) instead -- RugeStuebenAMG::SetCouplingStrength(ValueType) is deprecated and will be removed, use SetStrengthThreshold(float) instead - -#### rocBLAS - -rocBLAS 2.46.0 for ROCm 5.4.0 - -##### Added - -- client smoke test dataset added for quick validation using command rocblas-test --yaml rocblas_smoke.yaml -- Added stream order device memory allocation as a non-default beta option. - -##### Optimized - -- Improved trsm performance for small sizes by using a substitution method technique -- Improved syr2k and her2k performance significantly by using a block-recursive algorithm - -##### Changed - -- Level 2, Level 1, and Extension functions: argument checking when the handle is set to rocblas_pointer_mode_host now returns the status of rocblas_status_invalid_pointer only for pointers that must be dereferenced based on the alpha and beta argument values. With handle mode rocblas_pointer_mode_device only pointers that are always dereferenced regardless of alpha and beta values are checked and so may lead to a return status of rocblas_status_invalid_pointer. This improves consistency with legacy BLAS behaviour. -- Add variable to turn on/off ieee16/ieee32 tests for mixed precision gemm -- Allow hipBLAS to select int8 datatype -- Disallow B == C && ldb != ldc in rocblas_xtrmm_outofplace - -##### Fixed - -- FORTRAN interfaces generalized for FORTRAN compilers other than gfortran -- fix for trsm_strided_batched rocblas-bench performance gathering -- Fix for rocm-smi path in commandrunner.py script to match ROCm 5.2 and above - -#### rocFFT - -rocFFT 1.0.19 for ROCm 5.4.0 - -##### Optimizations - -- Optimized some strided large 1D plans. - -##### Added - -- Added rocfft_plan_description_set_scale_factor API to efficiently multiply each output element of a FFT by a given scaling factor. -- Created a rocfft_kernel_cache.db file next to the installed library. SBCC kernels are moved to this file when built with the library, and are runtime-compiled for new GPU architectures. -- Added gfx1100 and gfx1102 to default AMDGPU_TARGETS. - -##### Changed - -- Moved runtime compilation cache to in-memory by default. A default on-disk cache can encounter contention problems -on multi-node clusters with a shared filesystem. rocFFT can still be told to use an on-disk cache by setting the -ROCFFT_RTC_CACHE_PATH environment variable. - -#### rocPRIM - -rocPRIM 2.12.0 for ROCm 5.4.0 - -##### Changed - -- `device_partition`, `device_unique`, and `device_reduce_by_key` now support problem - sizes larger than 2^32 items. - -##### Removed - -- `block_sort::sort()` overload for keys and values with a dynamic size. This overload was documented but the - implementation is missing. To avoid further confusion the documentation is removed until a decision is made on - implementing the function. - -##### Fixed - -- Fixed the compilation failure in `device_merge` if the two key iterators don't match. - -#### rocRAND - -rocRAND 2.10.16 for ROCm 5.4.0 - -##### Added - -- MRG31K3P pseudorandom number generator based on L'Ecuyer and Touzin, 2000, "Fast combined multiple recursive generators with multipliers of the form a = ±2q ±2r". -- LFSR113 pseudorandom number generator based on L'Ecuyer, 1999, "Tables of maximally equidistributed combined LFSR generators". -- SCRAMBLED_SOBOL32 and SCRAMBLED_SOBOL64 quasirandom number generators. The Scrambled Sobol sequences are generated by scrambling the output of a Sobol sequence. - -##### Changed - -- The `mrg_<distribution>_distribution` structures, which provided numbers based on MRG32K3A, are now replaced by `mrg_engine_<distribution>_distribution`, where `<distribution>` is `log_normal`, `normal`, `poisson`, or `uniform`. These structures provide numbers for MRG31K3P (with template type `rocrand_state_mrg31k3p`) and MRG32K3A (with template type `rocrand_state_mrg32k3a`). - -##### Fixed - -- Sobol64 now returns 64 bits random numbers, instead of 32 bits random numbers. As a result, the performance of this generator has regressed. -- Fixed a bug that prevented compiling code in C++ mode (with a host compiler) when it included the rocRAND headers on Windows. - -#### rocSOLVER - -rocSOLVER 3.20.0 for ROCm 5.4.0 - -##### Added - -- Partial SVD for bidiagonal matrices: - - BDSVDX -- Partial SVD for general matrices: - - GESVDX (with batched and strided\_batched versions) - -##### Changed - -- Changed `ROCSOLVER_EMBED_FMT` default to `ON` for users building directly with CMake. - This matches the existing default when building with install.sh or rmake.py. - -#### rocSPARSE - -rocSPARSE 2.4.0 for ROCm 5.4.0 - -##### Added - -- Added rocsparse_spmv_ex routine -- Added rocsparse_bsrmv_ex_analysis and rocsparse_bsrmv_ex routines -- Added csritilu0 routine -- Added build support for Navi31 and Navi 33 - -##### Improved - -- Optimization to segmented algorithm for COO SpMV by performing analysis -- Improve performance when generating random matrices. -- Fixed bug in ellmv -- Optimized bsr2csr routine -- Fixed integer overflow bugs - -#### rocThrust - -rocThrust 2.17.0 for ROCm 5.4.0 - -##### Added - -- Updated to match upstream Thrust 1.17.0 - -#### rocWMMA - -rocWMMA 0.9 for ROCm 5.4.0 - -##### Added - -- Added gemm driver APIs for flow control builtins -- Added benchmark logging systems -- Restructured tests to follow naming convention. Added macros for test generation - -##### Changed - -- Changed CMake to accomodate the modified test infrastructure -- Fine tuned the multi-block kernels with and without lds -- Adjusted Maximum Vector Width to dWordx4 Width -- Updated Efficiencies to display as whole number percentages -- Updated throughput from GFlops/s to TFlops/s -- Reset the ad-hoc tests to use smaller sizes -- Modified the output validation to use CPU-based implementation against rocWMMA -- Modified the extended vector test to return error codes for memory allocation failures - -#### Tensile - -Tensile 4.35.0 for ROCm 5.4.0 - -##### Added - -- Async DMA support for Transpose Data Layout (ThreadSeparateGlobalReadA/B) -- Option to output library logic in dictionary format -- No solution found error message for benchmarking client -- Exact K check for StoreCInUnrollExact -- Support for CGEMM + MIArchVgpr -- client-path parameter for using prebuilt client -- CleanUpBuildFiles global parameter -- Debug flag for printing library logic index of winning solution -- NumWarmups global parameter for benchmarking -- Windows support for benchmarking client -- DirectToVgpr support for CGEMM -- TensileLibLogicToYaml for creating tuning configs from library logic solutions - -##### Optimizations - -- Put beta code and store separately if StoreCInUnroll = x4 store -- Improved performance for StoreCInUnroll + b128 store - -##### Changed - -- Re-enable HardwareMonitor for gfx90a -- Decision trees use MLFeatures instead of Properties - -##### Fixed - -- Reject DirectToVgpr + MatrixInstBM/BN > 1 -- Fix benchmark timings when using warmups and/or validation -- Fix mismatch issue with DirectToVgprB + VectorWidth > 1 -- Fix mismatch issue with DirectToLds + NumLoadsCoalesced > 1 + TailLoop -- Fix incorrect reject condition for DirectToVgpr -- Fix reject condition for DirectToVgpr + MIWaveTile < VectorWidth -- Fix incorrect instruction generation with StoreCInUnroll - -------------------- - -## ROCm 5.3.3 - -### Defect fixes - -#### Issue with rocTHRUST and rocPRIM libraries - -There was a known issue with rocTHRUST and rocPRIM libraries supporting iterator and types in ROCm -v5.3.x releases. - -* `thrust::merge` no longer correctly supports different iterator types for `keys_input1` and - `keys_input2`. -* `rocprim::device_merge` no longer correctly supports using different types for `keys_input1` and - `keys_input2`. - -This issue is resolved with the following fixes to compilation failures: - -* rocPRIM: in device_merge if the two key iterators do not match. -* rocTHRUST: in thrust::merge if the two key iterators do not match. - -### Library changes in ROCm 5.3.3 - -| Library | Version | -|---------|---------| -| hipBLAS | [0.52.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-5.3.3) | -| hipCUB | [2.12.0](https://github.com/ROCm/hipCUB/releases/tag/rocm-5.3.3) | -| hipFFT | [1.0.9](https://github.com/ROCm/hipFFT/releases/tag/rocm-5.3.3) | -| hipSOLVER | [1.5.0](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-5.3.3) | -| hipSPARSE | [2.3.1](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-5.3.3) | -| MIVisionX | [2.3.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-5.3.3) | -| rccl | [2.12.10](https://github.com/ROCm/rccl/releases/tag/rocm-5.3.3) | -| rocALUTION | [2.1.0](https://github.com/ROCm/rocALUTION/releases/tag/rocm-5.3.3) | -| rocBLAS | [2.45.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-5.3.3) | -| rocFFT | [1.0.18](https://github.com/ROCm/rocFFT/releases/tag/rocm-5.3.3) | -| rocm-cmake | [0.8.0](https://github.com/ROCm/rocm-cmake/releases/tag/rocm-5.3.3) | -| rocPRIM | [2.11.0](https://github.com/ROCm/rocPRIM/releases/tag/rocm-5.3.3) | -| rocRAND | [2.10.15](https://github.com/ROCm/rocRAND/releases/tag/rocm-5.3.3) | -| rocSOLVER | [3.19.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-5.3.3) | -| rocSPARSE | [2.2.0](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-5.3.3) | -| rocThrust | [2.16.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-5.3.3) | -| rocWMMA | [0.8](https://github.com/ROCm/rocWMMA/releases/tag/rocm-5.3.3) | -| Tensile | [4.34.0](https://github.com/ROCm/Tensile/releases/tag/rocm-5.3.3) | - -------------------- - -## ROCm 5.3.2 - -### Defect fixes - -The following known issues in ROCm v5.3.2 are fixed in this release. - -#### Peer-to-peer DMA mapping errors with SLES and RHEL - -Peer-to-Peer Direct Memory Access (DMA) mapping errors on Dell systems (R7525 and R750XA) with -SLES 15 SP3/SP4 and RHEL 9.0 are fixed in this release. - -Previously, running `rocminfo` resulted in Peer-to-Peer DMA mapping errors. - -#### RCCL tuning table - -The RCCL tuning table is updated for supported platforms. - -#### SGEMM (F32 GEMM) routines in rocBLAS - -Functional correctness failures in SGEMM (F32 GEMM) routines in rocBLAS for certain problem sizes -and ranges are fixed in this release. - -### Known issues - -This section consists of known issues in this release. - -#### AMD Instinct™ MI200 SRIOV virtualization issue - -There is a known issue in this ROCm v5.3 release with all AMD Instinct™ MI200 devices running within -a virtual function (VF) under SRIOV virtualization. This issue will likely impact the functionality of -SRIOV-based workloads but does not impact Discrete Device Assignment (DDA) or bare metal. - -Until a fix is provided, users should rely on ROCm v5.2.3 to support their SRIOV workloads. - -#### AMD Instinct™ MI200 firmware updates - -Customers cannot update the Integrated Firmware Image (IFWI) for AMD Instinct™ MI200 accelerators. - -An updated firmware maintenance bundle consisting of an installation tool and images specific to -AMD Instinct™ MI200 accelerators is under planning and will be available soon. - -#### Known issue with rocThrust and rocPRIM libraries - -There is a known known issue with rocThrust and rocPRIM libraries supporting iterator and types in -ROCm v5.3.x releases. - -* `thrust::merge` no longer correctly supports different iterator types for `keys_input1` and - `keys_input2`. - -* `rocprim::device_merge` no longer correctly supports using different types for `keys_input1` and - `keys_input2`. - -This issue is currently under investigation and will be resolved in a future release. - -### Library changes in ROCm 5.3.2 - -| Library | Version | -|---------|---------| -| hipBLAS | [0.52.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-5.3.2) | -| hipCUB | [2.12.0](https://github.com/ROCm/hipCUB/releases/tag/rocm-5.3.2) | -| hipFFT | [1.0.9](https://github.com/ROCm/hipFFT/releases/tag/rocm-5.3.2) | -| hipSOLVER | [1.5.0](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-5.3.2) | -| hipSPARSE | [2.3.1](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-5.3.2) | -| MIVisionX | [2.3.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-5.3.2) | -| rccl | [2.12.10](https://github.com/ROCm/rccl/releases/tag/rocm-5.3.2) | -| rocALUTION | [2.1.0](https://github.com/ROCm/rocALUTION/releases/tag/rocm-5.3.2) | -| rocBLAS | [2.45.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-5.3.2) | -| rocFFT | [1.0.18](https://github.com/ROCm/rocFFT/releases/tag/rocm-5.3.2) | -| rocm-cmake | [0.8.0](https://github.com/ROCm/rocm-cmake/releases/tag/rocm-5.3.2) | -| rocPRIM | [2.11.0](https://github.com/ROCm/rocPRIM/releases/tag/rocm-5.3.2) | -| rocRAND | [2.10.15](https://github.com/ROCm/rocRAND/releases/tag/rocm-5.3.2) | -| rocSOLVER | [3.19.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-5.3.2) | -| rocSPARSE | [2.2.0](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-5.3.2) | -| rocThrust | [2.16.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-5.3.2) | -| rocWMMA | [0.8](https://github.com/ROCm/rocWMMA/releases/tag/rocm-5.3.2) | -| Tensile | [4.34.0](https://github.com/ROCm/Tensile/releases/tag/rocm-5.3.2) | - -------------------- - -## ROCm 5.3.0 - -### Deprecations and warnings - -#### HIP Perl scripts deprecation - -The `hipcc` and `hipconfig` Perl scripts are deprecated. In a future release, compiled binaries will be -available as `hipcc.bin` and `hipconfig.bin` as replacements for the Perl scripts. - -:::{note} -There will be a transition period where the Perl scripts and compiled binaries are available before the -scripts are removed. There will be no functional difference between the Perl scripts and their compiled -binary counterpart. No user action is required. Once these are available, users can optionally switch to -`hipcc.bin` and `hipconfig.bin`. The `hipcc`/`hipconfig` soft link will be assimilated to point from -`hipcc`/`hipconfig` to the respective compiled binaries as the default option. -::: - -#### Linux file system hierarchy standard for ROCm - -ROCm packages have adopted the Linux foundation file system hierarchy standard in this release to -ensure ROCm components follow open source conventions for Linux-based distributions. While -moving to a new file system hierarchy, ROCm ensures backward compatibility with its 5.1 version or -older file system hierarchy. See below for a detailed explanation of the new file system hierarchy and -backward compatibility. - -##### New file system hierarchy - -The following is the new file system hierarchy: - -```text -/opt/rocm- - | --bin - | --All externally exposed Binaries - | --libexec - | -- - | -- Component specific private non-ISA executables (architecture independent) - | --include - | -- - | --
- | --lib - | --lib.so -> lib.so.major -> lib.so.major.minor.patch - (public libraries linked with application) - | -- (component specific private library, executable data) - | -- - | --components - | --.config.cmake - | --share - | --html//*.html - | --info//*.[pdf, md, txt] - | --man - | --doc - | -- - | -- - | -- - | -- (arch independent non-executable) - | --samples - -``` - -:::{note} -ROCm will not support backward compatibility with the v5.1(old) file system hierarchy in its next major -release. -::: - -For more information, refer to . - -##### Backward compatibility with older file systems - -ROCm has moved header files and libraries to its new location as indicated in the above structure and -included symbolic-link and wrapper header files in its old location for backward compatibility. - -:::{note} -ROCm will continue supporting backward compatibility until the next major release. -::: - -##### Wrapper header files - -Wrapper header files are placed in the old location (`/opt/rocm-xxx//include`) with a -warning message to include files from the new location (`/opt/rocm-xxx/include`) as shown in the -example below: - -```cpp -// Code snippet from hip_runtime.h -#pragma message “This file is deprecated. Use file from include path /opt/rocm-ver/include/ and prefix with hip”. -#include "hip/hip_runtime.h" -``` - -The wrapper header files’ backward compatibility deprecation is as follows: - -* `#pragma` message announcing deprecation -- ROCm v5.2 release -* `#pragma` message changed to `#warning` -- Future release -* `#warning` changed to `#error` -- Future release -* Backward compatibility wrappers removed -- Future release - -##### Library files - -Library files are available in the `/opt/rocm-xxx/lib` folder. For backward compatibility, the old library -location (`/opt/rocm-xxx//lib`) has a soft link to the library at the new location. - -Example: - -```bash -$ ls -l /opt/rocm/hip/lib/ -total 4 -drwxr-xr-x 4 root root 4096 May 12 10:45 cmake -lrwxrwxrwx 1 root root 24 May 10 23:32 libamdhip64.so -> ../../lib/libamdhip64.so -``` - -##### CMake config files - -All CMake configuration files are available in the `/opt/rocm-xxx/lib/cmake/` folder. For -backward compatibility, the old CMake locations (`/opt/rocm-xxx//lib/cmake`) consist of -a soft link to the new CMake config. - -Example: - -```bash -$ ls -l /opt/rocm/hip/lib/cmake/hip/ -total 0 -lrwxrwxrwx 1 root root 42 May 10 23:32 hip-config.cmake -> ../../../../lib/cmake/hip/hip-config.cmake -``` - -### Defect fixes - -The following defects are fixed in this release. - -These defects were identified and documented as known issues in previous ROCm releases and are -fixed in the ROCm v5.3 release. - -#### Kernel produces incorrect results with ROCm 5.2 - -User code did not initialize certain data constructs, leading to a correctness issue. A strict reading of -the C++ standard suggests that failing to initialize these data constructs is undefined behavior. -However, a special case was added for a specific compiler builtin to handle the uninitialized data in a -defined manner. - -The compiler fix consists of the following patches: - -* A new `noundef` attribute is added. This attribute denotes when a function call argument or return - value may never contain uninitialized bits. For more information, see - -* The application of this attribute was refined such that it was not added to a specific compiler built-in - where the compiler knows that inactive lanes do not impact program execution. For more - information, see - . - -### Known issues - -This section consists of known issues in this release. - -#### Issue with OpenMP-extras package upgrade - -The `openmp-extras` package has been split into runtime (`openmp-extras-runtime`) and dev -(`openmp-extras-devel`) packages. This change has broken the upgrade support for the -`openmp-extras` package in RHEL/SLES. - -An available workaround in RHEL is to use the following command for upgrades: - -```sh -sudo yum upgrade rocm-language-runtime --allowerasing - -``` - -An available workaround in SLES is to use the following command for upgrades: - -```sh -zypper update --force-resolution -``` - -#### AMD Instinct™ MI200 SRIOV virtualization issue - -There is a known issue in this ROCm v5.3 release with all AMD Instinct™ MI200 devices running within -a virtual function (VF) under SRIOV virtualization. This issue will likely impact the functionality of -SRIOV-based workloads, but does not impact Discrete Device Assignment (DDA) or Bare Metal. - -Until a fix is provided, users should rely on ROCm v5.2.3 to support their SRIOV workloads. - -#### System crash when IMMOU is enabled - -If input-output memory management unit (IOMMU) is enabled in SBIOS and ROCm is installed, the -system may report the following failure or errors when running workloads such as bandwidth test, -clinfo, and HelloWord.cl and cause a system crash. - -* IO PAGE FAULT -* IRQ remapping does not support X2APIC mode -* NMI error - -Workaround: To avoid the system crash, add `amd_iommu=on iommu=pt` as the kernel bootparam, as -indicated in the warning message. - -### Library changes in ROCm 5.3.0 - -| Library | Version | -|---------|---------| -| hipBLAS | 0.51.0 ⇒ [0.52.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-5.3.0) | -| hipCUB | 2.11.1 ⇒ [2.12.0](https://github.com/ROCm/hipCUB/releases/tag/rocm-5.3.0) | -| hipFFT | 1.0.8 ⇒ [1.0.9](https://github.com/ROCm/hipFFT/releases/tag/rocm-5.3.0) | -| hipSOLVER | 1.4.0 ⇒ [1.5.0](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-5.3.0) | -| hipSPARSE | 2.2.0 ⇒ [2.3.1](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-5.3.0) | -| MIVisionX | [2.3.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-5.3.0) | -| rccl | [2.12.10](https://github.com/ROCm/rccl/releases/tag/rocm-5.3.0) | -| rocALUTION | 2.0.3 ⇒ [2.1.0](https://github.com/ROCm/rocALUTION/releases/tag/rocm-5.3.0) | -| rocBLAS | 2.44.0 ⇒ [2.45.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-5.3.0) | -| rocFFT | 1.0.17 ⇒ [1.0.18](https://github.com/ROCm/rocFFT/releases/tag/rocm-5.3.0) | -| rocm-cmake | [0.8.0](https://github.com/ROCm/rocm-cmake/releases/tag/rocm-5.3.0) | -| rocPRIM | 2.10.14 ⇒ [2.11.0](https://github.com/ROCm/rocPRIM/releases/tag/rocm-5.3.0) | -| rocRAND | 2.10.14 ⇒ [2.10.15](https://github.com/ROCm/rocRAND/releases/tag/rocm-5.3.0) | -| rocSOLVER | 3.18.0 ⇒ [3.19.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-5.3.0) | -| rocSPARSE | [2.2.0](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-5.3.0) | -| rocThrust | 2.15.0 ⇒ [2.16.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-5.3.0) | -| rocWMMA | 0.7 ⇒ [0.8](https://github.com/ROCm/rocWMMA/releases/tag/rocm-5.3.0) | -| Tensile | 4.33.0 ⇒ [4.34.0](https://github.com/ROCm/Tensile/releases/tag/rocm-5.3.0) | - -#### hipBLAS - -hipBLAS 0.52.0 for ROCm 5.3.0 - -##### Added - -- Added --cudapath option to install.sh to allow user to specify which cuda build they would like to use. -- Added --installcuda option to install.sh to install cuda via a package manager. Can be used with new --installcudaversion - option to specify which version of cuda to install. - -##### Fixed - -- Fixed #includes to support a compiler version. -- Fixed client dependency support in install.sh - -#### hipCUB - -hipCUB 2.12.0 for ROCm 5.3.0 - -##### Added - -- UniqueByKey device algorithm -- SubtractLeft, SubtractLeftPartialTile, SubtractRight, SubtractRightPartialTile overloads in BlockAdjacentDifference. - - The old overloads (FlagHeads, FlagTails, FlagHeadsAndTails) are deprecated. -- DeviceAdjacentDifference algorithm. -- Extended benchmark suite of `DeviceHistogram`, `DeviceScan`, `DevicePartition`, `DeviceReduce`, -`DeviceSegmentedReduce`, `DeviceSegmentedRadixSort`, `DeviceRadixSort`, `DeviceSpmv`, `DeviceMergeSort`, -`DeviceSegmentedSort` - -##### Changed - -- Obsolated type traits defined in util_type.hpp. Use the standard library equivalents instead. -- CUB backend references CUB and thrust version 1.16.0. -- DeviceRadixSort's num_items parameter's type is now templated instead of being an int. - - If an integral type with a size at most 4 bytes is passed (i.e. an int), the former logic applies. - - Otherwise the algorithm uses a larger indexing type that makes it possible to sort input data over 2**32 elements. -- Improved build parallelism of the test suite by splitting up large compilation units - -#### hipFFT - -hipFFT 1.0.9 for ROCm 5.3.0 - -##### Changed - -- Clean up build warnings. -- GNUInstall Dir enhancements. -- Requires gtest 1.11. - -#### hipSOLVER - -hipSOLVER 1.5.0 for ROCm 5.3.0 - -##### Added - -- Added functions - - syevj - - hipsolverSsyevj_bufferSize, hipsolverDsyevj_bufferSize, hipsolverCheevj_bufferSize, hipsolverZheevj_bufferSize - - hipsolverSsyevj, hipsolverDsyevj, hipsolverCheevj, hipsolverZheevj - - syevjBatched - - hipsolverSsyevjBatched_bufferSize, hipsolverDsyevjBatched_bufferSize, hipsolverCheevjBatched_bufferSize, hipsolverZheevjBatched_bufferSize - - hipsolverSsyevjBatched, hipsolverDsyevjBatched, hipsolverCheevjBatched, hipsolverZheevjBatched - - sygvj - - hipsolverSsygvj_bufferSize, hipsolverDsygvj_bufferSize, hipsolverChegvj_bufferSize, hipsolverZhegvj_bufferSize - - hipsolverSsygvj, hipsolverDsygvj, hipsolverChegvj, hipsolverZhegvj -- Added compatibility-only functions - - syevdx/heevdx - - hipsolverDnSsyevdx_bufferSize, hipsolverDnDsyevdx_bufferSize, hipsolverDnCheevdx_bufferSize, hipsolverDnZheevdx_bufferSize - - hipsolverDnSsyevdx, hipsolverDnDsyevdx, hipsolverDnCheevdx, hipsolverDnZheevdx - - sygvdx/hegvdx - - hipsolverDnSsygvdx_bufferSize, hipsolverDnDsygvdx_bufferSize, hipsolverDnChegvdx_bufferSize, hipsolverDnZhegvdx_bufferSize - - hipsolverDnSsygvdx, hipsolverDnDsygvdx, hipsolverDnChegvdx, hipsolverDnZhegvdx -- Added --mem_query option to hipsolver-bench, which will print the amount of device memory workspace required by the function. - -##### Changed - -- The rocSOLVER backend will now set `info` to zero if rocSOLVER does not reference `info`. (Applies to orgbr/ungbr, orgqr/ungqr, orgtr/ungtr, ormqr/unmqr, ormtr/unmtr, gebrd, geqrf, getrs, potrs, and sytrd/hetrd). -- gesvdj will no longer require extra workspace to transpose `V` when `jobz` is `HIPSOLVER_EIG_MODE_VECTOR` and `econ` is 1. - -##### Fixed - -- Fixed Fortran return value declarations within hipsolver_module.f90 -- Fixed gesvdj_bufferSize returning `HIPSOLVER_STATUS_INVALID_VALUE` when `jobz` is `HIPSOLVER_EIG_MODE_NOVECTOR` and 1 <= `ldv` < `n` -- Fixed gesvdj returning `HIPSOLVER_STATUS_INVALID_VALUE` when `jobz` is `HIPSOLVER_EIG_MODE_VECTOR`, `econ` is 1, and `m` < `n` - -#### hipSPARSE - -hipSPARSE 2.3.1 for ROCm 5.3.0 - -##### Added - -- Add SpMM and SpMM batched for CSC format - -#### rocALUTION - -rocALUTION 2.1.0 for ROCm 5.3.0 - -##### Added - -- Benchmarking tool -- Ext+I Interpolation with sparsify strategies added for RS-AMG - -##### Improved - -- ParallelManager - -#### rocBLAS - -rocBLAS 2.45.0 for ROCm 5.3.0 - -##### Added - -- install.sh option --upgrade_tensile_venv_pip to upgrade Pip in Tensile Virtual Environment. The corresponding CMake option is TENSILE_VENV_UPGRADE_PIP. -- install.sh option --relocatable or -r adds rpath and removes ldconf entry on rocBLAS build. -- install.sh option --lazy-library-loading to enable on-demand loading of tensile library files at runtime to speedup rocBLAS initialization. -- Support for RHEL9 and CS9. -- Added Numerical checking routine for symmetric, Hermitian, and triangular matrices, so that they could be checked for any numerical abnormalities such as NaN, Zero, infinity and denormal value. - -##### Optimizations - -- trmm_outofplace performance improvements for all sizes and data types using block-recursive algorithm. -- herkx performance improvements for all sizes and data types using block-recursive algorithm. -- syrk/herk performance improvements by utilising optimised syrkx/herkx code. -- symm/hemm performance improvements for all sizes and datatypes using block-recursive algorithm. - -##### Changed - -- Unifying library logic file names: affects HBH (->HHS_BH), BBH (->BBS_BH), 4xi8BH (->4xi8II_BH). All HPA types are using the new naming convention now. -- Level 3 function argument checking when the handle is set to rocblas_pointer_mode_host now returns the status of rocblas_status_invalid_pointer only for pointers that must be dereferenced based on the alpha and beta argument values. With handle mode rocblas_pointer_mode_device only pointers that are always dereferenced regardless of alpha and beta values are checked and so may lead to a return status of rocblas_status_invalid_pointer. This improves consistency with legacy BLAS behaviour. -- Level 1, 2, and 3 function argument checking for enums is now more rigorously matching legacy BLAS so returns rocblas_status_invalid_value if arguments do not match the accepted subset. -- Add quick-return for internal trmm and gemm template functions. -- Moved function block sizes to a shared header file. -- Level 1, 2, and 3 functions use rocblas_stride datatype for offset. -- Modified the matrix and vector memory allocation in our test infrastructure for all Level 1, 2, 3 and BLAS_EX functions. -- Added specific initialization for symmetric, Hermitian, and triangular matrix types in our test infrastructure. -- Added NaN tests to the test infrastructure for the rest of Level 3, BLAS_EX functions. - -##### Fixed - -- Improved logic to #include <filesystem> vs <experimental/filesystem>. -- install.sh -s option to build rocblas as a static library. -- dot function now sets the device results asynchronously for N <= 0 - -##### Deprecated - -- is_complex helper is now deprecated. Use rocblas_is_complex instead. -- The enum truncate_t and the value truncate is now deprecated and will removed from the ROCm release 6.0. It is replaced by rocblas_truncate_t and rocblas_truncate, respectively. The new enum rocblas_truncate_t and the value rocblas_truncate could be used from this ROCm release for an easy transition. - -##### Removed - -- install.sh options --hip-clang , --no-hip-clang, --merge-files, --no-merge-files are removed. - -#### rocFFT - -rocFFT 1.0.18 for ROCm 5.3.0 - -##### Changed - -- Runtime compilation cache now looks for environment variables XDG_CACHE_HOME (on Linux) and LOCALAPPDATA (on - Windows) before falling back to HOME. - -##### Optimizations - -- Optimized 2D R2C/C2R to use 2-kernel plans where possible. -- Improved performance of the Bluestein algorithm. -- Optimized sbcc-168 and 100 by using half-lds. - -##### Fixed - -- Fixed occasional failures to parallelize runtime compilation of kernels. - Failures would be retried serially and ultimately succeed, but this would take extra time. -- Fixed failures of some R2C 3D transforms that use the unsupported TILE_UNALGNED SBRC kernels. - An example is 98^3 R2C out-of-place. -- Fixed bugs in SBRC_ERC type. - -#### rocm-cmake - -rocm-cmake 0.8.0 for ROCm 5.3.0 - -##### Fixed - -- Fixed error in prerm scripts created by `rocm_create_package` that could break uninstall for packages using the `PTH` option. - -##### Changed - -- `ROCM_USE_DEV_COMPONENT` set to on by default for all platforms. This means that Windows will now generate runtime and devel packages by default -- ROCMInstallTargets now defaults `CMAKE_INSTALL_LIBDIR` to `lib` if not otherwise specified. -- Changed default Debian compression type to xz and enabled multi-threaded package compression. -- `rocm_create_package` will no longer warn upon failure to determine version of program rpmbuild. - -#### rocPRIM - -rocPRIM 2.11.0 for ROCm 5.3.0 - -##### Added - -- New functions `subtract_left` and `subtract_right` in `block_adjacent_difference` to apply functions - on pairs of adjacent items distributed between threads in a block. -- New device level `adjacent_difference` primitives. -- Added experimental tooling for automatic kernel configuration tuning for various architectures -- Benchmarks collect and output more detailed system information -- CMake functionality to improve build parallelism of the test suite that splits compilation units by -function or by parameters. -- Reverse iterator. - -#### rocRAND - -rocRAND 2.10.15 for ROCm 5.3.0 - -##### Changed - -- Increased number of warmup iterations for rocrand_benchmark_generate from 5 to 15 to eliminate corner cases that would generate artificially high benchmark scores. - -#### rocSOLVER - -rocSOLVER 3.19.0 for ROCm 5.3.0 - -##### Added - -- Partial eigensolver routines for symmetric/hermitian matrices: - - SYEVX (with batched and strided\_batched versions) - - HEEVX (with batched and strided\_batched versions) -- Generalized symmetric- and hermitian-definite partial eigensolvers: - - SYGVX (with batched and strided\_batched versions) - - HEGVX (with batched and strided\_batched versions) -- Eigensolver routines for symmetric/hermitian matrices using Jacobi algorithm: - - SYEVJ (with batched and strided\_batched versions) - - HEEVJ (with batched and strided\_batched versions) -- Generalized symmetric- and hermitian-definite eigensolvers using Jacobi algorithm: - - SYGVJ (with batched and strided\_batched versions) - - HEGVJ (with batched and strided\_batched versions) -- Added --profile_kernels option to rocsolver-bench, which will include kernel calls in the - profile log (if profile logging is enabled with --profile). - -##### Changed - -- Changed rocsolver-bench result labels `cpu_time` and `gpu_time` to - `cpu_time_us` and `gpu_time_us`, respectively. - -##### Removed - -- Removed dependency on cblas from the rocsolver test and benchmark clients. - -##### Fixed - -- Fixed incorrect SYGS2/HEGS2, SYGST/HEGST, SYGV/HEGV, and SYGVD/HEGVD results for batch counts - larger than 32. -- Fixed STEIN memory access fault when nev is 0. -- Fixed incorrect STEBZ results for close eigenvalues when range = index. -- Fixed git unsafe repository error when building with `./install.sh -cd` as a non-root user. - -#### rocThrust - -rocThrust 2.16.0 for ROCm 5.3.0 - -##### Changed - -- rocThrust functionality dependent on device malloc works is functional as ROCm 5.2 reneabled device malloc. Device launched `thrust::sort` and `thrust::sort_by_key` are available for use. - -#### rocWMMA - -rocWMMA 0.8 for ROCm 5.3.0 - -#### Tensile - -Tensile 4.34.0 for ROCm 5.3.0 - -##### Added - -- Lazy loading of solution libraries and code object files -- Support for dictionary style logic files -- Support for decision tree based logic files using dictionary format -- DecisionTreeLibrary for solution selection -- DirectToLDS support for HGEMM -- DirectToVgpr support for SGEMM -- Grid based distance metric for solution selection -- Support for gfx11xx -- Support for DirectToVgprA/B + TLU=False -- ForkParameters Groups as a way of specifying solution parameters -- Support for a new Tensile yaml config format -- TensileClientConfig for generating Tensile client config files -- Options for TensileCreateLibrary to build client and create client config file - -##### Optimizations - -- Solution generation is now cached and is not repeated if solution parameters are unchanged - -##### Changed - -- Default MACInstruction to FMA - -##### Fixed - -- Accept StaggerUStride=0 as valid -- Reject invalid data types for UnrollLoopEfficiencyEnable -- Fix invalid code generation issues related to DirectToVgpr -- Return hipErrorNotFound if no modules are loaded -- Fix performance drop for NN ZGEMM with 96x64 macro tile -- Fix memory violation for general batched kernels when alpha/beta/K = 0 - -------------------- - -## ROCm 5.2.3 - -### Changes in this release - -#### Ubuntu 18.04 end-of-life announcement - -Support for Ubuntu 18.04 ends in this release. Future releases of ROCm will not provide prebuilt -packages for Ubuntu 18.04. - -#### HIP runtime - -##### Fixes - -* A bug was discovered in the HIP graph capture implementation in the ROCm v5.2.0 release. If the - same kernel is called twice (with different argument values) in a graph capture, the implementation - only kept the argument values for the second kernel call. - -* A bug was introduced in the hiprtc implementation in the ROCm v5.2.0 release. This bug caused the - `hiprtcGetLoweredName` call to fail for named expressions with whitespace in it. - -Example: - -The named expression `my_sqrt>` passed but `my_sqrt>` -failed. - -#### RCCL - -##### Additions - -Compatibility with NCCL 2.12.10 - -* Packages for test and benchmark executables on all supported OSes using CPack - -* Added custom signal handler - opt-in with RCCL_ENABLE_SIGNALHANDLER=1 - - * Additional details provided if Binary File Descriptor library (BFD) is pre-installed. - -* Added experimental support for using multiple ranks per device - - * Requires using a new interface to create communicator (ncclCommInitRankMulti), refer to the - interface documentation for details. - - * To avoid potential deadlocks, user might have to set an environment variables increasing the - number of hardware queues. For example, - -```sh -export GPU_MAX_HW_QUEUES=16 -``` - -* Added support for reusing ports in NET/IB channels - - * Opt-in with NCCL_IB_SOCK_CLIENT_PORT_REUSE=1 and NCCL_IB_SOCK_SERVER_PORT_REUSE=1 - - * When "Call to bind failed: Address already in use" error happens in large-scale AlltoAll (for example, - \>=64 MI200 nodes), users are suggested to opt-in either one or both of the options to resolve the - massive port usage issue - - * Avoid using NCCL_IB_SOCK_SERVER_PORT_REUSE when NCCL_NCHANNELS_PER_NET_PEER is tuned - \>1 - -##### Removals - -* Removed experimental clique-based kernels - -#### Development tools - -No notable changes in this release for development tools, including the compiler, profiler, and -debugger deployment and management tools - -No notable changes in this release for deployment and management tools. - -For release information for older ROCm releases, refer to - - -### Library changes in ROCm 5.2.3 - -| Library | Version | -|---------|---------| -| hipBLAS | [0.51.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-5.2.3) | -| hipCUB | [2.11.1](https://github.com/ROCm/hipCUB/releases/tag/rocm-5.2.3) | -| hipFFT | [1.0.8](https://github.com/ROCm/hipFFT/releases/tag/rocm-5.2.3) | -| hipSOLVER | [1.4.0](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-5.2.3) | -| hipSPARSE | [2.2.0](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-5.2.3) | -| MIVisionX | [2.3.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-5.2.3) | -| rccl | 2.11.4 ⇒ [2.12.10](https://github.com/ROCm/rccl/releases/tag/rocm-5.2.3) | -| rocALUTION | [2.0.3](https://github.com/ROCm/rocALUTION/releases/tag/rocm-5.2.3) | -| rocBLAS | [2.44.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-5.2.3) | -| rocFFT | [1.0.17](https://github.com/ROCm/rocFFT/releases/tag/rocm-5.2.3) | -| rocPRIM | [2.10.14](https://github.com/ROCm/rocPRIM/releases/tag/rocm-5.2.3) | -| rocRAND | [2.10.14](https://github.com/ROCm/rocRAND/releases/tag/rocm-5.2.3) | -| rocSOLVER | [3.18.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-5.2.3) | -| rocSPARSE | [2.2.0](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-5.2.3) | -| rocThrust | [2.15.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-5.2.3) | -| rocWMMA | [0.7](https://github.com/ROCm/rocWMMA/releases/tag/rocm-5.2.3) | -| Tensile | [4.33.0](https://github.com/ROCm/Tensile/releases/tag/rocm-5.2.3) | - -#### rccl - -RCCL 2.12.10 for ROCm 5.2.3 - -##### Added - -- Compatibility with NCCL 2.12.10 -- Packages for test and benchmark executables on all supported OSes using CPack. -- Adding custom signal handler - opt-in with RCCL_ENABLE_SIGNALHANDLER=1 - - Additional details provided if Binary File Descriptor library (BFD) is pre-installed -- Adding support for reusing ports in NET/IB channels - - Opt-in with NCCL_IB_SOCK_CLIENT_PORT_REUSE=1 and NCCL_IB_SOCK_SERVER_PORT_REUSE=1 - - When "Call to bind failed : Address already in use" error happens in large-scale AlltoAll - (e.g., >=64 MI200 nodes), users are suggested to opt-in either one or both of the options - to resolve the massive port usage issue - - Avoid using NCCL_IB_SOCK_SERVER_PORT_REUSE when NCCL_NCHANNELS_PER_NET_PEER is tuned >1 - -##### Removed - -- Removed experimental clique-based kernels - -------------------- - -## ROCm 5.2.1 - - -### Library changes in ROCm 5.2.1 - -| Library | Version | -|---------|---------| -| hipBLAS | [0.51.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-5.2.1) | -| hipCUB | [2.11.1](https://github.com/ROCm/hipCUB/releases/tag/rocm-5.2.1) | -| hipFFT | [1.0.8](https://github.com/ROCm/hipFFT/releases/tag/rocm-5.2.1) | -| hipSOLVER | [1.4.0](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-5.2.1) | -| hipSPARSE | [2.2.0](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-5.2.1) | -| MIVisionX | 2.2.0 ⇒ [2.3.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-5.2.1) | -| rccl | [2.11.4](https://github.com/ROCm/rccl/releases/tag/rocm-5.2.1) | -| rocALUTION | [2.0.3](https://github.com/ROCm/rocALUTION/releases/tag/rocm-5.2.1) | -| rocBLAS | [2.44.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-5.2.1) | -| rocFFT | [1.0.17](https://github.com/ROCm/rocFFT/releases/tag/rocm-5.2.1) | -| rocPRIM | [2.10.14](https://github.com/ROCm/rocPRIM/releases/tag/rocm-5.2.1) | -| rocRAND | [2.10.14](https://github.com/ROCm/rocRAND/releases/tag/rocm-5.2.1) | -| rocSOLVER | [3.18.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-5.2.1) | -| rocSPARSE | [2.2.0](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-5.2.1) | -| rocThrust | [2.15.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-5.2.1) | -| rocWMMA | [0.7](https://github.com/ROCm/rocWMMA/releases/tag/rocm-5.2.1) | -| Tensile | [4.33.0](https://github.com/ROCm/Tensile/releases/tag/rocm-5.2.1) | - -#### MIVisionX - -MIVisionX for ROCm 5.2.1 - -##### Added - -* Docker Support for ROCm `5.2.X` - -##### Optimizations - -* - -##### Changed - -* - -##### Fixed - -* - -##### Tested Configurations - -* Windows `10` / `11` -* Linux distribution - + Ubuntu - `18.04` / `20.04` - + CentOS - `7` / `8` - + SLES - `15-SP2` -* ROCm: rocm-core - `5.2.0.50200-65` -* miopen-hip - `2.16.0.50101-48` -* miopen-opencl - `2.16.0.50101-48` -* migraphx - `2.1.0.50101-48` -* Protobuf - [V3.12.4](https://github.com/protocolbuffers/protobuf/releases/tag/v3.12.4) -* OpenCV - [4.5.5](https://github.com/opencv/opencv/releases/tag/4.5.5) -* RPP - [0.93](https://github.com/GPUOpen-ProfessionalCompute-Libraries/rpp/releases/tag/0.93) -* FFMPEG - [n4.4.2](https://github.com/FFmpeg/FFmpeg/releases/tag/n4.4.2) -* Dependencies for all the above packages -* MIVisionX Setup Script - `V2.3.4` - -##### Known Issues - -* OpenCV 4.X support for some apps missing - -##### Mivisionx Dependency Map - -**Docker Image:** `sudo docker build -f docker/ubuntu20/{DOCKER_LEVEL_FILE_NAME}.dockerfile -t {mivisionx-level-NUMBER} .` - -- ![#c5f015](docs/images/green_square.png) `new component added to the level` -- ![#1589F0](docs/images/blue_square.png) `existing component from the previous level` - -| Build Level | MIVisionX Dependencies | Modules | Libraries and Executables | Docker Tag | -| ----------- | -------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Level_1` | cmake <br> gcc <br> g++ | amd_openvx <br> utilities | ![#c5f015](docs/images/green_square.png) `libopenvx.so` - OpenVX&trade; Lib - CPU <br> ![#c5f015](docs/images/green_square.png) `libvxu.so` - OpenVX&trade; immediate node Lib - CPU <br> ![#c5f015](docs/images/green_square.png) `runvx` - OpenVX&trade; Graph Executor - CPU with Display OFF | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-1?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_2` | ROCm OpenCL <br> +Level 1 | amd_openvx <br> amd_openvx_extensions <br> utilities | ![#c5f015](docs/images/green_square.png) `libopenvx.so` - OpenVX&trade; Lib - CPU/GPU <br> ![#c5f015](docs/images/green_square.png) `libvxu.so` - OpenVX&trade; immediate node Lib - CPU/GPU <br> ![#c5f015](docs/images/green_square.png) `libvx_loomsl.so` - Loom 360 Stitch Lib <br> ![#c5f015](docs/images/green_square.png) `loom_shell` - 360 Stitch App <br> ![#c5f015](docs/images/green_square.png) `runcl` - OpenCL&trade; program debug App <br> ![#c5f015](docs/images/green_square.png) `runvx` - OpenVX&trade; Graph Executor - Display OFF | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-2?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_3` | OpenCV <br> FFMPEG <br> +Level 2 | amd_openvx <br> amd_openvx_extensions <br> utilities | ![#1589F0](docs/images/blue_square.png) `libopenvx.so` - OpenVX&trade; Lib <br> ![#1589F0](docs/images/blue_square.png) `libvxu.so` - OpenVX&trade; immediate node Lib <br> ![#1589F0](docs/images/blue_square.png) `libvx_loomsl.so` - Loom 360 Stitch Lib <br> ![#1589F0](docs/images/blue_square.png) `loom_shell` - 360 Stitch App <br> ![#1589F0](docs/images/blue_square.png) `runcl` - OpenCL&trade; program debug App <br> ![#c5f015](docs/images/green_square.png) `libvx_amd_media.so` - OpenVX&trade; Media Extension <br> ![#c5f015](docs/images/green_square.png) `libvx_opencv.so` - OpenVX&trade; OpenCV InterOp Extension <br> ![#c5f015](docs/images/green_square.png) `mv_compile` - Neural Net Model Compile <br> ![#c5f015](docs/images/green_square.png) `runvx` - OpenVX&trade; Graph Executor - Display ON | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-3?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_4` | MIOpenGEMM <br> MIOpen <br> ProtoBuf <br> +Level 3 | amd_openvx <br> amd_openvx_extensions <br> apps <br> utilities | ![#1589F0](docs/images/blue_square.png) `libopenvx.so` - OpenVX&trade; Lib <br> ![#1589F0](docs/images/blue_square.png) `libvxu.so` - OpenVX&trade; immediate node Lib <br> ![#1589F0](docs/images/blue_square.png) `libvx_loomsl.so` - Loom 360 Stitch Lib <br> ![#1589F0](docs/images/blue_square.png) `loom_shell` - 360 Stitch App <br> ![#1589F0](docs/images/blue_square.png) `libvx_amd_media.so` - OpenVX&trade; Media Extension <br> ![#1589F0](docs/images/blue_square.png) `libvx_opencv.so` - OpenVX&trade; OpenCV InterOp Extension <br> ![#1589F0](docs/images/blue_square.png) `mv_compile` - Neural Net Model Compile <br> ![#1589F0](docs/images/blue_square.png) `runcl` - OpenCL&trade; program debug App <br> ![#1589F0](docs/images/blue_square.png) `runvx` - OpenVX&trade; Graph Executor - Display ON <br> ![#c5f015](docs/images/green_square.png) `libvx_nn.so` - OpenVX&trade; Neural Net Extension <br> ![#c5f015](docs/images/green_square.png) `inference_server_app` - Cloud Inference App | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-4?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_5` | AMD_RPP <br> rocAL deps <br> +Level 4 | amd_openvx <br> amd_openvx_extensions <br> apps <br> rocAL <br> utilities | ![#1589F0](docs/images/blue_square.png) `libopenvx.so` - OpenVX&trade; Lib <br> ![#1589F0](docs/images/blue_square.png) `libvxu.so` - OpenVX&trade; immediate node Lib <br> ![#1589F0](docs/images/blue_square.png) `libvx_loomsl.so` - Loom 360 Stitch Lib <br> ![#1589F0](docs/images/blue_square.png) `loom_shell` - 360 Stitch App <br> ![#1589F0](docs/images/blue_square.png) `libvx_amd_media.so` - OpenVX&trade; Media Extension <br> ![#1589F0](docs/images/blue_square.png) `libvx_opencv.so` - OpenVX&trade; OpenCV InterOp Extension <br> ![#1589F0](docs/images/blue_square.png) `mv_compile` - Neural Net Model Compile <br> ![#1589F0](docs/images/blue_square.png) `runcl` - OpenCL&trade; program debug App <br> ![#1589F0](docs/images/blue_square.png) `runvx` - OpenVX&trade; Graph Executor - Display ON <br> ![#1589F0](docs/images/blue_square.png) `libvx_nn.so` - OpenVX&trade; Neural Net Extension <br> ![#1589F0](docs/images/blue_square.png) `inference_server_app` - Cloud Inference App <br> ![#c5f015](docs/images/green_square.png) `libvx_rpp.so` - OpenVX&trade; RPP Extension <br> ![#c5f015](docs/images/green_square.png) `librali.so` - Radeon Augmentation Library <br> ![#c5f015](docs/images/green_square.png) `rali_pybind.so` - rocAL Pybind Lib | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-5?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | - -------------------- - -## ROCm 5.2.0 - - -### What's new in this release - -#### HIP enhancements - -The ROCm v5.2 release consists of the following HIP enhancements: - -##### HIP installation guide updates - -The HIP Installation Guide is updated to include building HIP tests from source on the AMD and -NVIDIA platforms. - -For more details, refer to the HIP Installation Guide v5.2. - -##### Support for device-side malloc on HIP-Clang - -HIP-Clang now supports device-side malloc. This implementation does not require the use of -`hipDeviceSetLimit(hipLimitMallocHeapSize,value)` nor respect any setting. The heap is fully dynamic -and can grow until the available free memory on the device is consumed. - -The test codes at the following link show how to implement applications using malloc and free -functions in device kernels: - - - -##### New HIP APIs in this release - -The following new HIP APIs are available in the ROCm v5.2 release. Note that this is a pre-official -version (beta) release of the new APIs: - -###### Device management HIP APIs - -The new device management HIP APIs are as follows: - -* Gets a UUID for the device. This API returns a UUID for the device. - - ```cpp - hipError_t hipDeviceGetUuid(hipUUID* uuid, hipDevice_t device); - ``` - - Note that this new API corresponds to the following CUDA API: - - ```cpp - CUresult cuDeviceGetUuid(CUuuid* uuid, CUdevice dev); - ``` - -* Gets default memory pool of the specified device - - ```cpp - hipError_t hipDeviceGetDefaultMemPool(hipMemPool_t* mem_pool, int device); - ``` - -* Sets the current memory pool of a device - - ```cpp - hipError_t hipDeviceSetMemPool(int device, hipMemPool_t mem_pool); - ``` - -* Gets the current memory pool for the specified device - - ```cpp - hipError_t hipDeviceGetMemPool(hipMemPool_t* mem_pool, int device); - ``` - -###### New HIP runtime APIs in memory management - -The new Stream Ordered Memory Allocator functions of HIP runtime APIs in memory management are: - -* Allocates memory with stream ordered semantics - - ```cpp - hipError_t hipMallocAsync(void** dev_ptr, size_t size, hipStream_t stream); - ``` - -* Frees memory with stream ordered semantics - - ```cpp - hipError_t hipFreeAsync(void* dev_ptr, hipStream_t stream); - ``` - -* Releases freed memory back to the OS - - ```cpp - hipError_t hipMemPoolTrimTo(hipMemPool_t mem_pool, size_t min_bytes_to_hold); - ``` - -* Sets attributes of a memory pool - - ```cpp - hipError_t hipMemPoolSetAttribute(hipMemPool_t mem_pool, hipMemPoolAttr attr, void* value); - ``` - -* Gets attributes of a memory pool - - ```cpp - hipError_t hipMemPoolGetAttribute(hipMemPool_t mem_pool, hipMemPoolAttr attr, void* value); - ``` - -* Controls visibility of the specified pool between devices - - ```cpp - hipError_t hipMemPoolSetAccess(hipMemPool_t mem_pool, const hipMemAccessDesc* desc_list, size_t count); - ``` - -* Returns the accessibility of a pool from a device - - ```cpp - hipError_t hipMemPoolGetAccess(hipMemAccessFlags* flags, hipMemPool_t mem_pool, hipMemLocation* location); - ``` - -* Creates a memory pool - - ```cpp - hipError_t hipMemPoolCreate(hipMemPool_t* mem_pool, const hipMemPoolProps* pool_props); - ``` - -* Destroys the specified memory pool - - ```cpp - hipError_t hipMemPoolDestroy(hipMemPool_t mem_pool); - ``` - -* Allocates memory from a specified pool with stream ordered semantics - - ```cpp - hipError_t hipMallocFromPoolAsync(void** dev_ptr, size_t size, hipMemPool_t mem_pool, hipStream_t stream); - ``` - -* Exports a memory pool to the requested handle type - - ```cpp - hipError_t hipMemPoolExportToShareableHandle( - void* shared_handle, - hipMemPool_t mem_pool, - hipMemAllocationHandleType handle_type, - unsigned int flags); - ``` - -* Imports a memory pool from a shared handle - - ```cpp - hipError_t hipMemPoolImportFromShareableHandle( - hipMemPool_t* mem_pool, - void* shared_handle, - hipMemAllocationHandleType handle_type, - unsigned int flags); - ``` - -* Exports data to share a memory pool allocation between processes - - ```cpp - hipError_t hipMemPoolExportPointer(hipMemPoolPtrExportData* export_data, void* dev_ptr); - Import a memory pool allocation from another process.t - hipError_t hipMemPoolImportPointer( - void** dev_ptr, - hipMemPool_t mem_pool, - hipMemPoolPtrExportData* export_data); - ``` - -###### HIP graph management APIs - -The new HIP Graph Management APIs are as follows: - -* Enqueues a host function call in a stream - - ```cpp - hipError_t hipLaunchHostFunc(hipStream_t stream, hipHostFn_t fn, void* userData); - ``` - -* Swaps the stream capture mode of a thread - - ```cpp - hipError_t hipThreadExchangeStreamCaptureMode(hipStreamCaptureMode* mode); - ``` - -* Sets a node attribute - - ```cpp - hipError_t hipGraphKernelNodeSetAttribute(hipGraphNode_t hNode, hipKernelNodeAttrID attr, const hipKernelNodeAttrValue* value); - ``` - -* Gets a node attribute - - ```cpp - hipError_t hipGraphKernelNodeGetAttribute(hipGraphNode_t hNode, hipKernelNodeAttrID attr, hipKernelNodeAttrValue* value); - ``` - -###### Support for virtual memory management APIs - -The new APIs for virtual memory management are as follows: - -* Frees an address range reservation made via hipMemAddressReserve - - ```cpp - hipError_t hipMemAddressFree(void* devPtr, size_t size); - ``` - -* Reserves an address range - - ```cpp - hipError_t hipMemAddressReserve(void** ptr, size_t size, size_t alignment, void* addr, unsigned long long flags); - ``` - -* Creates a memory allocation described by the properties and size - - ```cpp - hipError_t hipMemCreate(hipMemGenericAllocationHandle_t* handle, size_t size, const hipMemAllocationProp* prop, unsigned long long flags); - ``` - -* Exports an allocation to a requested shareable handle type - - ```cpp - hipError_t hipMemExportToShareableHandle(void* shareableHandle, hipMemGenericAllocationHandle_t handle, hipMemAllocationHandleType handleType, unsigned long long flags); - ``` - -* Gets the access flags set for the given location and ptr - - ```cpp - hipError_t hipMemGetAccess(unsigned long long* flags, const hipMemLocation* location, void* ptr); - ``` - -* Calculates either the minimal or recommended granularity - - ```cpp - hipError_t hipMemGetAllocationGranularity(size_t* granularity, const hipMemAllocationProp* prop, hipMemAllocationGranularity_flags option); - ``` - -* Retrieves the property structure of the given handle - - ```cpp - hipError_t hipMemGetAllocationPropertiesFromHandle(hipMemAllocationProp* prop, hipMemGenericAllocationHandle_t handle); - ``` - -* Imports an allocation from a requested shareable handle type - - ```cpp - hipError_t hipMemImportFromShareableHandle(hipMemGenericAllocationHandle_t* handle, void* osHandle, hipMemAllocationHandleType shHandleType); - ``` - -* Maps an allocation handle to a reserved virtual address range - - ```cpp - hipError_t hipMemMap(void* ptr, size_t size, size_t offset, hipMemGenericAllocationHandle_t handle, unsigned long long flags); - ``` - -* Maps or unmaps subregions of sparse HIP arrays and sparse HIP mipmapped arrays - - ```cpp - hipError_t hipMemMapArrayAsync(hipArrayMapInfo* mapInfoList, unsigned int count, hipStream_t stream); - ``` - -* Release a memory handle representing a memory allocation, that was previously allocated through hipMemCreate - - ```cpp - hipError_t hipMemRelease(hipMemGenericAllocationHandle_t handle); - ``` - -* Returns the allocation handle of the backing memory allocation given the address - - ```cpp - hipError_t hipMemRetainAllocationHandle(hipMemGenericAllocationHandle_t* handle, void* addr); - ``` - -* Sets the access flags for each location specified in desc for the given virtual address range - - ```cpp - hipError_t hipMemSetAccess(void* ptr, size_t size, const hipMemAccessDesc* desc, size_t count); - ``` - -* Unmaps memory allocation of a given address range - - ```cpp - hipError_t hipMemUnmap(void* ptr, size_t size); - ``` - -For more information, refer to the HIP API documentation at -{doc}`hip:doxygen/html/modules`. - -##### Planned HIP changes in future releases - -Changes to `hipDeviceProp_t`, `HIPMEMCPY_3D`, and `hipArray` structures (and related HIP APIs) are -planned in the next major release. These changes may impact backward compatibility. - -Refer to the release notes in subsequent releases for more information. - -#### ROCm math and communication libraries - -In this release, ROCm math and communication libraries consist of the following enhancements and -fixes: - -* New rocWMMA for matrix multiplication and accumulation operations acceleration - -This release introduces a new ROCm C++ library for accelerating mixed-precision matrix multiplication -and accumulation (MFMA) operations leveraging specialized GPU matrix cores. rocWMMA provides a -C++ API to facilitate breaking down matrix multiply accumulate problems into fragments and using -them in block-wise operations that are distributed in parallel across GPU wavefronts. The API is a -header library of GPU device code, meaning matrix core acceleration may be compiled directly into -your kernel device code. This can benefit from compiler optimization in the generation of kernel -assembly and does not incur additional overhead costs of linking to external runtime libraries or having -to launch separate kernels. - -rocWMMA is released as a header library and includes test and sample projects to validate and -illustrate example usages of the C++ API. GEMM matrix multiplication is used as primary validation -given the heavy precedent for the library. However, the usage portfolio is growing significantly and -demonstrates different ways rocWMMA may be consumed. - -For more information, refer to [Communication libraries](../reference/api-libraries.md). - -#### OpenMP enhancements in this release - -##### OMPT target support - -The OpenMP runtime in ROCm implements a subset of the OMPT device APIs, as described in the -OpenMP specification document. These are APIs that allow first-party tools to examine the profile -and traces for kernels that execute on a device. A tool may register callbacks for data transfer and -kernel dispatch entry points. A tool may use APIs to start and stop tracing for device-related activities, -such as data transfer and kernel dispatch timings and associated metadata. If device tracing is enabled, -trace records for device activities are collected during program execution and returned to the tool -using the APIs described in the specification. - -Following is an example demonstrating how a tool would use the OMPT target APIs supported. The -README in /opt/rocm/llvm/examples/tools/ompt outlines the steps to follow, and you can run the -provided example as indicated below: - -```sh -cd /opt/rocm/llvm/examples/tools/ompt/veccopy-ompt-target-tracing -make run -``` - -The file `veccopy-ompt-target-tracing.c` simulates how a tool would initiate device activity tracing. The -file `callbacks.h` shows the callbacks that may be registered and implemented by the tool. - -### Deprecations and warnings - -#### Linux file system hierarchy standard for ROCm - -ROCm packages have adopted the Linux foundation file system hierarchy standard in this release to -ensure ROCm components follow open source conventions for Linux-based distributions. While -moving to a new file system hierarchy, ROCm ensures backward compatibility with its 5.1 version or -older file system hierarchy. See below for a detailed explanation of the new file system hierarchy and -backward compatibility. - -##### New file system hierarchy - -The following is the new file system hierarchy: - -```text -/opt/rocm- - | --bin - | --All externally exposed Binaries - | --libexec - | -- - | -- Component specific private non-ISA executables (architecture independent) - | --include - | -- - | --
- | --lib - | --lib.so -> lib.so.major -> lib.so.major.minor.patch - (public libraries linked with application) - | -- (component specific private library, executable data) - | -- - | --components - | --.config.cmake - | --share - | --html//*.html - | --info//*.[pdf, md, txt] - | --man - | --doc - | -- - | -- - | -- - | -- (arch independent non-executable) - | --samples - -``` - -:::{note} -ROCm will not support backward compatibility with the v5.1(old) file system hierarchy in its next major -release. -::: - -For more information, refer to . - -##### Backward compatibility with older file systems - -ROCm has moved header files and libraries to its new location as indicated in the above structure and -included symbolic-link and wrapper header files in its old location for backward compatibility. - -:::{note} -ROCm will continue supporting backward compatibility until the next major release. -::: - -##### Wrapper header files - -Wrapper header files are placed in the old location (`/opt/rocm-xxx//include`) with a -warning message to include files from the new location (`/opt/rocm-xxx/include`) as shown in the -example below: - -```cpp -// Code snippet from hip_runtime.h -#pragma message “This file is deprecated. Use file from include path /opt/rocm-ver/include/ and prefix with hip”. -#include "hip/hip_runtime.h" -``` - -The wrapper header files’ backward compatibility deprecation is as follows: - -* `#pragma` message announcing deprecation -- ROCm v5.2 release -* `#pragma` message changed to `#warning` -- Future release -* `#warning` changed to `#error` -- Future release -* Backward compatibility wrappers removed -- Future release - -##### Library files - -Library files are available in the `/opt/rocm-xxx/lib` folder. For backward compatibility, the old library -location (`/opt/rocm-xxx//lib`) has a soft link to the library at the new location. - -Example: - -```bash -$ ls -l /opt/rocm/hip/lib/ -total 4 -drwxr-xr-x 4 root root 4096 May 12 10:45 cmake -lrwxrwxrwx 1 root root 24 May 10 23:32 libamdhip64.so -> ../../lib/libamdhip64.so -``` - -##### CMake config files - -All CMake configuration files are available in the `/opt/rocm-xxx/lib/cmake/` folder. For -backward compatibility, the old CMake locations (`/opt/rocm-xxx//lib/cmake`) consist of -a soft link to the new CMake config. - -Example: - -```bash -$ ls -l /opt/rocm/hip/lib/cmake/hip/ -total 0 -lrwxrwxrwx 1 root root 42 May 10 23:32 hip-config.cmake -> ../../../../lib/cmake/hip/hip-config.cmake -``` - -#### Planned deprecation of hip-rocclr and hip-base packages - -In the ROCm v5.2 release, hip-rocclr and hip-base packages (Debian and RPM) are planned for -deprecation and will be removed in a future release. hip-runtime-amd and hip-dev(el) will replace -these packages respectively. Users of hip-rocclr must install two packages, hip-runtime-amd and -hip-dev, to get the same set of packages installed by hip-rocclr previously. - -Currently, both package names hip-rocclr (or) hip-runtime-amd and hip-base (or) hip-dev(el) are -supported. - -#### Deprecation of integrated HIP directed tests - -The integrated HIP directed tests, which are currently built by default, are deprecated in this release. -The default building and execution support through CMake will be removed in future release. - -### Defect fixes - -| Defect | Fix | -|--------|------| -| ROCmInfo does not list gpus | code fix | -| Hang observed while restoring cooperative group samples | code fix | -| ROCM-SMI over SRIOV: Unsupported commands do not return proper error message | code fix | - -### Known issues - -This section consists of known issues in this release. - -#### Compiler error on gfx1030 when compiling at -O0 - -##### Issue - -A compiler error occurs when using -O0 flag to compile code for gfx1030 that calls atomicAddNoRet, -which is defined in amd_hip_atomic.h. The compiler generates an illegal instruction for gfx1030. - -##### Workaround - -The workaround is not to use the -O0 flag for this case. For higher optimization levels, the compiler -does not generate an invalid instruction. - -#### System freeze observed during CUDA memtest checkpoint - -##### Issue - -Checkpoint/Restore in Userspace (CRIU) requires 20 MB of VRAM approximately to checkpoint and -restore. The CRIU process may freeze if the maximum amount of available VRAM is allocated to -checkpoint applications. - -##### Workaround - -To use CRIU to checkpoint and restore your application, limit the amount of VRAM the application uses -to ensure at least 20 MB is available. - -#### HPC test fails with the “HSA_STATUS_ERROR_MEMORY_FAULT” error - -##### Issue - -The compiler may incorrectly compile a program that uses the `__shfl_sync(mask, value, srcLane)` -function when the "value" parameter to the function is undefined along some path to the function. For -most functions, uninitialized inputs cause undefined behavior, but the definition for `__shfl_sync` should -allow for undefined values. - -##### Workaround - -The workaround is to initialize the parameters to `__shfl_sync`. - -:::{note} -When the `-Wall` compilation flag is used, the compiler generates a warning indicating the variable is -initialized along some path. -::: - -Example: - -```cpp -double res = 0.0; // Initialize the input to __shfl_sync. -if (lane == 0) { - res = -} -res = __shfl_sync(mask, res, 0); -``` - -#### Kernel produces incorrect result - -##### Issue - -In recent changes to Clang, insertion of the noundef attribute to all the function arguments has been -enabled by default. - -In the HIP kernel, variable var in shfl_sync may not be initialized, so LLVM IR treats it as undef. - -So, the function argument that is potentially undef (because it is not initialized) has always been -assumed to be noundef by LLVM IR (since Clang has inserted the noundef attribute). This leads to -ambiguous kernel execution. - -##### Workaround - -* Skip adding `noundef` attribute to functions tagged with convergent attribute. Refer to - for more information. - -* Introduce shuffle attribute and add it to `__shfl` like APIs at hip headers. Clang can skip adding the - `noundef` attribute, if it finds that argument is tagged with shuffle attribute. Refer to - for more information. - -* Introduce clang builtin for `__shfl` to identify it and skip adding `noundef` attribute. - -* Introduce `__builtin_freeze` to use on the relevant arguments in library wrappers. The library/header - need to insert freezes on the relevant inputs. - -#### Issue with applications triggering oversubscription - -There is a known issue with applications that trigger oversubscription. A hardware hang occurs when -ROCgdb is used on AMD Instinct™ MI50 and MI100 systems. - -This issue is under investigation and will be fixed in a future release. - -### Library changes in ROCm 5.2.0 - -| Library | Version | -|---------|---------| -| hipBLAS | 0.50.0 ⇒ [0.51.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-5.2.0) | -| hipCUB | 2.11.0 ⇒ [2.11.1](https://github.com/ROCm/hipCUB/releases/tag/rocm-5.2.0) | -| hipFFT | 1.0.7 ⇒ [1.0.8](https://github.com/ROCm/hipFFT/releases/tag/rocm-5.2.0) | -| hipSOLVER | 1.3.0 ⇒ [1.4.0](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-5.2.0) | -| hipSPARSE | 2.1.0 ⇒ [2.2.0](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-5.2.0) | -| MIVisionX | [2.2.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-5.2.0) | -| rccl | [2.11.4](https://github.com/ROCm/rccl/releases/tag/rocm-5.2.0) | -| rocALUTION | 2.0.2 ⇒ [2.0.3](https://github.com/ROCm/rocALUTION/releases/tag/rocm-5.2.0) | -| rocBLAS | 2.43.0 ⇒ [2.44.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-5.2.0) | -| rocFFT | 1.0.16 ⇒ [1.0.17](https://github.com/ROCm/rocFFT/releases/tag/rocm-5.2.0) | -| rocPRIM | 2.10.13 ⇒ [2.10.14](https://github.com/ROCm/rocPRIM/releases/tag/rocm-5.2.0) | -| rocRAND | 2.10.13 ⇒ [2.10.14](https://github.com/ROCm/rocRAND/releases/tag/rocm-5.2.0) | -| rocSOLVER | 3.17.0 ⇒ [3.18.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-5.2.0) | -| rocSPARSE | 2.1.0 ⇒ [2.2.0](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-5.2.0) | -| rocThrust | 2.14.0 ⇒ [2.15.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-5.2.0) | -| rocWMMA | [0.7](https://github.com/ROCm/rocWMMA/releases/tag/rocm-5.2.0) | -| Tensile | 4.32.0 ⇒ [4.33.0](https://github.com/ROCm/Tensile/releases/tag/rocm-5.2.0) | - -#### hipBLAS - -hipBLAS 0.51.0 for ROCm 5.2.0 - -##### Added - -- Packages for test and benchmark executables on all supported OSes using CPack. -- Added File/Folder Reorg Changes with backward compatibility support enabled using ROCM-CMAKE wrapper functions -- Added user-specified initialization option to hipblas-bench - -##### Fixed - -- Fixed version gathering in performance measuring script - -#### hipCUB - -hipCUB 2.11.1 for ROCm 5.2.0 - -##### Added - -- Packages for tests and benchmark executable on all supported OSes using CPack. - -#### hipFFT - -hipFFT 1.0.8 for ROCm 5.2.0 - -##### Added - -- Added File/Folder Reorg Changes with backward compatibility support using ROCM-CMAKE wrapper functions. -- Packages for test and benchmark executables on all supported OSes using CPack. - -#### hipSOLVER - -hipSOLVER 1.4.0 for ROCm 5.2.0 - -##### Added - -- Package generation for test and benchmark executables on all supported OSes using CPack. -- File/Folder Reorg - - Added File/Folder Reorg Changes with backward compatibility support using ROCM-CMAKE wrapper functions. - -##### Fixed - -- Fixed the ReadTheDocs documentation generation. - -#### hipSPARSE - -hipSPARSE 2.2.0 for ROCm 5.2.0 - -##### Added - -- Packages for test and benchmark executables on all supported OSes using CPack. - -#### rocALUTION - -rocALUTION 2.0.3 for ROCm 5.2.0 - -##### Added - -- Packages for test and benchmark executables on all supported OSes using CPack. - -#### rocBLAS - -rocBLAS 2.44.0 for ROCm 5.2.0 - -##### Added - -- Packages for test and benchmark executables on all supported OSes using CPack. -- Added Denormal number detection to the Numerical checking helper function to detect denormal/subnormal numbers in the input and the output vectors of rocBLAS level 1 and 2 functions. -- Added Denormal number detection to the Numerical checking helper function to detect denormal/subnormal numbers in the input and the output general matrices of rocBLAS level 2 and 3 functions. -- Added NaN initialization tests to the yaml files of Level 2 rocBLAS batched and strided-batched functions for testing purposes. -- Added memory allocation check to avoid disk swapping during rocblas-test runs by skipping tests. - -##### Optimizations - -- Improved performance of non-batched and batched her2 for all sizes and data types. -- Improved performance of non-batched and batched amin for all data types using shuffle reductions. -- Improved performance of non-batched and batched amax for all data types using shuffle reductions. -- Improved performance of trsv for all sizes and data types. - -##### Changed - -- Modifying gemm_ex for HBH (High-precision F16). The alpha/beta data type remains as F32 without narrowing to F16 and expanding back to F32 in the kernel. This change prevents rounding errors due to alpha/beta conversion in situations where alpha/beta are not exactly represented as an F16. -- Modified non-batched and batched asum, nrm2 functions to use shuffle instruction based reductions. -- For gemm, gemm_ex, gemm_ex2 internal API use rocblas_stride datatype for offset. -- For symm, hemm, syrk, herk, dgmm, geam internal API use rocblas_stride datatype for offset. -- AMD copyright year for all rocBLAS files. -- For gemv (transpose-case), typecasted the 'lda'(offset) datatype to size_t during offset calculation to avoid overflow and remove duplicate template functions. - -##### Fixed - -- For function her2 avoid overflow in offset calculation. -- For trsm when alpha == 0 and on host, allow A to be nullptr. -- Fixed memory access issue in trsv. -- Fixed git pre-commit script to update only AMD copyright year. -- Fixed dgmm, geam test functions to set correct stride values. -- For functions ssyr2k and dsyr2k allow trans == rocblas_operation_conjugate_transpose. -- Fixed compilation error for clients-only build. - -##### Removed - -- Remove Navi12 (gfx1011) from fat binary. - -#### rocFFT - -rocFFT 1.0.17 for ROCm 5.2.0 - -##### Added - -- Packages for test and benchmark executables on all supported OSes using CPack. -- Added File/Folder Reorg Changes with backward compatibility support using ROCM-CMAKE wrapper functions. - -##### Changed - -- Improved reuse of twiddle memory between plans. -- Set a default load/store callback when only one callback - type is set via the API for improved performance. - -##### Optimizations - -- Introduced a new access pattern of lds (non-linear) and applied it on - sbcc kernels len 64 to get performance improvement. - -##### Fixed - -- Fixed plan creation failure in cases where SBCC kernels would need to write to non-unit-stride buffers. - -#### rocPRIM - -rocPRIM 2.10.14 for ROCm 5.2.0 - -##### Added - -- Packages for tests and benchmark executable on all supported OSes using CPack. -- Added File/Folder Reorg Changes and Enabled Backward compatibility support using wrapper headers. - -#### rocRAND - -rocRAND 2.10.14 for ROCm 5.2.0 - -##### Added - -- Backward compatibility for deprecated `#include <rocrand.h>` using wrapper header files. -- Packages for test and benchmark executables on all supported OSes using CPack. - -#### rocSOLVER - -rocSOLVER 3.18.0 for ROCm 5.2.0 - -##### Added - -- Partial eigenvalue decomposition routines: - - STEBZ - - STEIN -- Package generation for test and benchmark executables on all supported OSes using CPack. -- Added tests for multi-level logging -- Added tests for rocsolver-bench client -- File/Folder Reorg - - Added File/Folder Reorg Changes with backward compatibility support using ROCM-CMAKE wrapper functions. - -##### Fixed - -- Fixed compatibility with libfmt 8.1 - -#### rocSPARSE - -rocSPARSE 2.2.0 for ROCm 5.2.0 - -##### Added - -- batched SpMM for CSR, COO and Blocked ELL formats. -- Packages for test and benchmark executables on all supported OSes using CPack. -- Clients file importers and exporters. - -##### Improved - -- Clients code size reduction. -- Clients error handling. -- Clients benchmarking for performance tracking. - -##### Changed - -- Test adjustments due to roundoff errors. -- Fixing API calls compatiblity with rocPRIM. - -##### Known Issues - -- none - -#### rocThrust - -rocThrust 2.15.0 for ROCm 5.2.0 - -##### Added - -- Packages for tests and benchmark executable on all supported OSes using CPack. - -#### rocWMMA - -rocWMMA 0.7 for ROCm 5.2.0 - -##### Added - -- Added unit tests for DLRM kernels -- Added GEMM sample -- Added DLRM sample -- Added SGEMV sample -- Added unit tests for cooperative wmma load and stores -- Added unit tests for IOBarrier.h -- Added wmma load/ store tests for different matrix types (A, B and Accumulator) -- Added more block sizes 1, 2, 4, 8 to test MmaSyncMultiTest -- Added block sizes 4, 8 to test MmaSynMultiLdsTest -- Added support for wmma load / store layouts with block dimension greater than 64 -- Added IOShape structure to define the attributes of mapping and layouts for all wmma matrix types -- Added CI testing for rocWMMA - -##### Changed - -- Renamed wmma to rocwmma in cmake, header files and documentation -- Renamed library files -- Modified Layout.h to use different matrix offset calculations (base offset, incremental offset and cumulative offset) -- Opaque load/store continue to use incrementatl offsets as they fill the entire block -- Cooperative load/store use cumulative offsets as they fill only small portions for the entire block -- Increased Max split counts to 64 for cooperative load/store -- Moved all the wmma definitions, API headers to rocwmma namespace -- Modified wmma fill unit tests to validate all matrix types (A, B, Accumulator) - -#### Tensile - -Tensile 4.33.0 for ROCm 5.2.0 - -##### Added - -- TensileUpdateLibrary for updating old library logic files -- Support for TensileRetuneLibrary to use sizes from separate file -- ZGEMM DirectToVgpr/DirectToLds/StoreCInUnroll/MIArchVgpr support -- Tests for denorm correctness -- Option to write different architectures to different TensileLibrary files - -##### Optimizations - -- Optimize MessagePackLoadLibraryFile by switching to fread -- DGEMM tail loop optimization for PrefetchAcrossPersistentMode=1/DirectToVgpr - -##### Changed - -- Alpha/beta datatype remains as F32 for HPA HGEMM -- Force assembly kernels to not flush denorms -- Use hipDeviceAttributePhysicalMultiProcessorCount as multiProcessorCount - -##### Fixed - -- Fix segmentation fault when run i8 datatype with TENSILE_DB=0x80 - -------------------- - -## ROCm 5.1.3 - - -### Library changes in ROCm 5.1.3 - -| Library | Version | -|---------|---------| -| hipBLAS | [0.50.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-5.1.3) | -| hipCUB | [2.11.0](https://github.com/ROCm/hipCUB/releases/tag/rocm-5.1.3) | -| hipFFT | [1.0.7](https://github.com/ROCm/hipFFT/releases/tag/rocm-5.1.3) | -| hipRAND | [2.10.13](https://github.com/ROCm/hipRAND/releases/tag/rocm-5.1.3) | -| hipSOLVER | [1.3.0](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-5.1.3) | -| hipSPARSE | [2.1.0](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-5.1.3) | -| MIVisionX | 2.1.0 ⇒ [2.2.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-5.1.3) | -| rccl | [2.11.4](https://github.com/ROCm/rccl/releases/tag/rocm-5.1.3) | -| rocALUTION | [2.0.2](https://github.com/ROCm/rocALUTION/releases/tag/rocm-5.1.3) | -| rocBLAS | [2.43.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-5.1.3) | -| rocFFT | [1.0.16](https://github.com/ROCm/rocFFT/releases/tag/rocm-5.1.3) | -| rocPRIM | [2.10.13](https://github.com/ROCm/rocPRIM/releases/tag/rocm-5.1.3) | -| rocRAND | [2.10.13](https://github.com/ROCm/rocRAND/releases/tag/rocm-5.1.3) | -| rocSOLVER | [3.17.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-5.1.3) | -| rocSPARSE | [2.1.0](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-5.1.3) | -| rocThrust | [2.14.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-5.1.3) | -| Tensile | [4.32.0](https://github.com/ROCm/Tensile/releases/tag/rocm-5.1.3) | - -#### MIVisionX - -MIVisionX for ROCm 5.1.3 - -##### Added - -* - -##### Optimizations - -* - -##### Changed - -* DockerFiles - Updates to install ROCm 5.1.1 Plus - -##### Fixed - -* - -##### Tested Configurations - -* Windows `10` / `11` -* Linux distribution - + Ubuntu - `18.04` / `20.04` - + CentOS - `7` / `8` - + SLES - `15-SP2` -* ROCm: rocm-core - `5.1.1.50101-48 ` -* miopen-hip - `2.16.0.50101-48` -* miopen-opencl - `2.16.0.50101-48` -* migraphx - `2.1.0.50101-48` -* Protobuf - [V3.12.0](https://github.com/protocolbuffers/protobuf/releases/tag/v3.12.0) -* OpenCV - [4.5.5](https://github.com/opencv/opencv/releases/tag/4.5.5) -* RPP - [0.93](https://github.com/GPUOpen-ProfessionalCompute-Libraries/rpp/releases/tag/0.93) -* FFMPEG - [n4.0.4](https://github.com/FFmpeg/FFmpeg/releases/tag/n4.0.4) -* Dependencies for all the above packages -* MIVisionX Setup Script - `V2.3.0` - -##### Known Issues - -* - -##### Mivisionx Dependency Map - -**Docker Image:** `sudo docker build -f docker/ubuntu20/{DOCKER_LEVEL_FILE_NAME}.dockerfile -t {mivisionx-level-NUMBER} .` - -- ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `new component added to the level` -- ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `existing component from the previous level` - -| Build Level | MIVisionX Dependencies | Modules | Libraries and Executables | Docker Tag | -| ----------- | -------------------------------------------------- | ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Level_1` | cmake <br> gcc <br> g++ | amd_openvx <br> utilities | ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `libopenvx.so` - OpenVX&trade; Lib - CPU <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `libvxu.so` - OpenVX&trade; immediate node Lib - CPU <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `runvx` - OpenVX&trade; Graph Executor - CPU with Display OFF | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-1?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_2` | ROCm OpenCL <br> +Level 1 | amd_openvx <br> amd_openvx_extensions <br> utilities | ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `libopenvx.so` - OpenVX&trade; Lib - CPU/GPU <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `libvxu.so` - OpenVX&trade; immediate node Lib - CPU/GPU <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `libvx_loomsl.so` - Loom 360 Stitch Lib <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `loom_shell` - 360 Stitch App <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `runcl` - OpenCL&trade; program debug App <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `runvx` - OpenVX&trade; Graph Executor - Display OFF | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-2?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_3` | OpenCV <br> FFMPEG <br> +Level 2 | amd_openvx <br> amd_openvx_extensions <br> utilities | ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libopenvx.so` - OpenVX&trade; Lib <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libvxu.so` - OpenVX&trade; immediate node Lib <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libvx_loomsl.so` - Loom 360 Stitch Lib <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `loom_shell` - 360 Stitch App <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `runcl` - OpenCL&trade; program debug App <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `libvx_amd_media.so` - OpenVX&trade; Media Extension <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `libvx_opencv.so` - OpenVX&trade; OpenCV InterOp Extension <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `mv_compile` - Neural Net Model Compile <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `runvx` - OpenVX&trade; Graph Executor - Display ON | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-3?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_4` | MIOpenGEMM <br> MIOpen <br> ProtoBuf <br> +Level 3 | amd_openvx <br> amd_openvx_extensions <br> apps <br> utilities | ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libopenvx.so` - OpenVX&trade; Lib <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libvxu.so` - OpenVX&trade; immediate node Lib <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libvx_loomsl.so` - Loom 360 Stitch Lib <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `loom_shell` - 360 Stitch App <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libvx_amd_media.so` - OpenVX&trade; Media Extension <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libvx_opencv.so` - OpenVX&trade; OpenCV InterOp Extension <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `mv_compile` - Neural Net Model Compile <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `runcl` - OpenCL&trade; program debug App <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `runvx` - OpenVX&trade; Graph Executor - Display ON <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `libvx_nn.so` - OpenVX&trade; Neural Net Extension <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `inference_server_app` - Cloud Inference App | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-4?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_5` | AMD_RPP <br> rocAL deps <br> +Level 4 | amd_openvx <br> amd_openvx_extensions <br> apps <br> rocAL <br> utilities | ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libopenvx.so` - OpenVX&trade; Lib <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libvxu.so` - OpenVX&trade; immediate node Lib <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libvx_loomsl.so` - Loom 360 Stitch Lib <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `loom_shell` - 360 Stitch App <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libvx_amd_media.so` - OpenVX&trade; Media Extension <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libvx_opencv.so` - OpenVX&trade; OpenCV InterOp Extension <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `mv_compile` - Neural Net Model Compile <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `runcl` - OpenCL&trade; program debug App <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `runvx` - OpenVX&trade; Graph Executor - Display ON <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libvx_nn.so` - OpenVX&trade; Neural Net Extension <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `inference_server_app` - Cloud Inference App <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `libvx_rpp.so` - OpenVX&trade; RPP Extension <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `librali.so` - Radeon Augmentation Library <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `rali_pybind.so` - rocAL Pybind Lib | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-5?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | - -------------------- - -## ROCm 5.1.1 - - -### Library changes in ROCm 5.1.1 - -| Library | Version | -|---------|---------| -| hipBLAS | [0.50.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-5.1.1) | -| hipCUB | [2.11.0](https://github.com/ROCm/hipCUB/releases/tag/rocm-5.1.1) | -| hipFFT | [1.0.7](https://github.com/ROCm/hipFFT/releases/tag/rocm-5.1.1) | -| hipRAND | [2.10.13](https://github.com/ROCm/hipRAND/releases/tag/rocm-5.1.1) | -| hipSOLVER | [1.3.0](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-5.1.1) | -| hipSPARSE | [2.1.0](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-5.1.1) | -| MIVisionX | [2.1.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-5.1.1) | -| rccl | [2.11.4](https://github.com/ROCm/rccl/releases/tag/rocm-5.1.1) | -| rocALUTION | [2.0.2](https://github.com/ROCm/rocALUTION/releases/tag/rocm-5.1.1) | -| rocBLAS | [2.43.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-5.1.1) | -| rocFFT | [1.0.16](https://github.com/ROCm/rocFFT/releases/tag/rocm-5.1.1) | -| rocPRIM | [2.10.13](https://github.com/ROCm/rocPRIM/releases/tag/rocm-5.1.1) | -| rocRAND | [2.10.13](https://github.com/ROCm/rocRAND/releases/tag/rocm-5.1.1) | -| rocSOLVER | [3.17.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-5.1.1) | -| rocSPARSE | [2.1.0](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-5.1.1) | -| rocThrust | [2.14.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-5.1.1) | -| Tensile | [4.32.0](https://github.com/ROCm/Tensile/releases/tag/rocm-5.1.1) | - -------------------- - -## ROCm 5.1.0 - - -### What's new in this release - -#### HIP enhancements - -The ROCm v5.1 release consists of the following HIP enhancements. - -##### HIP installation guide updates - -The HIP installation guide now includes information on installing and building HIP from source on -AMD and NVIDIA platforms. - -Refer to the HIP Installation Guide v5.1 for more details. - -##### Support for HIP graph - -ROCm v5.1 extends support for HIP Graph. - -##### Planned changes for HIP in future releases - -###### Separation of hiprtc (libhiprtc) library from hip runtime (amdhip64) - -On ROCm/Linux, to maintain backward compatibility, the hipruntime library (amdhip64) will continue -to include hiprtc symbols in future releases. The backward compatible support may be discontinued by -removing hiprtc symbols from the hipruntime library (amdhip64) in the next major release. - -###### hipDeviceProp_t structure enhancements - -Changes to the hipDeviceProp_t structure in the next major release may result in backward -incompatibility. More details on these changes will be provided in subsequent releases. - -#### ROCDebugger enhancements - -##### Multi-language source-level debugger - -The compiler now generates a source-level variable and function argument debug information. - -The accuracy is guaranteed if the compiler options `-g -O0` are used and apply only to HIP. - -This enhancement enables ROCDebugger users to interact with the HIP source-level variables and -function arguments. - -:::{note} -The newly-suggested compiler -g option must be used instead of the previously-suggested `-ggdb` -option. Although the effect of these two options is currently equivalent, this is not guaranteed for the -future, as changes might be made by the upstream LLVM community. -::: - -##### Machine interface lanes support - -ROCDebugger Machine Interface (MI) extends support to lanes, which includes the following -enhancements: - -* Added a new -lane-info command, listing the current thread's lanes. - -* The -thread-select command now supports a lane switch to switch to a specific lane of a thread: - - ```sh - -thread-select -l LANE THREAD - ``` - -* The =thread-selected notification gained a lane-id attribute. This enables the frontend to know which - lane of the thread was selected. - -* The *stopped asynchronous record gained lane-id and hit-lanes attributes. The former indicates - which lane is selected, and the latter indicates which lanes explain the stop. - -* MI commands now accept a global --lane option, similar to the global --thread and --frame options. - -* MI varobjs are now lane-aware. - -For more information, refer to the ROC Debugger User Guide at {doc}`ROCgdb `. - -##### Enhanced - clone-inferior command - -The clone-inferior command now ensures that the TTY, CMD, ARGS, and AMDGPU PRECISE-MEMORY -settings are copied from the original inferior to the new one. All modifications to the environment -variables done using the 'set environment' or 'unset environment' commands are also copied to the -new inferior. - -#### MIOpen support for RDNA GPUs - -This release includes support for AMD Radeon™ Pro W6800, in addition to other bug fixes and -performance improvements as listed below: - -* MIOpen now supports RDNA GPUs!! (via MIOpen PRs 973, 780, 764, 740, 739, 677, 660, 653, 493, 498) - -* Fixed a correctness issue with ImplicitGemm algorithm - -* Updated the performance data for new kernel versions - -* Improved MIOpen build time by splitting large kernel header files - -* Fixed an issue in reduction kernels for padded tensors - -* Various other bug fixes and performance improvements - -For more information, see {doc}`Documentation `. - -#### Checkpoint restore support with CRIU - -The new Checkpoint Restore in Userspace (CRIU) functionality is implemented to support AMD GPU -and ROCm applications. - -CRIU is a userspace tool to Checkpoint and Restore an application. - -CRIU lacked the support for checkpoint restore applications that used device files such as a GPU. With -this ROCm release, CRIU is enhanced with a new plugin to support AMD GPUs, which includes: - -* Single and Multi GPU systems (Gfx9) -* Checkpoint / Restore on a different system -* Checkpoint / Restore inside a docker container -* PyTorch -* TensorFlow -* Using CRIU Image Streamer - -For more information, refer to - - -:::{note} -The CRIU plugin (amdgpu_plugin) is merged upstream with the CRIU repository. The KFD kernel -patches are also available upstream with the amd-staging-drm-next branch (public) and the ROCm 5.1 -release branch. -::: - -:::{note} -This is a Beta release of the Checkpoint and Restore functionality, and some features are not available -in this release. -::: - -For more information, refer to the following websites: - -* - -* - -### Defect fixes - -The following defects are fixed in this release. - -#### Driver fails to load after installation - -The issue with the driver failing to load after ROCm installation is now fixed. - -The driver installs successfully, and the server reboots with working rocminfo and clinfo. - -#### ROCDebugger defect fixes - -##### Breakpoints in GPU kernel code before kernel is loaded - -Previously, setting a breakpoint in device code by line number before the device code was loaded into -the program resulted in ROCgdb incorrectly moving the breakpoint to the first following line that -contains host code. - -Now, the breakpoint is left pending. When the GPU kernel gets loaded, the breakpoint resolves to a -location in the kernel. - -##### Registers invalidated after write - -Previously, the stale just-written value was presented as a current value. - -ROCgdb now invalidates the cached values of registers whose content might differ after being written. -For example, registers with read-only bits. - -ROCgdb also invalidates all volatile registers when a volatile register is written. For example, writing -VCC invalidates the content of STATUS as STATUS.VCCZ may change. - -##### Scheduler-locking and GPU wavefronts - -When scheduler-locking is in effect, new wavefronts created by a resumed thread, CPU, or GPU -wavefront, are held in the halt state. For example, the "set scheduler-locking" command. - -##### ROCDebugger fails before completion of kernel execution - -It was possible (although erroneous) for a debugger to load GPU code in memory, send it to the -device, start executing a kernel on the device, and dispose of the original code before the kernel had -finished execution. If a breakpoint was hit after this point, the debugger failed with an internal error -while trying to access the debug information. - -This issue is now fixed by ensuring that the debugger keeps a local copy of the original code and -debug information. - -### Known issues - -#### Random memory access fault errors observed while running math libraries unit tests - -**Issue:** Random memory access fault issues are observed while running Math libraries unit tests. -This issue is encountered in ROCm v5.0, ROCm v5.0.1, and ROCm v5.0.2. - -Note, the faults only occur in the SRIOV environment. - -**Workaround:** Use SDMA to update the page table. The Guest set up steps are as follows: - -```sh -sudo modprobe amdgpu vm_update_mode=0 -``` - -To verify, use - -**Guest:** - -```sh -cat /sys/module/amdgpu/parameters/vm_update_mode 0 -``` - -Where expectation is 0. - -#### CU masking causes application to freeze - -Using CU Masking results in an application freeze or runs exceptionally slowly. This issue is noticed -only in the GFX10 suite of products. Note, this issue is observed only in GFX10 suite of products. - -This issue is under active investigation at this time. - -#### Failed checkpoint in Docker containers - -A defect with Ubuntu images kernel-5.13-30-generic and kernel-5.13-35-generic with Overlay FS -results in incorrect reporting of the mount ID. - -This issue with Ubuntu causes CRIU checkpointing to fail in Docker containers. - -As a workaround, use an older version of the kernel. For example, Ubuntu 5.11.0-46-generic. - -#### Issue with restoring workloads using cooperative groups feature - -Workloads that use the cooperative groups function to ensure all waves can be resident at the same -time may fail to restore correctly. This issue is under investigation and will be fixed in a future release. - -#### Radeon Pro V620 and W6800 workstation GPUs - -##### No support for ROCDebugger on SRIOV - -ROCDebugger is not supported in the SRIOV environment on any GPU. - -This is a known issue and will be fixed in a future release. - -#### Random error messages in ROCm SMI for SR-IOV - -Random error messages are generated by unsupported functions or commands. - -This is a known issue and will be fixed in a future release. - -### Library changes in ROCm 5.1.0 - -| Library | Version | -|---------|---------| -| hipBLAS | 0.49.0 ⇒ [0.50.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-5.1.0) | -| hipCUB | 2.10.13 ⇒ [2.11.0](https://github.com/ROCm/hipCUB/releases/tag/rocm-5.1.0) | -| hipFFT | 1.0.4 ⇒ [1.0.7](https://github.com/ROCm/hipFFT/releases/tag/rocm-5.1.0) | -| hipRAND | [2.10.13](https://github.com/ROCm/hipRAND/releases/tag/rocm-5.1.0) | -| hipSOLVER | 1.2.0 ⇒ [1.3.0](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-5.1.0) | -| hipSPARSE | 2.0.0 ⇒ [2.1.0](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-5.1.0) | -| MIVisionX | [2.1.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-5.1.0) | -| rccl | 2.10.3 ⇒ [2.11.4](https://github.com/ROCm/rccl/releases/tag/rocm-5.1.0) | -| rocALUTION | 2.0.1 ⇒ [2.0.2](https://github.com/ROCm/rocALUTION/releases/tag/rocm-5.1.0) | -| rocBLAS | 2.42.0 ⇒ [2.43.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-5.1.0) | -| rocFFT | 1.0.13 ⇒ [1.0.16](https://github.com/ROCm/rocFFT/releases/tag/rocm-5.1.0) | -| rocPRIM | 2.10.12 ⇒ [2.10.13](https://github.com/ROCm/rocPRIM/releases/tag/rocm-5.1.0) | -| rocRAND | 2.10.12 ⇒ [2.10.13](https://github.com/ROCm/rocRAND/releases/tag/rocm-5.1.0) | -| rocSOLVER | 3.16.0 ⇒ [3.17.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-5.1.0) | -| rocSPARSE | 2.0.0 ⇒ [2.1.0](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-5.1.0) | -| rocThrust | 2.13.0 ⇒ [2.14.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-5.1.0) | -| Tensile | 4.31.0 ⇒ [4.32.0](https://github.com/ROCm/Tensile/releases/tag/rocm-5.1.0) | - -#### hipBLAS - -hipBLAS 0.50.0 for ROCm 5.1.0 - -##### Added - -- Added library version and device information to hipblas-test output -- Added --rocsolver-path command line option to choose path to pre-built rocSOLVER, as - absolute or relative path -- Added --cmake_install command line option to update cmake to minimum version if required -- Added cmake-arg parameter to pass in cmake arguments while building -- Added infrastructure to support readthedocs hipBLAS documentation. - -##### Fixed - -- Added hipblasVersionMinor define. hipblaseVersionMinor remains defined - for backwards compatibility. -- Doxygen warnings in hipblas.h header file. - -##### Changed - -- rocblas-path command line option can be specified as either absolute or relative path -- Help message improvements in install.sh and rmake.py -- Updated googletest dependency from 1.10.0 to 1.11.0 - -#### hipCUB - -hipCUB 2.11.0 for ROCm 5.1.0 - -##### Added - -- Device segmented sort -- Warp merge sort, WarpMask and thread sort from cub 1.15.0 supported in hipCUB -- Device three way partition - -##### Changed - -- Device_scan and device_segmented_scan: inclusive_scan now uses the input-type as accumulator-type, exclusive_scan uses initial-value-type. - - This particularly changes behaviour of small-size input types with large-size output types (e.g. short input, int output). - - And low-res input with high-res output (e.g. float input, double output) - - Block merge sort no longer supports non power of two blocksizes - -#### hipFFT - -hipFFT 1.0.7 for ROCm 5.1.0 - -##### Changed - -- Use fft_params struct for accuracy and benchmark clients. - -#### hipRAND - -hipRAND 2.10.13 for ROCm 5.1.0 - -##### Changed - -- Header file installation location changed to match other libraries. - - Using the `hiprand.h` header file should now use `#include <hiprand/hiprand.h>`, rather than `#include <hiprand.h>` - - Symlinks are included for backwards compatibility - -#### hipSOLVER - -hipSOLVER 1.3.0 for ROCm 5.1.0 - -##### Added - -- Added functions - - gels - - hipsolverSSgels_bufferSize, hipsolverDDgels_bufferSize, hipsolverCCgels_bufferSize, hipsolverZZgels_bufferSize - - hipsolverSSgels, hipsolverDDgels, hipsolverCCgels, hipsolverZZgels -- Added library version and device information to hipsolver-test output. -- Added compatibility API with hipsolverDn prefix. -- Added compatibility-only functions - - gesvdj - - hipsolverDnSgesvdj_bufferSize, hipsolverDnDgesvdj_bufferSize, hipsolverDnCgesvdj_bufferSize, hipsolverDnZgesvdj_bufferSize - - hipsolverDnSgesvdj, hipsolverDnDgesvdj, hipsolverDnCgesvdj, hipsolverDnZgesvdj - - gesvdjBatched - - hipsolverDnSgesvdjBatched_bufferSize, hipsolverDnDgesvdjBatched_bufferSize, hipsolverDnCgesvdjBatched_bufferSize, hipsolverDnZgesvdjBatched_bufferSize - - hipsolverDnSgesvdjBatched, hipsolverDnDgesvdjBatched, hipsolverDnCgesvdjBatched, hipsolverDnZgesvdjBatched - - syevj - - hipsolverDnSsyevj_bufferSize, hipsolverDnDsyevj_bufferSize, hipsolverDnCheevj_bufferSize, hipsolverDnZheevj_bufferSize - - hipsolverDnSsyevj, hipsolverDnDsyevj, hipsolverDnCheevj, hipsolverDnZheevj - - syevjBatched - - hipsolverDnSsyevjBatched_bufferSize, hipsolverDnDsyevjBatched_bufferSize, hipsolverDnCheevjBatched_bufferSize, hipsolverDnZheevjBatched_bufferSize - - hipsolverDnSsyevjBatched, hipsolverDnDsyevjBatched, hipsolverDnCheevjBatched, hipsolverDnZheevjBatched - - sygvj - - hipsolverDnSsygvj_bufferSize, hipsolverDnDsygvj_bufferSize, hipsolverDnChegvj_bufferSize, hipsolverDnZhegvj_bufferSize - - hipsolverDnSsygvj, hipsolverDnDsygvj, hipsolverDnChegvj, hipsolverDnZhegvj - -##### Changed - -- The rocSOLVER backend now allows hipsolverXXgels and hipsolverXXgesv to be called in-place when B == X. -- The rocSOLVER backend now allows rwork to be passed as a null pointer to hipsolverXgesvd. - -##### Fixed - -- bufferSize functions will now return HIPSOLVER_STATUS_NOT_INITIALIZED instead of HIPSOLVER_STATUS_INVALID_VALUE when both handle and lwork are null. -- Fixed rare memory allocation failure in syevd/heevd and sygvd/hegvd caused by improper workspace array allocation outside of rocSOLVER. - -#### hipSPARSE - -hipSPARSE 2.1.0 for ROCm 5.1.0 - -##### Added - -- Added gtsv_interleaved_batch and gpsv_interleaved_batch routines -- Add SpGEMM_reuse - -##### Changed - -- Changed BUILD_CUDA with USE_CUDA in install script and cmake files -- Update googletest to 11.1 - -##### Improved - -- Fixed a bug in SpMM Alg versioning - -##### Known Issues - -- none - -#### rccl - -RCCL 2.11.4 for ROCm 5.1.0 - -##### Added - -- Compatibility with NCCL 2.11.4 - -##### Known Issues - -- Managed memory is not currently supported for clique-based kernels - -#### rocALUTION - -rocALUTION 2.0.2 for ROCm 5.1.0 - -##### Added - -- Added out-of-place matrix transpose functionality -- Added LocalVector<bool> - -#### rocBLAS - -rocBLAS 2.43.0 for ROCm 5.1.0 - -##### Added - -- Option to install script for number of jobs to use for rocBLAS and Tensile compilation (-j, --jobs) -- Option to install script to build clients without using any Fortran (--clients_no_fortran) -- rocblas_client_initialize function, to perform rocBLAS initialize for clients(benchmark/test) and report the execution time. -- Added tests for output of reduction functions when given bad input -- Added user specified initialization (rand_int/trig_float/hpl) for initializing matrices and vectors in rocblas-bench - -##### Optimizations - -- Improved performance of trsm with side == left and n == 1 -- Improved perforamnce of trsm with side == left and m <= 32 along with side == right and n <= 32 - -##### Changed - -- For syrkx and trmm internal API use rocblas_stride datatype for offset -- For non-batched and batched gemm_ex functions if the C matrix pointer equals the D matrix pointer (aliased) their respective type and leading dimension arguments must now match -- Test client dependencies updated to GTest 1.11 -- non-global false positives reported by cppcheck from file based suppression to inline suppression. File based suppression will only be used for global false positives. -- Help menu messages in install.sh -- For ger function, typecast the 'lda'(offset) datatype to size_t during offset calculation to avoid overflow and remove duplicate template functions. -- Modified default initialization from rand_int to hpl for initializing matrices and vectors in rocblas-bench - -##### Fixed - -- For function trmv (non-transposed cases) avoid overflow in offset calculation -- Fixed cppcheck errors/warnings -- Fixed doxygen warnings - -#### rocFFT - -rocFFT 1.0.16 for ROCm 5.1.0 - -##### Changed - -- Supported unaligned tile dimension for SBRC_2D kernels. -- Improved (more RAII) test and benchmark infrastructure. -- Enabled runtime compilation of length-2304 FFT kernel during plan creation. - -##### Optimizations - -- Optimized more large 1D cases by using L1D_CC plan. -- Optimized 3D 200^3 C2R case. -- Optimized 1D 2^30 double precision on MI200. - -##### Fixed - -- Fixed correctness of some R2C transforms with unusual strides. - -##### Removed - -- The hipFFT API (header) has been removed from after a long deprecation period. Please use the [hipFFT](https://github.com/ROCmSoftwarePlatform/hipFFT) package/repository to obtain the hipFFT API. - -#### rocPRIM - -rocPRIM 2.10.13 for ROCm 5.1.0 - -##### Fixed - -- Fixed radix sort int64_t bug introduced in [2.10.11] - -##### Added - -- Future value -- Added device partition_three_way to partition input to three output iterators based on two predicates - -##### Changed - -- The reduce/scan algorithm precision issues in the tests has been resolved for half types. - -##### Known Issues - -- device_segmented_radix_sort unit test failing for HIP on Windows - -#### rocRAND - -rocRAND 2.10.13 for ROCm 5.1.0 - -##### Added - -- Generating a random sequence different sizes now produces the same sequence without gaps - indepent of how many values are generated per call. - - Only in the case of XORWOW, MRG32K3A, PHILOX4X32_10, SOBOL32 and SOBOL64 - - This only holds true if the size in each call is a divisor of the distributions - `output_width` due to performance - - Similarly the output pointer has to be aligned to `output_width * sizeof(output_type)` - -##### Changed - -- [hipRAND](https://github.com/ROCmSoftwarePlatform/hipRAND.git) split into a separate package -- Header file installation location changed to match other libraries. - - Using the `rocrand.h` header file should now use `#include <rocrand/rocrand.h>`, rather than `#include <rocrand/rocrand.h>` -- rocRAND still includes hipRAND using a submodule - - The rocRAND package also sets the provides field with hipRAND, so projects which require hipRAND can begin to specify it. - -##### Fixed - -- Fix offset behaviour for XORWOW, MRG32K3A and PHILOX4X32_10 generator, setting offset now - correctly generates the same sequence starting from the offset. - - Only uniform int and float will work as these can be generated with a single call to the generator - -##### Known Issues - -- kernel_xorwow unit test is failing for certain GPU architectures. - -#### rocSOLVER - -rocSOLVER 3.17.0 for ROCm 5.1.0 - -##### Optimized - -- Optimized non-pivoting and batch cases of the LU factorization - -##### Fixed - -- Fixed missing synchronization in SYTRF with `rocblas_fill_lower` that could potentially - result in incorrect pivot values. -- Fixed multi-level logging output to file with the `ROCSOLVER_LOG_PATH`, - `ROCSOLVER_LOG_TRACE_PATH`, `ROCSOLVER_LOG_BENCH_PATH` and `ROCSOLVER_LOG_PROFILE_PATH` - environment variables. -- Fixed performance regression in the batched LU factorization of tiny matrices - -#### rocSPARSE - -rocSPARSE 2.1.0 for ROCm 5.1.0 - -##### Added - -- gtsv_interleaved_batch -- gpsv_interleaved_batch -- SpGEMM_reuse -- Allow copying of mat info struct - -##### Improved - -- Optimization for SDDMM -- Allow unsorted matrices in csrgemm multipass algorithm - -##### Known Issues - -- none - -#### rocThrust - -rocThrust 2.14.0 for ROCm 5.1.0 - -##### Added - -- Updated to match upstream Thrust 1.15.0 - -##### Known Issues - -- async_copy, partition, and stable_sort_by_key unit tests are failing on HIP on Windows. - -#### Tensile - -Tensile 4.32.0 for ROCm 5.1.0 - -##### Added - -- Better control of parallelism to control memory usage -- Support for multiprocessing on Windows for TensileCreateLibrary -- New JSD metric and metric selection functionality -- Initial changes to support two-tier solution selection - -##### Optimized - -- Optimized runtime of TensileCreateLibraries by reducing max RAM usage -- StoreCInUnroll additional optimizations plus adaptive K support -- DGEMM NN optimizations with PrefetchGlobalRead(PGR)=2 support - -##### Changed - -- Update Googletest to 1.11.0 - -##### Removed - -- Remove no longer supported benchmarking steps - -------------------- - -## ROCm 5.0.2 - -### Defect fixes - -The following defects are fixed in the ROCm v5.0.2 release. - -#### Issue with hostcall facility in HIP runtime - -In ROCm v5.0, when using the “assert()” call in a HIP kernel, the compiler may sometimes fail to emit -kernel metadata related to the hostcall facility, which results in incomplete initialization of the hostcall -facility in the HIP runtime. This can cause the HIP kernel to crash when it attempts to execute the -“assert()” call. - -The root cause was an incorrect check in the compiler to determine whether the hostcall facility is -required by the kernel. This is fixed in the ROCm v5.0.2 release. - -The resolution includes a compiler change, which emits the required metadata by default, unless the -compiler can prove that the hostcall facility is not required by the kernel. This ensures that the -“assert()” call never fails. - -:::{note} -This fix may lead to breakage in some OpenMP offload use cases, which use print inside a target region -and result in an abort in device code. The issue will be fixed in a future release. -::: - -The compatibility matrix in the [Deep-learning guide](./how-to/deep-learning-rocm.md) is updated for -ROCm v5.0.2. - -### Library changes in ROCm 5.0.2 - -| Library | Version | -|---------|---------| -| hipBLAS | [0.49.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-5.0.2) | -| hipCUB | [2.10.13](https://github.com/ROCm/hipCUB/releases/tag/rocm-5.0.2) | -| hipFFT | [1.0.4](https://github.com/ROCm/hipFFT/releases/tag/rocm-5.0.2) | -| hipSOLVER | [1.2.0](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-5.0.2) | -| hipSPARSE | [2.0.0](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-5.0.2) | -| MIVisionX | 2.0.1 ⇒ [2.1.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-5.0.2) | -| rccl | [2.10.3](https://github.com/ROCm/rccl/releases/tag/rocm-5.0.2) | -| rocALUTION | [2.0.1](https://github.com/ROCm/rocALUTION/releases/tag/rocm-5.0.2) | -| rocBLAS | [2.42.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-5.0.2) | -| rocFFT | [1.0.13](https://github.com/ROCm/rocFFT/releases/tag/rocm-5.0.2) | -| rocPRIM | [2.10.12](https://github.com/ROCm/rocPRIM/releases/tag/rocm-5.0.2) | -| rocRAND | [2.10.12](https://github.com/ROCm/rocRAND/releases/tag/rocm-5.0.2) | -| rocSOLVER | [3.16.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-5.0.2) | -| rocSPARSE | [2.0.0](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-5.0.2) | -| rocThrust | [2.13.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-5.0.2) | -| Tensile | [4.31.0](https://github.com/ROCm/Tensile/releases/tag/rocm-5.0.2) | - -#### MIVisionX - -MIVisionX for ROCm 5.0.2 - -##### Added - -* New Tests - AMD_MEDIA - -##### Optimizations - -* Readme Updates -* HIP Buffer Transfer - Eliminate cupy usage - -##### Changed - -* **Backend** - Default Backend set to `HIP` - -##### Fixed - -* Minor bugs and warnings -* AMD_MEDIA - Bug Fixes - -##### Tested Configurations - -* Windows 10 -* Linux distribution - + Ubuntu - `18.04` / `20.04` - + CentOS - `7` / `8` - + SLES - `15-SP2` -* ROCm: rocm-dev - `4.5.2.40502-164` -* rocm-cmake - [rocm-4.2.0](https://github.com/RadeonOpenCompute/rocm-cmake/releases/tag/rocm-4.2.0) -* MIOpenGEMM - [1.1.5](https://github.com/ROCmSoftwarePlatform/MIOpenGEMM/releases/tag/1.1.5) -* MIOpen - [2.14.0](https://github.com/ROCmSoftwarePlatform/MIOpen/releases/tag/2.14.0) -* Protobuf - [V3.12.0](https://github.com/protocolbuffers/protobuf/releases/tag/v3.12.0) -* OpenCV - [4.5.5](https://github.com/opencv/opencv/releases/tag/4.5.5) -* RPP - [0.92](https://github.com/GPUOpen-ProfessionalCompute-Libraries/rpp/releases/tag/0.92) -* FFMPEG - [n4.0.4](https://github.com/FFmpeg/FFmpeg/releases/tag/n4.0.4) -* Dependencies for all the above packages -* MIVisionX Setup Script - `V2.0.0` - -##### Known Issues - -* `TBD` - -##### Mivisionx Dependency Map - -**Docker Image:** `sudo docker build -f docker/ubuntu20/{DOCKER_LEVEL_FILE_NAME}.dockerfile -t {mivisionx-level-NUMBER} .` - -- ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `new component added to the level` -- ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `existing component from the previous level` - -| Build Level | MIVisionX Dependencies | Modules | Libraries and Executables | Docker Tag | -| ----------- | -------------------------------------------------- | ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Level_1` | cmake <br> gcc <br> g++ | amd_openvx <br> utilities | ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `libopenvx.so` - OpenVX&trade; Lib - CPU <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `libvxu.so` - OpenVX&trade; immediate node Lib - CPU <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `runvx` - OpenVX&trade; Graph Executor - CPU with Display OFF | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-1?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_2` | ROCm OpenCL <br> +Level 1 | amd_openvx <br> amd_openvx_extensions <br> utilities | ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `libopenvx.so` - OpenVX&trade; Lib - CPU/GPU <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `libvxu.so` - OpenVX&trade; immediate node Lib - CPU/GPU <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `libvx_loomsl.so` - Loom 360 Stitch Lib <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `loom_shell` - 360 Stitch App <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `runcl` - OpenCL&trade; program debug App <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `runvx` - OpenVX&trade; Graph Executor - Display OFF | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-2?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_3` | OpenCV <br> FFMPEG <br> +Level 2 | amd_openvx <br> amd_openvx_extensions <br> utilities | ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libopenvx.so` - OpenVX&trade; Lib <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libvxu.so` - OpenVX&trade; immediate node Lib <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libvx_loomsl.so` - Loom 360 Stitch Lib <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `loom_shell` - 360 Stitch App <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `runcl` - OpenCL&trade; program debug App <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `libvx_amd_media.so` - OpenVX&trade; Media Extension <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `libvx_opencv.so` - OpenVX&trade; OpenCV InterOp Extension <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `mv_compile` - Neural Net Model Compile <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `runvx` - OpenVX&trade; Graph Executor - Display ON | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-3?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_4` | MIOpenGEMM <br> MIOpen <br> ProtoBuf <br> +Level 3 | amd_openvx <br> amd_openvx_extensions <br> apps <br> utilities | ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libopenvx.so` - OpenVX&trade; Lib <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libvxu.so` - OpenVX&trade; immediate node Lib <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libvx_loomsl.so` - Loom 360 Stitch Lib <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `loom_shell` - 360 Stitch App <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libvx_amd_media.so` - OpenVX&trade; Media Extension <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libvx_opencv.so` - OpenVX&trade; OpenCV InterOp Extension <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `mv_compile` - Neural Net Model Compile <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `runcl` - OpenCL&trade; program debug App <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `runvx` - OpenVX&trade; Graph Executor - Display ON <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `libvx_nn.so` - OpenVX&trade; Neural Net Extension <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `inference_server_app` - Cloud Inference App | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-4?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | -| `Level_5` | AMD_RPP <br> rocAL deps <br> +Level 4 | amd_openvx <br> amd_openvx_extensions <br> apps <br> rocAL <br> utilities | ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libopenvx.so` - OpenVX&trade; Lib <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libvxu.so` - OpenVX&trade; immediate node Lib <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libvx_loomsl.so` - Loom 360 Stitch Lib <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `loom_shell` - 360 Stitch App <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libvx_amd_media.so` - OpenVX&trade; Media Extension <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libvx_opencv.so` - OpenVX&trade; OpenCV InterOp Extension <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `mv_compile` - Neural Net Model Compile <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `runcl` - OpenCL&trade; program debug App <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `runvx` - OpenVX&trade; Graph Executor - Display ON <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `libvx_nn.so` - OpenVX&trade; Neural Net Extension <br> ![#1589F0](https://via.placeholder.com/15/1589F0/000000?text=+) `inference_server_app` - Cloud Inference App <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `libvx_rpp.so` - OpenVX&trade; RPP Extension <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `librali.so` - Radeon Augmentation Library <br> ![#c5f015](https://via.placeholder.com/15/c5f015/000000?text=+) `rali_pybind.so` - rocAL Pybind Lib | [![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/kiritigowda/ubuntu-18.04/mivisionx-level-5?style=flat-square)](https://hub.docker.com/repository/docker/kiritigowda/ubuntu-18.04) | - -------------------- - -## ROCm 5.0.1 - -### Deprecations and warnings - -#### Refactor of HIPCC/HIPCONFIG - -In prior ROCm releases, by default, the hipcc/hipconfig Perl scripts were used to identify and set target -compiler options, target platform, compiler, and runtime appropriately. - -In ROCm v5.0.1, hipcc.bin and hipconfig.bin have been added as the compiled binary implementations -of the hipcc and hipconfig. These new binaries are currently a work-in-progress, considered, and -marked as experimental. ROCm plans to fully transition to hipcc.bin and hipconfig.bin in the a future -ROCm release. The existing hipcc and hipconfig Perl scripts are renamed to `hipcc.pl` and `hipconfig.pl` -respectively. New top-level hipcc and hipconfig Perl scripts are created, which can switch between the -Perl script or the compiled binary based on the environment variable `HIPCC_USE_PERL_SCRIPT`. - -In ROCm 5.0.1, by default, this environment variable is set to use hipcc and hipconfig through the Perl -scripts. - -Subsequent Perl scripts will no longer be available in ROCm in a future release. - -### Library changes in ROCm 5.0.1 - -| Library | Version | -|---------|---------| -| hipBLAS | [0.49.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-5.0.1) | -| hipCUB | [2.10.13](https://github.com/ROCm/hipCUB/releases/tag/rocm-5.0.1) | -| hipFFT | [1.0.4](https://github.com/ROCm/hipFFT/releases/tag/rocm-5.0.1) | -| hipSOLVER | [1.2.0](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-5.0.1) | -| hipSPARSE | [2.0.0](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-5.0.1) | -| MIVisionX | [2.0.1](https://github.com/ROCm/MIVisionX/releases/tag/rocm-5.0.1) | -| rccl | [2.10.3](https://github.com/ROCm/rccl/releases/tag/rocm-5.0.1) | -| rocALUTION | [2.0.1](https://github.com/ROCm/rocALUTION/releases/tag/rocm-5.0.1) | -| rocBLAS | [2.42.0](https://github.com/ROCm/rocBLAS/releases/tag/rocm-5.0.1) | -| rocFFT | [1.0.13](https://github.com/ROCm/rocFFT/releases/tag/rocm-5.0.1) | -| rocPRIM | [2.10.12](https://github.com/ROCm/rocPRIM/releases/tag/rocm-5.0.1) | -| rocRAND | [2.10.12](https://github.com/ROCm/rocRAND/releases/tag/rocm-5.0.1) | -| rocSOLVER | [3.16.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-5.0.1) | -| rocSPARSE | [2.0.0](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-5.0.1) | -| rocThrust | [2.13.0](https://github.com/ROCm/rocThrust/releases/tag/rocm-5.0.1) | -| Tensile | [4.31.0](https://github.com/ROCm/Tensile/releases/tag/rocm-5.0.1) | - -------------------- - -## ROCm 5.0.0 - - -### What's new in this release - -#### HIP enhancements - -The ROCm v5.0 release consists of the following HIP enhancements. - -##### HIP installation guide updates - -The HIP Installation Guide is updated to include building HIP from source on the NVIDIA platform. - -Refer to the HIP Installation Guide v5.0 for more details. - -##### Managed memory allocation - -Managed memory, including the `__managed__` keyword, is now supported in the HIP combined host/device compilation. Through unified memory allocation, managed memory allows data to be shared and accessible to both the CPU and GPU using a single pointer. The allocation is managed by the AMD GPU driver using the Linux Heterogeneous Memory Management (HMM) mechanism. The user can call managed memory API hipMallocManaged to allocate a large chunk of HMM memory, execute kernels on a device, and fetch data between the host and device as needed. - -:::{note} -In a HIP application, it is recommended to do a capability check before calling the managed memory APIs. For example, - - ```cpp - int managed_memory = 0; - HIPCHECK(hipDeviceGetAttribute(&managed_memory, - hipDeviceAttributeManagedMemory,p_gpuDevice)); - if (!managed_memory ) { - printf ("info: managed memory access not supported on the device %d\n Skipped\n", p_gpuDevice); - } - else { - HIPCHECK(hipSetDevice(p_gpuDevice)); - HIPCHECK(hipMallocManaged(&Hmm, N * sizeof(T))); - . . . - } - ``` -::: - -:::{note} -The managed memory capability check may not be necessary; however, if HMM is not supported, managed malloc will fall back to using system memory. Other managed memory API calls will, then, have -::: - -Refer to the HIP API documentation for more details on managed memory APIs. - -For the application, see - - - -#### New environment variable - -The following new environment variable is added in this release: - -| Environment Variable | Value | Description | -|----------------------|-----------------------|-------------| -| HSA_COOP_CU_COUNT | 0 or 1 (default is 0) | Some processors support more CUs than can reliably be used in a cooperative dispatch. Setting the environment variable HSA_COOP_CU_COUNT to 1 will cause ROCr to return the correct CU count for cooperative groups through the HSA_AMD_AGENT_INFO_COOPERATIVE_COMPUTE_UNIT_COUNT attribute of hsa_agent_get_info(). Setting HSA_COOP_CU_COUNT to other values, or leaving it unset, will cause ROCr to return the same CU count for the attributes HSA_AMD_AGENT_INFO_COOPERATIVE_COMPUTE_UNIT_COUNT and HSA_AMD_AGENT_INFO_COMPUTE_UNIT_COUNT. Future ROCm releases will make HSA_COOP_CU_COUNT=1 the default. | - -### Breaking changes - -#### Runtime breaking change - -Re-ordering of the enumerated type in hip_runtime_api.h to better match NV. See below for the difference in enumerated types. - -ROCm software will be affected if any of the defined enums listed below are used in the code. Applications built with ROCm v5.0 enumerated types will work with a ROCm 4.5.2 driver. However, an undefined behavior error will occur with a ROCm v4.5.2 application that uses these enumerated types with a ROCm 5.0 runtime. - -```diff -typedef enum hipDeviceAttribute_t { -- hipDeviceAttributeMaxThreadsPerBlock, ///< Maximum number of threads per block. -- hipDeviceAttributeMaxBlockDimX, ///< Maximum x-dimension of a block. -- hipDeviceAttributeMaxBlockDimY, ///< Maximum y-dimension of a block. -- hipDeviceAttributeMaxBlockDimZ, ///< Maximum z-dimension of a block. -- hipDeviceAttributeMaxGridDimX, ///< Maximum x-dimension of a grid. -- hipDeviceAttributeMaxGridDimY, ///< Maximum y-dimension of a grid. -- hipDeviceAttributeMaxGridDimZ, ///< Maximum z-dimension of a grid. -- hipDeviceAttributeMaxSharedMemoryPerBlock, ///< Maximum shared memory available per block in -- ///< bytes. -- hipDeviceAttributeTotalConstantMemory, ///< Constant memory size in bytes. -- hipDeviceAttributeWarpSize, ///< Warp size in threads. -- hipDeviceAttributeMaxRegistersPerBlock, ///< Maximum number of 32-bit registers available to a -- ///< thread block. This number is shared by all thread -- ///< blocks simultaneously resident on a -- ///< multiprocessor. -- hipDeviceAttributeClockRate, ///< Peak clock frequency in kilohertz. -- hipDeviceAttributeMemoryClockRate, ///< Peak memory clock frequency in kilohertz. -- hipDeviceAttributeMemoryBusWidth, ///< Global memory bus width in bits. -- hipDeviceAttributeMultiprocessorCount, ///< Number of multiprocessors on the device. -- hipDeviceAttributeComputeMode, ///< Compute mode that device is currently in. -- hipDeviceAttributeL2CacheSize, ///< Size of L2 cache in bytes. 0 if the device doesn't have L2 -- ///< cache. -- hipDeviceAttributeMaxThreadsPerMultiProcessor, ///< Maximum resident threads per -- ///< multiprocessor. -- hipDeviceAttributeComputeCapabilityMajor, ///< Major compute capability version number. -- hipDeviceAttributeComputeCapabilityMinor, ///< Minor compute capability version number. -- hipDeviceAttributeConcurrentKernels, ///< Device can possibly execute multiple kernels -- ///< concurrently. -- hipDeviceAttributePciBusId, ///< PCI Bus ID. -- hipDeviceAttributePciDeviceId, ///< PCI Device ID. -- hipDeviceAttributeMaxSharedMemoryPerMultiprocessor, ///< Maximum Shared Memory Per -- ///< Multiprocessor. -- hipDeviceAttributeIsMultiGpuBoard, ///< Multiple GPU devices. -- hipDeviceAttributeIntegrated, ///< iGPU -- hipDeviceAttributeCooperativeLaunch, ///< Support cooperative launch -- hipDeviceAttributeCooperativeMultiDeviceLaunch, ///< Support cooperative launch on multiple devices -- hipDeviceAttributeMaxTexture1DWidth, ///< Maximum number of elements in 1D images -- hipDeviceAttributeMaxTexture2DWidth, ///< Maximum dimension width of 2D images in image elements -- hipDeviceAttributeMaxTexture2DHeight, ///< Maximum dimension height of 2D images in image elements -- hipDeviceAttributeMaxTexture3DWidth, ///< Maximum dimension width of 3D images in image elements -- hipDeviceAttributeMaxTexture3DHeight, ///< Maximum dimensions height of 3D images in image elements -- hipDeviceAttributeMaxTexture3DDepth, ///< Maximum dimensions depth of 3D images in image elements -+ hipDeviceAttributeCudaCompatibleBegin = 0, - -- hipDeviceAttributeHdpMemFlushCntl, ///< Address of the HDP_MEM_COHERENCY_FLUSH_CNTL register -- hipDeviceAttributeHdpRegFlushCntl, ///< Address of the HDP_REG_COHERENCY_FLUSH_CNTL register -+ hipDeviceAttributeEccEnabled = hipDeviceAttributeCudaCompatibleBegin, ///< Whether ECC support is enabled. -+ hipDeviceAttributeAccessPolicyMaxWindowSize, ///< Cuda only. The maximum size of the window policy in bytes. -+ hipDeviceAttributeAsyncEngineCount, ///< Cuda only. Asynchronous engines number. -+ hipDeviceAttributeCanMapHostMemory, ///< Whether host memory can be mapped into device address space -+ hipDeviceAttributeCanUseHostPointerForRegisteredMem,///< Cuda only. Device can access host registered memory -+ ///< at the same virtual address as the CPU -+ hipDeviceAttributeClockRate, ///< Peak clock frequency in kilohertz. -+ hipDeviceAttributeComputeMode, ///< Compute mode that device is currently in. -+ hipDeviceAttributeComputePreemptionSupported, ///< Cuda only. Device supports Compute Preemption. -+ hipDeviceAttributeConcurrentKernels, ///< Device can possibly execute multiple kernels concurrently. -+ hipDeviceAttributeConcurrentManagedAccess, ///< Device can coherently access managed memory concurrently with the CPU -+ hipDeviceAttributeCooperativeLaunch, ///< Support cooperative launch -+ hipDeviceAttributeCooperativeMultiDeviceLaunch, ///< Support cooperative launch on multiple devices -+ hipDeviceAttributeDeviceOverlap, ///< Cuda only. Device can concurrently copy memory and execute a kernel. -+ ///< Deprecated. Use instead asyncEngineCount. -+ hipDeviceAttributeDirectManagedMemAccessFromHost, ///< Host can directly access managed memory on -+ ///< the device without migration -+ hipDeviceAttributeGlobalL1CacheSupported, ///< Cuda only. Device supports caching globals in L1 -+ hipDeviceAttributeHostNativeAtomicSupported, ///< Cuda only. Link between the device and the host supports native atomic operations -+ hipDeviceAttributeIntegrated, ///< Device is integrated GPU -+ hipDeviceAttributeIsMultiGpuBoard, ///< Multiple GPU devices. -+ hipDeviceAttributeKernelExecTimeout, ///< Run time limit for kernels executed on the device -+ hipDeviceAttributeL2CacheSize, ///< Size of L2 cache in bytes. 0 if the device doesn't have L2 cache. -+ hipDeviceAttributeLocalL1CacheSupported, ///< caching locals in L1 is supported -+ hipDeviceAttributeLuid, ///< Cuda only. 8-byte locally unique identifier in 8 bytes. Undefined on TCC and non-Windows platforms -+ hipDeviceAttributeLuidDeviceNodeMask, ///< Cuda only. Luid device node mask. Undefined on TCC and non-Windows platforms -+ hipDeviceAttributeComputeCapabilityMajor, ///< Major compute capability version number. -+ hipDeviceAttributeManagedMemory, ///< Device supports allocating managed memory on this system -+ hipDeviceAttributeMaxBlocksPerMultiProcessor, ///< Cuda only. Max block size per multiprocessor -+ hipDeviceAttributeMaxBlockDimX, ///< Max block size in width. -+ hipDeviceAttributeMaxBlockDimY, ///< Max block size in height. -+ hipDeviceAttributeMaxBlockDimZ, ///< Max block size in depth. -+ hipDeviceAttributeMaxGridDimX, ///< Max grid size in width. -+ hipDeviceAttributeMaxGridDimY, ///< Max grid size in height. -+ hipDeviceAttributeMaxGridDimZ, ///< Max grid size in depth. -+ hipDeviceAttributeMaxSurface1D, ///< Maximum size of 1D surface. -+ hipDeviceAttributeMaxSurface1DLayered, ///< Cuda only. Maximum dimensions of 1D layered surface. -+ hipDeviceAttributeMaxSurface2D, ///< Maximum dimension (width, height) of 2D surface. -+ hipDeviceAttributeMaxSurface2DLayered, ///< Cuda only. Maximum dimensions of 2D layered surface. -+ hipDeviceAttributeMaxSurface3D, ///< Maximum dimension (width, height, depth) of 3D surface. -+ hipDeviceAttributeMaxSurfaceCubemap, ///< Cuda only. Maximum dimensions of Cubemap surface. -+ hipDeviceAttributeMaxSurfaceCubemapLayered, ///< Cuda only. Maximum dimension of Cubemap layered surface. -+ hipDeviceAttributeMaxTexture1DWidth, ///< Maximum size of 1D texture. -+ hipDeviceAttributeMaxTexture1DLayered, ///< Cuda only. Maximum dimensions of 1D layered texture. -+ hipDeviceAttributeMaxTexture1DLinear, ///< Maximum number of elements allocatable in a 1D linear texture. -+ ///< Use cudaDeviceGetTexture1DLinearMaxWidth() instead on Cuda. -+ hipDeviceAttributeMaxTexture1DMipmap, ///< Cuda only. Maximum size of 1D mipmapped texture. -+ hipDeviceAttributeMaxTexture2DWidth, ///< Maximum dimension width of 2D texture. -+ hipDeviceAttributeMaxTexture2DHeight, ///< Maximum dimension hight of 2D texture. -+ hipDeviceAttributeMaxTexture2DGather, ///< Cuda only. Maximum dimensions of 2D texture if gather operations performed. -+ hipDeviceAttributeMaxTexture2DLayered, ///< Cuda only. Maximum dimensions of 2D layered texture. -+ hipDeviceAttributeMaxTexture2DLinear, ///< Cuda only. Maximum dimensions (width, height, pitch) of 2D textures bound to pitched memory. -+ hipDeviceAttributeMaxTexture2DMipmap, ///< Cuda only. Maximum dimensions of 2D mipmapped texture. -+ hipDeviceAttributeMaxTexture3DWidth, ///< Maximum dimension width of 3D texture. -+ hipDeviceAttributeMaxTexture3DHeight, ///< Maximum dimension height of 3D texture. -+ hipDeviceAttributeMaxTexture3DDepth, ///< Maximum dimension depth of 3D texture. -+ hipDeviceAttributeMaxTexture3DAlt, ///< Cuda only. Maximum dimensions of alternate 3D texture. -+ hipDeviceAttributeMaxTextureCubemap, ///< Cuda only. Maximum dimensions of Cubemap texture -+ hipDeviceAttributeMaxTextureCubemapLayered, ///< Cuda only. Maximum dimensions of Cubemap layered texture. -+ hipDeviceAttributeMaxThreadsDim, ///< Maximum dimension of a block -+ hipDeviceAttributeMaxThreadsPerBlock, ///< Maximum number of threads per block. -+ hipDeviceAttributeMaxThreadsPerMultiProcessor, ///< Maximum resident threads per multiprocessor. -+ hipDeviceAttributeMaxPitch, ///< Maximum pitch in bytes allowed by memory copies -+ hipDeviceAttributeMemoryBusWidth, ///< Global memory bus width in bits. -+ hipDeviceAttributeMemoryClockRate, ///< Peak memory clock frequency in kilohertz. -+ hipDeviceAttributeComputeCapabilityMinor, ///< Minor compute capability version number. -+ hipDeviceAttributeMultiGpuBoardGroupID, ///< Cuda only. Unique ID of device group on the same multi-GPU board -+ hipDeviceAttributeMultiprocessorCount, ///< Number of multiprocessors on the device. -+ hipDeviceAttributeName, ///< Device name. -+ hipDeviceAttributePageableMemoryAccess, ///< Device supports coherently accessing pageable memory -+ ///< without calling hipHostRegister on it -+ hipDeviceAttributePageableMemoryAccessUsesHostPageTables, ///< Device accesses pageable memory via the host's page tables -+ hipDeviceAttributePciBusId, ///< PCI Bus ID. -+ hipDeviceAttributePciDeviceId, ///< PCI Device ID. -+ hipDeviceAttributePciDomainID, ///< PCI Domain ID. -+ hipDeviceAttributePersistingL2CacheMaxSize, ///< Cuda11 only. Maximum l2 persisting lines capacity in bytes -+ hipDeviceAttributeMaxRegistersPerBlock, ///< 32-bit registers available to a thread block. This number is shared -+ ///< by all thread blocks simultaneously resident on a multiprocessor. -+ hipDeviceAttributeMaxRegistersPerMultiprocessor, ///< 32-bit registers available per block. -+ hipDeviceAttributeReservedSharedMemPerBlock, ///< Cuda11 only. Shared memory reserved by CUDA driver per block. -+ hipDeviceAttributeMaxSharedMemoryPerBlock, ///< Maximum shared memory available per block in bytes. -+ hipDeviceAttributeSharedMemPerBlockOptin, ///< Cuda only. Maximum shared memory per block usable by special opt in. -+ hipDeviceAttributeSharedMemPerMultiprocessor, ///< Cuda only. Shared memory available per multiprocessor. -+ hipDeviceAttributeSingleToDoublePrecisionPerfRatio, ///< Cuda only. Performance ratio of single precision to double precision. -+ hipDeviceAttributeStreamPrioritiesSupported, ///< Cuda only. Whether to support stream priorities. -+ hipDeviceAttributeSurfaceAlignment, ///< Cuda only. Alignment requirement for surfaces -+ hipDeviceAttributeTccDriver, ///< Cuda only. Whether device is a Tesla device using TCC driver -+ hipDeviceAttributeTextureAlignment, ///< Alignment requirement for textures -+ hipDeviceAttributeTexturePitchAlignment, ///< Pitch alignment requirement for 2D texture references bound to pitched memory; -+ hipDeviceAttributeTotalConstantMemory, ///< Constant memory size in bytes. -+ hipDeviceAttributeTotalGlobalMem, ///< Global memory available on devicice. -+ hipDeviceAttributeUnifiedAddressing, ///< Cuda only. An unified address space shared with the host. -+ hipDeviceAttributeUuid, ///< Cuda only. Unique ID in 16 byte. -+ hipDeviceAttributeWarpSize, ///< Warp size in threads. - -- hipDeviceAttributeMaxPitch, ///< Maximum pitch in bytes allowed by memory copies -- hipDeviceAttributeTextureAlignment, /// @@ -11,214 +11,671 @@ -The release notes provide a comprehensive summary of changes since the previous AMD ROCm release. +This page contains the release notes for AMD ROCm™ Software. -This document includes the following sections: +------------------- -* {ref}`Release highlights ` -* {ref}`Operating system and hardware support notes ` -* {ref}`ROCm components versioning ` -* {ref}`Detailed component notes ` -* {ref}`ROCm platform known issues ` -* {ref}`ROCm platform upcoming changes ` +## ROCm 6.1.2 -```{eval-rst} -The :doc:`Compatibility matrix <../compatibility/compatibility-matrix>` page summarizes ROCm compatibility across -successive major and minor releases. -``` +ROCm 6.1.2 includes enhancements to SMI tools and improvements to some libraries. -Previous ROCm release notes are available in the previous versions of the documentation. Browse previous -versions of ROCm documentation in {doc}`../release/versions`. +### OS support -(rn-highlights)= -## Release highlights +ROCm 6.1.2 has been tested against a pre-release version of Ubuntu 22.04.5 (kernel: 5.15 [GA], 6.8 [HWE]). -AMD ROCm 6.2 introduces some fancy new features and improves the taste of spinach. +### AMD SMI -This section also describes other highlights. +AMD SMI for ROCm 6.1.2 -### System stability - -Submerging your hardware in water improves the flow of data. - -### rocDecode - -It now tastes great and is less filling. - -(rn-os-hw-support)= -## Operating system and hardware support notes - -AMD ROCm 6.2 adds the following operating system support: - -* MI300A: Ubuntu 22.04.4 and RHEL 9.3 -* MI300X: Ubuntu 22.04.4 - -Future releases will add additional operating systems to match the general offering. - -For more information about the complete list of supported operating systems and hardware, see the system requirements -page for {doc}`Linux ` and -{doc}`Windows `. - -(rn-components-ver)= -## Components - -The ROCm components are versioned independently. In addition to listing each component, this section also notes upgraded components - -```{eval-rst} -.. csv-table:: - :header: "Category", "Group", "Name", "Version", "Repository" - :stub-columns: 2 - :widths: 1 1 1 1 1 - - "Libraries", "Machine learning and computer vision", :doc:`Composable Kernel `, 1.1, ``__ - "", "", :doc:`MIGraphX `, 1.0, ``__ - "", "", :doc:`MIOpen `, 1.0, ``__ - "", "", :doc:`MIVisionX `, 1.1.0 ⇒ :ref:`1.1.1 `, ``__ - "", "", :doc:`rocAL `, 2.1.5, ``__ - "", "", :doc:`rocDecode `, 1.1.0, ``__ - "", "", :doc:`rocPyDecode `, 1.1.0, ``__ - "", "", :doc:`ROCm Performance Primitives (RPP) `, 4.4.1, ``__ - "", "Communication", :doc:`RCCL `, 2.18.6, ``__ - "", "Math", :doc:`half `, 1.0.0, ``__ - "", "", :doc:`hipBLAS `, 1.4.12, ``__ - "", "", :doc:`hipBLASLt `, 1.4.12, ``__ - "", "", :doc:`hipFFT `, 1.4.12, ``__ - "", "", :doc:`hipfort `, 1.4.12, ``__ - "", "", :doc:`hipRAND `, 1.4.12, ``__ - "", "", :doc:`hipSOLVER `, 1.4.12, ``__ - "", "", :doc:`hipSPARSE `, 1.4.12, ``__ - "", "", :doc:`hipSPARSELt `, 1.4.12, ``__ - "", "", :doc:`rocALUTION `, 1.4.12, ``__ - "", "", :doc:`rocBLAS `, 6.5.0 ⇒ :ref:`6.5.1 `, ``__ - "", "", :doc:`rocFFT `, 1.4.12, ``__ - "", "", :doc:`rocRAND `, 1.4.12, ``__ - "", "", :doc:`rocSOLVER `, 1.4.12, ``__ - "", "", :doc:`rocSPARSE `, 1.4.12, ``__ - "", "", :doc:`rocWMMA `, 1.4.12, ``__ - "", "", :doc:`Tensile `, 1.4.12, ``__ - "", "Primitives", :doc:`hipCUB `, 1.0.0, ``__ - "", "", :doc:`hipTensor `, 1.0.0, ``__ - "", "", :doc:`rocPRIM `, 1.0.0, ``__ - "", "", :doc:`rocThrust `, 10.10.11, ``__ - "Tools", "Development", :doc:`HIPIFY `, 0.9.18, ``__ - "", "", :doc:`ROCdbgapi `, 0.16.1, ``__ - "", "", :doc:`ROCmCC `, 0.9.18, ``__ - "", "", :doc:`ROCm CMake `, 0.1.1, ``__ - "", "", :doc:`ROCm Debugger `, 0.9.18, ``__ - "", "", :doc:`ROCr Debug Agent `, 0.9.18, ``__ - "", "Performance", :doc:`Omniperf `, 2.0, ``__ - "", "", :doc:`Omnitrace `, 2.0.1, ``__ - "", "", :doc:`ROCm Bandwidth Test `, 2.0.1, ``__ - "", "", :doc:`ROCProfiler `, 1.19.1, ``__ - "", "", rocprofiler-sdk, 1.19.1, ``__ - "", "", :doc:`ROCTracer `, 2.0.0, ``__ - "", "System", :doc:`AMD SMI `, 1.2.4 ⇒ :ref:`1.2.5 `, ``__ - "", "", :doc:`rocminfo `, 2.0.0, ``__ - "", "", :doc:`ROCm Data Center Tool `, 2.0.0, ``__ - "", "", :doc:`ROCm SMI `, 2.0.0, ``__ - "", "", :doc:`ROCm Validation Suite `, 2.0.0, ``__ - "", "", :doc:`TransferBench `, 2.0.0, ``__ - "Compilers", "", :doc:`FLANG `, 0.9.10, ``__ - "", "", :doc:`hipCC `, 1.0, ``__ - "", "", LLVM (amdclang), 3.0.1, ``__ - "Runtimes", "", :doc:`AMD Common Language Runtime (CLR) `, 1.0.0, ``__ - "", "", :doc:`HIP `, 1.0, ``__ - "", "", :doc:`ROCR-Runtime `, 3.0.1, ``__ -``` - -(rn-components-det)= -## Detailed component notes - -(mivisionx)= -### MIVisionX (1.1.1) - -#### Changes - -* Describes changes to existing functionality or the addition of new functionality. -* You no longer need to clap to improve performance. - -#### Removals - -* Describes functionality or support that has been removed in this version. Quite often this information will have been noted in the Upcoming changes section -* Support for Microsoft Windows 95 has been removed. - -#### Resolved issues - -* Describes resolved since the previous version of this component. It should include information from earlier versions. -* Your ROCm applications can now run in the dark. - -#### Optimizations - -* Describes how the component has been optimized or improved. -* Works even better on a Commodore 64. - -#### Known issues - -* Describes known issues related to this specific component. We have a different section for the ROCm platform known issues. -* Component 1 doesn't operate as expected with an endless loop. - -#### Upcoming changes - -* Describes upcoming changes that we’re very confident will be introduced. Must be careful not to overpromise (especially on release numbers or dates). - This section should also include deprecation notices. Items in this section should be rolled forward until the change is introduced. -* In a future release, the hardware will generate electricity instead of consuming it. - -(rocblas)= -### rocBLAS (6.5.1) - -#### Changes - -* Describes changes to existing functionality or the addition of new functionality. -* You no longer need to clap to improve performance. - -#### Optimizations - -* Describes how the component has been optimized or improved. -* Works even better on a Commodore 64. - -(amdsmi)= -### AMD SMI (1.2.5) - -#### Changes +#### Additions * Added process isolation and clean shader APIs and CLI commands. * `amdsmi_get_gpu_process_isolation()` * `amdsmi_set_gpu_process_isolation()` * `amdsmi_set_gpu_clear_sram_data()` * Added the `MIN_POWER` metric to output provided by `amd-smi static --limit`. + +#### Optimizations + +* Updated the `amd-smi monitor --pcie` output to prevent delays with the `monitor` command. + +#### Changes + * Updated `amismi_get_power_cap_info` to return values in uW instead of W. * Updated Python library return types for `amdsmi_get_gpu_memory_reserved_pages` and `amdsmi_get_gpu_bad_page_info`. * Updated the output of `amd-smi metric --ecc-blocks` to show counters available from blocks. -#### Removals - -* Removed the `amdsmi_get_gpu_process_info` API from the Python library. It was removed from the C library in an earlier release. - -#### Resolved issues +#### Fixes * `amdsmi_get_gpu_board_info()` no longer returns junk character strings. * `amd-smi metric --power` now correctly details power output for RDNA3, RDNA2, and MI1x devices. * Fixed the `amdsmitstReadWrite.TestPowerCapReadWrite` test for RDNA3, RDNA2, and MI100 devices. * Fixed an issue with the `amdsmi_get_gpu_memory_reserved_pages` and `amdsmi_get_gpu_bad_page_info` Python interface calls. -#### Optimizations +#### Removals -* Updated the `amd-smi monitor --pcie` output to prevent delays with the `monitor` command. +* Removed the `amdsmi_get_gpu_process_info` API from the Python library. It was removed from the C library in an earlier release. ```{note} See the AMD SMI [detailed changelog](https://github.com/ROCm/amdsmi/blob/rocm-6.1.x/CHANGELOG.md) with code samples for more information. ``` -(rn-known-issues)= -## ROCm platform known issues +### HIPCC -AMD ROCm known issues are noted on [GitHub](https://github.com/ROCm/ROCm/labels/Verified%20Issue). This section also notes resolved issues. -For known issues related to individual components, review the content in [Detailed component notes](rn-components-det). +HIPCC for ROCm 6.1.2 -(rn-upcoming)= -## ROCm platform upcoming changes -The section notes upcoming changes related to the AMD ROCm platform. For upcoming changes related to individual components, review the content in [Detailed component notes](rn-components-det). +#### Changes -* A future release will enable the use of HIPCC compiled binaries `hipcc.bin` and `hipconfig.bin` by default. No action is needed by users; you may continue calling high-level Perl scripts `hipcc` and `hipconfig`. `hipcc.bin` and `hipconfig.bin` will be invoked by the high-level Perl scripts. To revert to the previous behavior and invoke `hipcc.pl` and `hipconfig.pl`, set the `HIP_USE_PERL_SCRIPTS` environment variable to `1`. -* A subsequent release will remove high-level HIPCC Perl scripts from `hipcc` and `hipconfig`. This release will remove the `HIP_USE_PERL_SCRIPTS` environment variable. It will rename `hipcc.bin` and `hipconfig.bin` to `hipcc` and `hipconfig` respectively. No action is needed by the users. To revert to the previous behavior, invoke `hipcc.pl` and `hipconfig.pl` explicitly. -* A subsequent release will remove `hipcc.pl` and `hipconfig.pl` for HIPCC. +* **Upcoming:** a future release will enable use of compiled binaries `hipcc.bin` and `hipconfig.bin` by default. No action is needed by users; you may continue calling high-level Perl scripts `hipcc` and `hipconfig`. `hipcc.bin` and `hipconfig.bin` will be invoked by the high-level Perl scripts. To revert to the previous behavior and invoke `hipcc.pl` and `hipconfig.pl`, set the `HIP_USE_PERL_SCRIPTS` environment variable to `1`. +* **Upcoming:** a subsequent release will remove high-level Perl scripts `hipcc` and `hipconfig`. This release will remove the `HIP_USE_PERL_SCRIPTS` environment variable. It will rename `hipcc.bin` and `hipconfig.bin` to `hipcc` and `hipconfig` respectively. No action is needed by the users. To revert to the previous behavior, invoke `hipcc.pl` and `hipconfig.pl` explicitly. +* **Upcoming:** a subsequent release will remove `hipcc.pl` and `hipconfig.pl`. + +### ROCm SMI + +ROCm SMI for ROCm 6.1.2 + +#### Additions + +* Added the ring hang event to the `amdsmi_evt_notification_type_t` enum. + +#### Fixes + +* Fixed an issue causing ROCm SMI to incorrectly report GPU utilization for RDNA3 GPUs. See the issue on [GitHub](https://github.com/ROCm/ROCm/issues/3112). +* Fixed the parsing of `pp_od_clk_voltage` in `get_od_clk_volt_info` to work better with MI-series hardware. + +### Library changes in ROCm 6.1.2 + +| Category | Group | Name | Version | Repository | +|----------|-------|------|---------|------------| +| Libraries | Machine Learning and Computer Vision | [composable_kernel](https://rocm.docs.amd.com/projects/ROCm/composable_kernel/en/latest) | [0.2.0](https://github.com/ROCm/composable_kernel/releases/tag/rocm-6.1.2) | [ROCm/composable_kernel](https://github.com/ROCm/ROCm/composable_kernel) | +| | | [AMDMIGraphX](https://rocm.docs.amd.com/projects/ROCm/AMDMIGraphX/en/latest) | [2.9](https://github.com/ROCm/AMDMIGraphX/releases/tag/rocm-6.1.2) | [ROCm/AMDMIGraphX](https://github.com/ROCm/ROCm/AMDMIGraphX) | +| | | [MIOpen](https://rocm.docs.amd.com/projects/ROCm/MIOpen/en/latest) | [3.1.0](https://github.com/ROCm/MIOpen/releases/tag/rocm-6.1.2) | [ROCm/MIOpen](https://github.com/ROCm/ROCm/MIOpen) | +| | | [MIVisionX](https://rocm.docs.amd.com/projects/ROCm/MIVisionX/en/latest) | [2.5.0](https://github.com/ROCm/MIVisionX/releases/tag/rocm-6.1.2) | [ROCm/MIVisionX](https://github.com/ROCm/ROCm/MIVisionX) | +| | | [rpp](https://rocm.docs.amd.com/projects/ROCm/rpp/en/latest) | [1.5.0](https://github.com/ROCm/rpp/releases/tag/rocm-6.1.2) | [ROCm/rpp](https://github.com/ROCm/ROCm/rpp) | +| | Communication | [rccl](https://rocm.docs.amd.com/projects/ROCm/rccl/en/latest) | [2.18.6](https://github.com/ROCm/rccl/releases/tag/rocm-6.1.2) | [ROCm/rccl](https://github.com/ROCm/ROCm/rccl) | +| | | [hipBLAS](https://rocm.docs.amd.com/projects/ROCm/hipBLAS/en/latest) | [2.1.0](https://github.com/ROCm/hipBLAS/releases/tag/rocm-6.1.2) | [ROCm/hipBLAS](https://github.com/ROCm/ROCm/hipBLAS) | +| | | [hipBLASLt](https://rocm.docs.amd.com/projects/ROCm/hipBLASLt/en/latest) | [0.7.0](https://github.com/ROCm/hipBLASLt/releases/tag/rocm-6.1.2) | [ROCm/hipBLASLt](https://github.com/ROCm/ROCm/hipBLASLt) | +| | | [hipFFT](https://rocm.docs.amd.com/projects/ROCm/hipFFT/en/latest) | [1.0.14](https://github.com/ROCm/hipFFT/releases/tag/rocm-6.1.2) | [ROCm/hipFFT](https://github.com/ROCm/ROCm/hipFFT) | +| | | [hipRAND](https://rocm.docs.amd.com/projects/ROCm/hipRAND/en/latest) | [2.10.17](https://github.com/ROCm/hipRAND/releases/tag/rocm-6.1.2) | [ROCm/hipRAND](https://github.com/ROCm/ROCm/hipRAND) | +| | | [hipSOLVER](https://rocm.docs.amd.com/projects/ROCm/hipSOLVER/en/latest) | [2.1.1](https://github.com/ROCm/hipSOLVER/releases/tag/rocm-6.1.2) | [ROCm/hipSOLVER](https://github.com/ROCm/ROCm/hipSOLVER) | +| | | [hipSPARSE](https://rocm.docs.amd.com/projects/ROCm/hipSPARSE/en/latest) | [3.0.1](https://github.com/ROCm/hipSPARSE/releases/tag/rocm-6.1.2) | [ROCm/hipSPARSE](https://github.com/ROCm/ROCm/hipSPARSE) | +| | | [hipSPARSELt](https://rocm.docs.amd.com/projects/ROCm/hipSPARSELt/en/latest) | [0.2.0](https://github.com/ROCm/hipSPARSELt/releases/tag/rocm-6.1.2) | [ROCm/hipSPARSELt](https://github.com/ROCm/ROCm/hipSPARSELt) | +| | | [rocALUTION](https://rocm.docs.amd.com/projects/ROCm/rocALUTION/en/latest) | [3.1.1](https://github.com/ROCm/rocALUTION/releases/tag/rocm-6.1.2) | [ROCm/rocALUTION](https://github.com/ROCm/ROCm/rocALUTION) | +| | | [rocBLAS](https://rocm.docs.amd.com/projects/ROCm/rocBLAS/en/latest) | [4.1.2](https://github.com/ROCm/rocBLAS/releases/tag/rocm-6.1.2) | [ROCm/rocBLAS](https://github.com/ROCm/ROCm/rocBLAS) | +| | | [rocFFT](https://rocm.docs.amd.com/projects/ROCm/rocFFT/en/latest) | [1.0.27](https://github.com/ROCm/rocFFT/releases/tag/rocm-6.1.2) | [ROCm/rocFFT](https://github.com/ROCm/ROCm/rocFFT) | +| | | [rocRAND](https://rocm.docs.amd.com/projects/ROCm/rocRAND/en/latest) | [3.0.1](https://github.com/ROCm/rocRAND/releases/tag/rocm-6.1.2) | [ROCm/rocRAND](https://github.com/ROCm/ROCm/rocRAND) | +| | | [rocSOLVER](https://rocm.docs.amd.com/projects/ROCm/rocSOLVER/en/latest) | [3.25.0](https://github.com/ROCm/rocSOLVER/releases/tag/rocm-6.1.2) | [ROCm/rocSOLVER](https://github.com/ROCm/ROCm/rocSOLVER) | +| | | [rocSPARSE](https://rocm.docs.amd.com/projects/ROCm/rocSPARSE/en/latest) | [3.1.2](https://github.com/ROCm/rocSPARSE/releases/tag/rocm-6.1.2) | [ROCm/rocSPARSE](https://github.com/ROCm/ROCm/rocSPARSE) | +| | | [rocWMMA](https://rocm.docs.amd.com/projects/ROCm/rocWMMA/en/latest) | [1.4.0](https://github.com/ROCm/rocWMMA/releases/tag/rocm-6.1.2) | [ROCm/rocWMMA](https://github.com/ROCm/ROCm/rocWMMA) | +| | | [Tensile](https://rocm.docs.amd.com/projects/ROCm/Tensile/en/latest) | [4.40.0](https://github.com/ROCm/Tensile/releases/tag/rocm-6.1.2) | [ROCm/Tensile](https://github.com/ROCm/ROCm/Tensile) | +| | Primitives | [hipCUB](https://rocm.docs.amd.com/projects/ROCm/hipCUB/en/latest) | [3.1.0](https://github.com/ROCm/hipCUB/releases/tag/rocm-6.1.2) | [ROCm/hipCUB](https://github.com/ROCm/ROCm/hipCUB) | +| | | [hipTensor](https://rocm.docs.amd.com/projects/ROCm/hipTensor/en/latest) | [1.2.0](https://github.com/ROCm/hipTensor/releases/tag/rocm-6.1.2) | [ROCm/hipTensor](https://github.com/ROCm/ROCm/hipTensor) | +| | | [rocPRIM](https://rocm.docs.amd.com/projects/ROCm/rocPRIM/en/latest) | [3.1.0](https://github.com/ROCm/rocPRIM/releases/tag/rocm-6.1.2) | [ROCm/rocPRIM](https://github.com/ROCm/ROCm/rocPRIM) | +| | | [rocThrust](https://rocm.docs.amd.com/projects/ROCm/rocThrust/en/latest) | [3.0.1](https://github.com/ROCm/rocThrust/releases/tag/rocm-6.1.2) | [ROCm/rocThrust](https://github.com/ROCm/ROCm/rocThrust) | +| | | [ROCdbgapi](https://rocm.docs.amd.com/projects/ROCm/ROCdbgapi/en/latest) | [0.71.0](https://github.com/ROCm/ROCdbgapi/releases/tag/rocm-6.1.2) | [ROCm/ROCdbgapi](https://github.com/ROCm/ROCm/ROCdbgapi) | +| | | [rocm-cmake](https://rocm.docs.amd.com/projects/ROCm/rocm-cmake/en/latest) | [0.12.0](https://github.com/ROCm/rocm-cmake/releases/tag/rocm-6.1.2) | [ROCm/rocm-cmake](https://github.com/ROCm/ROCm/rocm-cmake) | + +#### AMDMIGraphX + +MIGraphX 2.9 for ROCm 6.1.2 + +##### Additions + +* Added FP8 support +* Created a dockerfile with MIGraphX+ONNX Runtime EP+Torch +* Added support for the `Hardmax`, `DynamicQuantizeLinear`, `Qlinearconcat`, `Unique`, `QLinearAveragePool`, `QLinearSigmoid`, `QLinearLeakyRelu`, `QLinearMul`, `IsInf` operators +* Created web site examples for `Whisper`, `Llama-2`, and `Stable Diffusion 2.1` +* Created examples of using the ONNX Runtime MIGraphX Execution Provider with the `InceptionV3` and `Resnet50` models +* Updated operators to support ONNX Opset 19 +* Enable fuse_pointwise and fuse_reduce in the driver +* Add support for dot-(mul)-softmax-dot offloads to MLIR +* Added Blas auto-tuning for GEMMs +* Added dynamic shape support for the multinomial operator +* Added fp16 to accuracy checker +* Added initial code for running on Windows OS + +##### Optimizations + +* Improved the output of migraphx-driver command +* Documentation now shows all environment variables +* Updates needed for general stride support +* Enabled Asymmetric Quantization +* Added ScatterND unsupported reduction modes +* Rewrote softmax for better performance +* General improvement to how quantization is performed to support INT8 +* Used problem_cache for gemm tuning +* Improved performance by always using rocMLIR for quantized convolution +* Improved group convolutions by using rocMLIR +* Improved accuracy of fp16 models +* ScatterElements unsupported reduction +* Added concat fusions +* Improved INT8 support to include UINT8 +* Allow reshape ops between dq and quant_op +* Improve dpp reductions on navi +* Have the accuracy checker print the whole final buffer +* Added support for handling dynamic Slice and ConstantOfShape ONNX operators +* Add support for the dilations attribute to Pooling ops +* Add layout attribute support for LSTM operator +* Improved performance by removing contiguous for reshapes +* Handle all slice input variations +* Add scales attribute parse in upsample for older opset versions +* Added support for uneven Split operations +* Improved unit testing to run in python virtual environments + +##### Fixes + +* Fixed outstanding issues in autogenerated documentation +* Update model zoo paths for examples +* Fixed promote_literals_test by using additional if condition +* Fixed export API symbols from dynamic library +* Fixed bug in pad operator from dimension reduction +* Fixed using the LD to embed files and enable by default when building shared libraries on linux +* fixed get_version() +* Fixed Round operator inaccuracy +* Fixed wrong size check when axes not present for slice +* Set the .SO version correctly + +##### Changes + +* Cleanup LSTM and RNN activation functions +* Placed gemm_pointwise at a higher priority than layernorm_pointwise +* Updated README to mention the need to include GPU_TARGETS when building MIGraphX + +##### Removals + +* Removed unused device kernels from Gather and Pad operators +* Removed int8x4 format + +#### composable_kernel + +CK 0.2.0 for ROCm 6.1.2 + +##### Fixes + +* Fixed a bug in 6-dimensional kernels (#555) +* Fixed a test case failure with grouped convolution backward weight (#524) + +##### Optimizations + +* Improved the performance of the normalization kernel + +##### Additions + +* New CMake flags: + * "DL_KERNELS"-* Must be set to "ON" in order to build the gemm_dl and batched_gemm_multi_d_dl instances + * "DTYPES" -- Can be set to any subset of "fp64;fp32;fp16;fp8;bf16;int8" to build an instance of the specified data types + * "INSTANCES_ONLY" -- Only builds CK library and instances without tests, examples, or profiler +* New feature: if GPU_TARGETS is not set in the CMake command line, CK will be built for all targets supported by the compiler +* Support for MI300A/MI300X +* Support for AMD RDNA 3 +* New user tutorial (#563) +* Additional instances for irregular GEMM sizes (#560) +* New inter-wave consumer-producer programming model for GEMM kernels (#310) +* GEMM with support multiple elementwise fusions (multi-D) (#534) +* Multi-embeddings support (#542) +* AMD RDNA 3 blockwise GEMM and real GEMM support (#541) +* AMD RDNA grouped convolution backward weight support (#505) +* MaxPool and AvgPool forward (#815); MaxPool backward (#750) + +##### Changes + +None + +#### hipBLAS + +hipBLAS 2.1.0 for ROCm 6.1.2 + +##### Additions + +* New build option to automatically use hipconfig --platform to determine HIP platform +* Level 1 functions have additional ILP64 API for both C and Fortran (`_64` name + suffix) with int64_t function arguments +* New functions hipblasGetMathMode and hipblasSetMathMode + +##### Deprecations + +* USE_CUDA build option; use HIP_PLATFORM=amd or HIP_PLATFORM=nvidia to override hipconfig + +##### Changes + +* Some Level 2 function argument names have changed from `m` to `n` to match legacy BLAS; there + was no change in implementation. +* Updated client code to use YAML-based testing +* Renamed `.doxygen` and `.sphinx` folders to `doxygen` and `sphinx`, respectively +* Added CMake support for documentation + +#### hipBLASLt + +hipBLASLt 0.7.0 for ROCm 6.1.2 + +##### Additions + +* Added `hipblasltExtSoftmax` extension API +* Added `hipblasltExtLayerNorm` extension API +* Added `hipblasltExtAMax` extension API +* Added `GemmTuning` extension parameter to set split-k by user +* Support for mix precision datatype: fp16/fp8 in with fp16 out + +##### Deprecations + +* algoGetHeuristic() ext API for GroupGemm will be deprecated in a future release of hipBLASLt + +#### hipCUB + +hipCUB 3.1.0 for ROCm 6.1.2 + +##### Changed + +- CUB backend references CUB and Thrust version 2.1.0. +- Updated `HIPCUB_HOST_WARP_THREADS` macro definition to match `host_warp_size` changes from rocPRIM 3.0. +- Implemented `__int128_t` and `__uint128_t` support for radix_sort. + +##### Fixed + +- Fixed build issues with `rmake.py` on Windows when using VS 2017 15.8 or later due to a breaking fix with extended aligned storage. + +##### Added + +- Added interface `DeviceMemcpy::Batched` for batched memcpy from rocPRIM and CUB. + +#### hipFFT + +hipFFT 1.0.14 for ROCm 6.1.2 + +##### Changes + +* When building hipFFT from source, rocFFT code no longer needs to be initialized as a git submodule. + +##### Fixes + +* Fixed error when creating length-1 plans. + +#### hipRAND + +hipRAND 2.10.17 for ROCm 6.1.2 + +##### Fixes + +* Fixed benchmark and unit test builds on Windows + +#### hipSOLVER + +hipSOLVER 2.1.1 for ROCm 6.1.2 + +##### Changed + +- `BUILD_WITH_SPARSE` now defaults to OFF on Windows. + +##### Fixed + +- Fixed benchmark client build when `BUILD_WITH_SPARSE` is OFF. + +#### hipSPARSE + +hipSPARSE 3.0.1 for ROCm 6.1.2 + +##### Fixes + +* Fixes to the build chain + +#### hipSPARSELt + +hipSPARSELt 0.2.0 for ROCm 6.1.2 + +##### Added + +- Support Matrix B is a Structured Sparsity Matrix. + +#### hipTensor + +hipTensor 1.2.0 for ROCm 6.1.2 + +##### Additions + +* API support for permutation of rank 4 tensors: f16 and f32 +* New datatype support in contractions of rank 4: f16, bf16, complex f32, complex f64 +* Added scale and bilinear contraction samples and tests for new supported data types +* Added permutation samples and tests for f16, f32 types + +##### Fixes + +* Fixed bug in contraction calculation with data type f32 + +#### MIOpen + +MIOpen 3.1.0 for ROCm 6.1.2 + +##### Added + +- CK-based 2d/3d convolution solvers to support nchw/ncdhw layout +- Fused solver for Fwd Convolution with Residual, Bias and activation +- AI Based Parameter Prediction Model for conv_hip_igemm_group_fwd_xdlops Solver +- Forward, backward data and backward weight convolution solver with fp8/bfp8 +- check for packed tensors for convolution solvers +- Integrate CK's layer norm +- Combine gtests into single binary + +##### Fixed + +- fix for backward passes bwd/wrw for CK group conv 3d +- Fixed out-of-bounds memory access : ConvOclDirectFwdGen +- fixed build failure due to hipRTC + +##### Changed + +- Standardize workspace abstraction +- Use split CK libraries + +##### Removed + +- clamping to MAX from CastTensor used in Bwd and WrW convolution + +#### MIVisionX + +MIVisionX for ROCm 6.1.2 + +##### Additions + +* CTest: Tests for install verification +* Hardware support updates +* Doxygen support for API documentation + +##### Optimizations + +* CMakeList Cleanup +* Readme + +##### Changes + +* rocAL: PyBind Link to prebuilt library + * PyBind11 + * RapidJSON +* Setup Updates +* RPP - Use package install +* Dockerfiles: Updates & bugfix +* CuPy - No longer installed with setup.py + +##### Fixes + +* rocAL bug fix and updates + +##### Tested Configurations + +* Windows `10` / `11` +* Linux distribution + * Ubuntu - `20.04` / `22.04` + * CentOS - `7` / `8` + * RHEL - `8` / `9` + * SLES - `15-SP4` +* ROCm: rocm-core - `5.7.0.50700-6` +* miopen-hip - `2.20.0.50700-63` +* MIGraphX - `2.7.0.50700-63` +* Protobuf - [V3.12.4](https://github.com/protocolbuffers/protobuf/releases/tag/v3.12.4) +* OpenCV - [4.6.0](https://github.com/opencv/opencv/releases/tag/4.6.0) +* RPP - [1.5.0] +* FFMPEG - [n4.4.2](https://github.com/FFmpeg/FFmpeg/releases/tag/n4.4.2) +* Dependencies for all preceding packages +* MIVisionX setup script - `V2.6.1` + +##### Known Issues + +* OpenCV 4.X support for some applications is missing +* MIVisionX package install requires manual prerequisites installation + +#### rccl + +RCCL 2.18.6 for ROCm 6.1.2 + +##### Changed + +- Reduced NCCL_TOPO_MAX_NODES to limit stack usage and avoid overflow + +#### rocALUTION + +rocALUTION 3.1.1 for ROCm 6.1.2 + +##### Additions + +* `TripleMatrixProduct` functionality for `GlobalMatrix` +* Multi-Node/GPU support for `UA-AMG`, `SA-AMG` and `RS-AMG` +* Iterative ILU0 preconditioner `ItILU0` +* Iterative triangular solve, selectable via `SolverDecr` class + +##### Deprecations + +* `LocalMatrix::AMGConnect` +* `LocalMatrix::AMGAggregate` +* `LocalMatrix::AMGPMISAggregate` +* `LocalMatrix::AMGSmoothedAggregation` +* `LocalMatrix::AMGAggregation` +* `PairwiseAMG` + +##### Known Issues + +* `PairwiseAMG` does currently not support matrix sizes that exceed int32 range +* `PairwiseAMG` might fail building the hierarchy on certain input matrices + +#### rocBLAS + +rocBLAS 4.1.2 for ROCm 6.1.2 + +##### Fixes + +* Fixes BF16 TT get_solutions + +##### Optimizations + +* Tune gfx942 BBS TN, TT + +#### ROCdbgapi + +rocm-dbgapi 0.71.0 for ROCm 6.1.2 + +##### Added + +- Add support for gfx940, gfx941 and gfx942 architectures. + +#### rocFFT + +rocFFT 1.0.27 for ROCm 6.1.2 + +##### Fixes + +* Fixed kernel launch failure on execute of very large odd-length real-complex transforms. + +##### Additions + +* Enable multi-gpu testing on systems without direct GPU-interconnects + +#### rocm-cmake + +rocm-cmake 0.12.0 for ROCm 6.1.2 + +##### Changed + +- ROCMSphinxDoc: Allow separate source and config directories. +- ROCMCreatePackage: Allow additional `PROVIDES` on header-only packages. +- ROCMInstallTargets: Don't install executable targets by default for ASAN builds. +- ROCMTest: Add RPATH for installed tests. +- Finalize rename to ROCmCMakeBuildTools + +##### Fixed + +- ROCMClangTidy: Fixed invalid list index. +- Test failures when ROCM_CMAKE_GENERATOR is empty. + +#### rocPRIM + +rocPRIM 3.1.0 for ROCm 6.1.2 + +##### Additions + +* New primitive: `block_run_length_decode` +* New primitive: `batch_memcpy` + +##### Changes + +* Renamed: + * `scan_config_v2` to `scan_config` + * `scan_by_key_config_v2` to `scan_by_key_config` + * `radix_sort_config_v2` to `radix_sort_config` + * `reduce_by_key_config_v2` to `reduce_by_key_config` + * `radix_sort_config_v2` to `radix_sort_config` +* Removed support for custom config types for device algorithms +* `host_warp_size()` was moved into `rocprim/device/config_types.hpp`; it now uses either `device_id` or + a `stream` parameter to query the proper device and a `device_id` out parameter + * The return type is `hipError_t` +* Added support for `__int128_t` in `device_radix_sort` and `block_radix_sort` +* Improved the performance of `match_any`, and `block_histogram` which uses it + +##### Deprecations + +* Removed `reduce_by_key_config`, `MatchAny`, `scan_config`, `scan_by_key_config`, and + `radix_sort_config` + +##### Fixes + +* Build issues with `rmake.py` on Windows when using VS 2017 15.8 or later (due to a breaking fix with + extended aligned storage) + +#### rocRAND + +rocRAND 3.0.1 for ROCm 6.1.2 + +##### Fixes + +* Implemented workaround for regressions in XORWOW and LFSR on MI200 + +#### rocSOLVER + +rocSOLVER 3.25.0 for ROCm 6.1.2 + +##### Added + +- Eigensolver routines for symmetric/hermitian matrices using Divide & Conquer and Jacobi algorithm: + - SYEVDJ (with batched and strided\_batched versions) + - HEEVDJ (with batched and strided\_batched versions) +- Generalized symmetric/hermitian-definite eigensolvers using Divide & Conquer and Jacobi algorithm: + - SYGVDJ (with batched and strided\_batched versions) + - HEGVDJ (with batched and strided\_batched versions) + +##### Changed + +- Relaxed array length requirements for GESVDX with `rocblas_srange_index`. + +##### Removed + +- Removed gfx803 and gfx900 from default build targets. + +##### Fixed + +- Corrected singular vector normalization in BDSVDX and GESVDX +- Fixed potential memory access fault in STEIN, SYEVX/HEEVX, SYGVX/HEGVX, BDSVDX and GESVDX + +#### rocSPARSE + +rocSPARSE 3.1.2 for ROCm 6.1.2 + +##### Additions + +* New LRB algorithm to SpMV, supporting CSR format +* rocBLAS as now an optional dependency for SDDMM algorithms +* Additional verbose output for `csrgemm` and `bsrgemm` + +##### Optimizations + +* Triangular solve with multiple rhs (SpSM, csrsm, ...) now calls SpSV, csrsv, etcetera when nrhs equals 1 +* Improved user manual section *Installation and Building for Linux and Windows* +* Improved SpMV in CSR format on MI300 + +#### rocThrust + +rocThrust 3.0.1 for ROCm 6.1.2 + +##### Fixes + +* Ported a fix from thrust 2.2 that ensures `thrust::optional` is trivially copyable. + +#### rocWMMA + +rocWMMA 1.4.0 for ROCm 6.1.2 + +##### Additions + +* Added bf16 support for hipRTC sample + +##### Changes + +* Changed Clang C++ version to C++17 +* Updated rocwmma_coop API +* Linked rocWMMA to hiprtc + +##### Fixes + +* Fixed compile/runtime arch checks +* Built all test in large code model +* Removed inefficient branching in layout loop unrolling + +#### rpp + +rpp for ROCm 6.1.2 + +##### Changes + +* Prerequisites + +##### Tested Configurations + +* Linux distribution + * Ubuntu - `20.04` / `22.04` + * CentOS - `7` + * RHEL - `8`/`9` +* ROCm: rocm-core - `5.5.0.50500-63` +* Clang - Version `5.0.1` and above +* CMake - Version `3.22.3` +* IEEE 754-based half-precision floating-point library - Version `1.12.0` + +#### Tensile + +Tensile 4.40.0 for ROCm 6.1.2 + +##### Additions + +- new DisableKernelPieces values to invalidate local read, local write, and global read +- stream-K kernel generation, including two-tile stream-k algorithm by setting StreamK=3 +- feature to allow testing stream-k grid multipliers +- debug output to check occupancy for Stream-K +- reject condition for FractionalLoad + DepthU!=power of 2 +- new TENSILE_DB debugging value to dump the common kernel parameters +- predicate for APU libs +- new parameter (ClusterLocalRead) to turn on/off wider local read opt for TileMajorLDS +- new parameter (ExtraLatencyForLR) to add extra interval between local read and wait +- new logic to check LDS size with auto LdsPad(=1) and change LdsPad to 0 if LDS overflows +- initialization type and general batched options to the rocblas-bench input creator script + +##### Optimizations + +- enabled MFMA + LocalSplitU=4 for MT16x16 +- enabled (DirectToVgpr + MI4x4) and supported skinny MacroTile +- optimized postGSU kernel: separate postGSU kernels for different GSU values, loop unroll for GSU loop, wider global load depending on array size, and parallel reduction depending on array size +- auto LdsPad calculation for TileMajorLds + MI16x16 +- auto LdsPad calculation for UnrollMajorLds + MI16x16 + VectorWidth + +##### Changes + +- cleared hipErrorNotFound error since it is an expected part of the search +- modified hipcc search path for Linux +- changed PCI ID from 32bit to 64bit for ROCm SMI HW monitor +- changed LdsBlockSizePerPad to LdsBlockSizePerPadA, B to specify LBSPP separately +- changed the default value of LdsPadA, B, LdsBlockSizePerPadA, B from 0 to -1 +- updated test cases according to parameter changes for LdsPad, LBSPP and ClusterLocalRead +- Replaced std::regex with fnmatch()/PathMatchSpec as a workaround to std::regex stack overflow known bug + +##### Fixes + +- hipcc compile append flag parallel-jobs=4 +- race condition in Stream-K that appeared with large grids and small sizes +- mismatch issue with LdsPad + LdsBlockSizePerPad!=0 and TailLoop +- mismatch issue with LdsPad + LdsBlockSizePerPad!=0 and SplitLds +- incorrect reject condition check for DirectToLds + LdsBlockSizePerPad=-1 case +- small fix for LdsPad optimization (LdsElement calculation) diff --git a/docs/conf.py b/docs/conf.py index 2a1c9adae..d66ff3bc2 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -22,8 +22,6 @@ for template in templates: file.write(rendered) shutil.copy2('../RELEASE.md','./about/release-notes.md') -# Keep capitalization due to similar linking on GitHub's markdown preview. -shutil.copy2('../CHANGELOG.md','./about/changelog.md') latex_engine = "xelatex" latex_elements = { diff --git a/docs/sphinx/_toc.yml.in b/docs/sphinx/_toc.yml.in index ef100df6f..aa7029071 100644 --- a/docs/sphinx/_toc.yml.in +++ b/docs/sphinx/_toc.yml.in @@ -9,10 +9,6 @@ subtrees: - file: what-is-rocm.rst - file: about/release-notes.md title: Release notes - # subtrees: - # - entries: - # - file: about/changelog.md - # title: Changelog - url: https://github.com/ROCm/ROCm/labels/Verified%20Issue title: Known issues diff --git a/tools/autotag/README.md b/tools/autotag/README.md index 8900c1920..9660fa86c 100755 --- a/tools/autotag/README.md +++ b/tools/autotag/README.md @@ -11,25 +11,25 @@ * RadeonOpenCompute * ROCmSoftwarePlatform -## Updating the changelog +## Updating the changelog and release notes -> IMPORTANT: It is key to update the template Markdown files in `tools/autotag/templates/rocm_changes` (eg: `5.6.0.md`) and not the `CHANGELOG.md` itself to ensure that updates are not overwritten by the autotag script. The template should only have content from changelogs that are not included by the script to avoid duplicating data. +> IMPORTANT: It is key to update the template Markdown files in `tools/autotag/templates/rocm_changes` (eg: `5.6.0.md`) and not the `CHANGELOG.md` or `RELEASE.md` itself to ensure that updates are not overwritten by the autotag script. The template should only have content from changelogs that are not included by the script to avoid duplicating data. * Add or update the release specific notes in `tools/autotag/templates/rocm_changes` * Ensure the all the repositories have their release specific branch with the updated changelogs * Run this for 5.6.0 (change for whatever version you require) * `GITHUB_ACCESS_TOKEN=my_token_here` -To generate the changelog from 5.0.0 up to and including 6.1.1: +To generate the changelog from 5.0.0 up to and including 6.1.2: ```sh -python3 tag_script.py -t $GITHUB_ACCESS_TOKEN --no-release --no-pulls --do-previous --compile_file ../../CHANGELOG.md --branch release/rocm-rel-6.1 6.1.1 +python3 tag_script.py -t $GITHUB_ACCESS_TOKEN --no-release --no-pulls --do-previous --compile_file ../../CHANGELOG.md --branch release/rocm-rel-6.1 6.1.2 ``` -To generate the changelog only for 6.1.1: +To generate the release notes only for 6.1.2: ```sh -python3 tag_script.py -t $GITHUB_ACCESS_TOKEN --no-release --no-pulls --compile_file ../../CHANGELOG.md --branch release/rocm-rel-6.1 6.1.1 +python3 tag_script.py -t $GITHUB_ACCESS_TOKEN --no-release --no-pulls --compile_file ../../RELEASE.md --branch release/rocm-rel-6.1 6.1.2 ``` ### Notes diff --git a/tools/autotag/components.xml b/tools/autotag/components.xml index 41ec61a17..89e049b89 100644 --- a/tools/autotag/components.xml +++ b/tools/autotag/components.xml @@ -10,7 +10,7 @@ - + @@ -49,7 +49,7 @@ - + diff --git a/tools/autotag/tag_script.py b/tools/autotag/tag_script.py index 8fd0f7228..3610ea606 100755 --- a/tools/autotag/tag_script.py +++ b/tools/autotag/tag_script.py @@ -188,7 +188,7 @@ def run_tagging(): # Use the manifest included in the ROCm GitHub repository by default. if args.manifest_url is None: manifest_path = ( - "./../../default.xml" + "./components.xml" ) else: manifest_url = args.manifest_url @@ -233,31 +233,26 @@ def run_tagging(): ) # Find all the math libraries and their remotes. - included_names = [ - "AMDMIGraphX", - "HIPIFY", # - "MIOpen", - "MIVisionX", - "ROCmValidationSuite", # - "composable_kernel", - "hipfort", - "rocDecode", - "rocm-cmake", - "rpp", - ] - included_groups = [ - "mathlibs" + included_categories = [ + "libs", + "tools", + "compilers", + "runtimes", ] projects = [ ] for project in manifest_tree.iterfind(".//project"): - include = str(project.get("name")) in included_names - if (project.get("name") in included_names) or (project.get("groups") in included_groups): + if project.get("category") in included_categories: projects.append(project) - names_and_remotes = list((entry.get("name"), entry.get("remote")) for entry in projects) + component_information = list( + (entry.get("name"), + entry.get("remote"), + entry.get("group"), + entry.get("category"), + ) for entry in projects) # Get all the relevant ROCm releases, and only the last version if not doing previous. minimum_version = "5.0.0" if args.previous else args.version - releases = release_bundle_factory.create_data_dict(args.version, names_and_remotes, minimum_version) + releases = release_bundle_factory.create_data_dict(args.version, component_information, minimum_version) # Process the individual releases. failed: List[Tuple[str, str]] = [] diff --git a/tools/autotag/templates/changelog.jinja b/tools/autotag/templates/changelog.jinja index 9d78590b5..f6ab9eb09 100644 --- a/tools/autotag/templates/changelog.jinja +++ b/tools/autotag/templates/changelog.jinja @@ -29,13 +29,14 @@ This page contains the release notes for AMD ROCm™ Software. ### Library changes in ROCm {{version}} -| Library | Version | -|---------|---------| -{%- for lib_name, lib in release.libraries | dictsort %} +| Category | Group | Name | Version | Repository | +|----------|-------|------|---------|------------| +{%- for lib_name in release.libraries %} +{%- set lib = release.libraries[lib_name] %} {%- if rocm_ver_by_lib_ver[lib_name][lib.lib_version] == version and (prev_lib_ver[lib_name][lib.lib_version] | default([]) | length > 0) and lib.lib_version %} -| {{ lib_name }} | {{prev_lib_ver[lib_name][lib.lib_version]}} ⇒ [{{ lib.lib_version }}]({{ lib.release_url }}) | +| {{ lib.category }} | {{ lib.group }} | [{{ lib_name }}]({{ lib.documentation_page }}) | {{prev_lib_ver[lib_name][lib.lib_version]}} ⇒ [{{ lib.lib_version }}]({{ lib.release_url }}) | [ROCm/{{ lib_name }}]({{ lib.repository_url }}) | {%- elif lib.lib_version %} -| {{ lib_name }} | [{{ lib.lib_version }}]({{ lib.release_url }}) | +| {{ lib.category }} | {{ lib.group }} | [{{ lib_name }}]({{ lib.documentation_page }}) | [{{ lib.lib_version }}]({{ lib.release_url }}) | [ROCm/{{ lib_name }}]({{ lib.repository_url }}) | {%- endif %} {%- endfor %} diff --git a/tools/autotag/util/changelog.py b/tools/autotag/util/changelog.py index 43b51b078..b8c8ba852 100644 --- a/tools/autotag/util/changelog.py +++ b/tools/autotag/util/changelog.py @@ -16,7 +16,7 @@ class Changelog(): def __init__(self, releases: Dict[str, ReleaseBundle]): self.releases = list(releases.items()) - self.releases.sort(key=lambda x: Version(x[0]), reverse=True) + # self.releases.sort(key=lambda x: Version(x[0]), reverse=True) # For each library find the earliest ROCm release where it updated. rocm_ver_by_lib_ver: Dict[str, Dict[str, str]] = defaultdict(dict) @@ -53,4 +53,4 @@ class Changelog(): prev_lib_ver=self.prev_lib_ver ) - output.write(content) \ No newline at end of file + output.write(content) diff --git a/tools/autotag/util/mappings.py b/tools/autotag/util/mappings.py new file mode 100644 index 000000000..904421cfd --- /dev/null +++ b/tools/autotag/util/mappings.py @@ -0,0 +1,20 @@ +category_mapping = { + "libs": "Libraries", + "tools": "Tools", + "compilers": "Compilers", + "runtimes": "Runtimes", + "": "", + None: "", +} + +group_mapping = { + "ml": "Machine Learning and Computer Vision", + "communication": "Communication", + "math": "Math", + "primitives": "Primitives", + "dev": "Development", + "perf": "Performance", + "system": "System", + "": "", + None: "", +} diff --git a/tools/autotag/util/release_data.py b/tools/autotag/util/release_data.py index 1ad94ab06..6915ef15f 100755 --- a/tools/autotag/util/release_data.py +++ b/tools/autotag/util/release_data.py @@ -1,28 +1,32 @@ """Class to store data about a particular release.""" -from dataclasses import dataclass, field import os import re import shutil -import sys -from typing import Optional, Union, Dict, List, Tuple -from github import Github, UnknownObjectException -from github.Repository import Repository -from github.Organization import Organization -from github.NamedUser import NamedUser +from dataclasses import dataclass, field +from typing import Dict, List, Optional, Tuple, Union + from git import Repo from git.cmd import Git +from github import Github, UnknownObjectException +from github.NamedUser import NamedUser +from github.Organization import Organization +from github.Repository import Repository from packaging.version import Version from util.util import get_yn_input +from util.mappings import category_mapping, group_mapping + @dataclass class ReleaseData: """Store Github data for a release.""" + message: str = "" notes: str = "" changes: Dict[str, str] = field(default_factory=dict) + @dataclass class ReleaseLib: """Store data about a release for a particular library.""" @@ -34,6 +38,8 @@ class ReleaseLib: commit: str = "" rocm_version: str = "" lib_version: str = "" + group: str = "" + category: str = "" @property def qualified_repo(self) -> str: @@ -64,6 +70,16 @@ class ReleaseLib: def release_url(self) -> str: """The Github URL of the release.""" return f"https://github.com/{self.qualified_repo}/releases/tag/{self.tag}" + + @property + def documentation_page(self) -> str: + """The Read the Docs documentation site.""" + return f"https://rocm.docs.amd.com/projects/{self.qualified_repo}/en/latest" + + @property + def repository_url(self) -> str: + """The GitHub repository URL.""" + return f"https://github.com/ROCm/{self.qualified_repo}" @property def message(self) -> str: @@ -92,9 +108,7 @@ class ReleaseLib: print(f"Release Message: '{self.data.message}'") print(f"Release Notes:\n{self.data.notes}") print(f"Release Commit: '{self.commit}'") - if get_yn_input( - "Would you like to create this tag and release?", release_yn - ): + if get_yn_input("Would you like to create this tag and release?", release_yn): try: print("Performing tag and release.") release = self.repo.create_git_tag_and_release( @@ -142,9 +156,7 @@ class ReleaseLib: fork.push(f"refs/heads/release:refs/heads/{self.branch}") shutil.rmtree(repo_loc) - pr_title = ( - f"Hotfixes from {self.branch} at release {self.full_version}" - ) + pr_title = f"Hotfixes from {self.branch} at release {self.full_version}" pr_body = ( "This is an autogenerated PR.\n This is intended to pull any" f" hotfixes for ROCm release {self.full_version} (including" @@ -159,10 +171,11 @@ class ReleaseLib: print(f"Pull request created: {pr.html_url}") return pr + class ReleaseDataFactory: """A factory for ReleaseData objects.""" - lib_versions: Dict[str, str] = { } + lib_versions: Dict[str, str] = {} """A map of commit hashes to lib versions.""" def __init__( @@ -176,7 +189,9 @@ class ReleaseDataFactory: else: self.org, self.pr_org = self.get_org_or_user(org_name) - def get_org_or_user(self, name: str) -> Tuple[Union[NamedUser, Organization], Union[NamedUser, Organization]]: + def get_org_or_user( + self, name: str + ) -> Tuple[Union[NamedUser, Organization], Union[NamedUser, Organization]]: """Get a Github organization or user by name.""" gh_ns: Union[NamedUser, Organization] pr_ns: Union[NamedUser, Organization] @@ -188,12 +203,10 @@ class ReleaseDataFactory: gh_ns = self.gh.get_user(name) pr_ns = self.pr_gh.get_user(name) except UnknownObjectException as err: - raise ValueError( - f"Could not find organization/user {name}." - ) from err + raise ValueError(f"Could not find organization/user {name}.") from err return gh_ns, pr_ns - def create_data( + def create_release_lib_data( self, name: str, commit: str, @@ -219,6 +232,7 @@ class ReleaseDataFactory: ) return data + @dataclass class ReleaseBundle: """Stores data about all the libraries bundled in this release.""" @@ -226,6 +240,7 @@ class ReleaseBundle: version: str = "" libraries: Dict[str, ReleaseLib] = field(default_factory=ReleaseLib) + class ReleaseBundleFactory: gh: Github = None @@ -234,16 +249,18 @@ class ReleaseBundleFactory: default_remote: str = "" """The default fallback remote.""" - remotes: Dict[str, str] = { } + remotes: Dict[str, str] = {} """A dictionary translating the manifest remote shorthand to the full name.""" - tags: Dict[str, Dict[Version, str]] = { } + tags: Dict[str, Dict[Version, str]] = {} """A dictionary with all the ROCm version numbers and commit sha for each library.""" - orgs_and_users: Dict[str, Tuple[Union[NamedUser, Organization], Union[NamedUser, Organization]]] = { } + orgs_and_users: Dict[ + str, Tuple[Union[NamedUser, Organization], Union[NamedUser, Organization]] + ] = {} """A dictionary containing the base and PR user or organization for each project.""" - pr_repos: Dict[str, Tuple[Repo, Repo]] = { } + pr_repos: Dict[str, Tuple[Repo, Repo]] = {} """A dictionary containing the base and PR repo for each project.""" def __init__( @@ -253,15 +270,15 @@ class ReleaseBundleFactory: pr_gh: Github, default_remote: str, remotes: Dict[str, str], - branch: Optional[str] + branch: Optional[str], ): # Store Github data - self.gh = gh + self.gh = gh self.pr_gh = pr_gh self.default_remote = default_remote - self.remotes = remotes - self.branch = branch + self.remotes = remotes + self.branch = branch # Get the main repository: self.rocm_repo = gh.get_repo(rocm_repo) @@ -271,8 +288,10 @@ class ReleaseBundleFactory: if remote in self.remotes: return self.remotes[remote] return self.default_remote - - def get_org_or_user(self, remote: str) -> Tuple[Union[NamedUser, Organization], Union[NamedUser, Organization]]: + + def get_org_or_user( + self, remote: str + ) -> Tuple[Union[NamedUser, Organization], Union[NamedUser, Organization]]: """Gets the base and PR organization or user associated to a remote.""" if remote not in self.orgs_and_users: try: @@ -329,7 +348,7 @@ class ReleaseBundleFactory: def fetch_tags(self, url: str) -> Dict[Version, str]: """Fetches a version-sha map for a given Git URL.""" - result: Dict[Version, str] = { } + result: Dict[Version, str] = {} for line in Git().ls_remote("--tags", url).split("\n"): column = line.split("\t") sha = column[0] @@ -344,20 +363,23 @@ class ReleaseBundleFactory: result[Version(rocm_ver)] = sha return result - def create_data( + def create_release_bundle_data( self, version: Version, - names_and_remotes: List[Tuple[str, str]], - is_untagged: bool=False + component_info: List[Tuple[str, str]], + is_untagged: bool = False, ) -> ReleaseBundle: """Create a release bundle of libraries.""" tag_name = f"rocm-{version}" - libraries = { } + libraries = {} missing_branches = [] - + + prev_group = None + prev_category = None + print(f"\nLibraries for rocm-{version}:") - for name, remote in names_and_remotes: + for name, remote, group, category in component_info: repo, pr_repo = self.get_repos(name, remote) # Find the tag and otherwise @@ -375,20 +397,30 @@ class ReleaseBundleFactory: print(f" - Could not find branch : {self.branch}") missing_branches.append(f"{self.branch} for {name}") continue - + + if prev_group == group: + group = "" + else: + prev_group = group + + if prev_category == category: + category = "" + else: + prev_category = category + libraries[name] = ReleaseLib( name=name, repo=repo, pr_repo=pr_repo, commit=commit, rocm_version=str(version), + group=group_mapping[group], + category=category_mapping[category], ) + print(f"- {name:11} {commit}") - data = ReleaseBundle( - version=version, - libraries=libraries - ) + data = ReleaseBundle(version=version, libraries=libraries) for missing in missing_branches: print(f"Could not find the following branch: {missing}") @@ -398,8 +430,8 @@ class ReleaseBundleFactory: def create_data_dict( self, up_to_version: str, - names_and_remotes: List[Tuple[str, str]], - min_version: str = "5.0.0" + component_information: List[Tuple[str, str]], + min_version: str = "5.0.0", ) -> Dict[str, ReleaseBundle]: """Create a map of versions and release bundles.""" @@ -417,6 +449,8 @@ class ReleaseBundleFactory: for version in versions: if version >= Version(min_version) and version <= max_version: can_be_untagged = version == max_version - data[str(version)] = self.create_data(version, names_and_remotes, can_be_untagged) + data[str(version)] = self.create_release_bundle_data( + version, component_information, can_be_untagged + ) return data From 3c42dc49ab8872714c0a6dee0c060d69821efa95 Mon Sep 17 00:00:00 2001 From: randyh62 <42045079+randyh62@users.noreply.github.com> Date: Wed, 3 Jul 2024 11:09:24 -0700 Subject: [PATCH 03/21] Add llvm-project references (#101) * Add llvm-project references * fix link format * Update docs/conceptual/compiler-topics.md Co-authored-by: Young Hui - AMD <145490163+yhuiYH@users.noreply.github.com> * update llvm-project links * one more llvm-project link --------- Co-authored-by: Young Hui - AMD <145490163+yhuiYH@users.noreply.github.com> --- docs/about/compatibility/openmp.md | 482 --------------------- docs/conceptual/compiler-disambiguation.md | 21 - docs/conceptual/compiler-topics.md | 6 +- docs/conceptual/using-gpu-sanitizer.md | 427 ------------------ docs/index.md | 6 +- docs/reference/rocm-tools.md | 4 +- docs/sphinx/_toc.yml.in | 8 +- docs/what-is-rocm.rst | 10 +- 8 files changed, 17 insertions(+), 947 deletions(-) delete mode 100644 docs/about/compatibility/openmp.md delete mode 100644 docs/conceptual/compiler-disambiguation.md delete mode 100644 docs/conceptual/using-gpu-sanitizer.md diff --git a/docs/about/compatibility/openmp.md b/docs/about/compatibility/openmp.md deleted file mode 100644 index a593b81e0..000000000 --- a/docs/about/compatibility/openmp.md +++ /dev/null @@ -1,482 +0,0 @@ - - - - - - -# OpenMP support in ROCm - -## Introduction - -The ROCm™ installation includes an LLVM-based implementation that fully supports -the OpenMP 4.5 standard and a subset of OpenMP 5.0, 5.1, and 5.2 standards. -Fortran, C/C++ compilers, and corresponding runtime libraries are included. -Along with host APIs, the OpenMP compilers support offloading code and data onto -GPU devices. This document briefly describes the installation location of the -OpenMP toolchain, example usage of device offloading, and usage of `rocprof` -with OpenMP applications. The GPUs supported are the same as those supported by -this ROCm release. See the list of supported GPUs for {doc}`Linux` and -{doc}`Windows`. - -The ROCm OpenMP compiler is implemented using LLVM compiler technology. -The following image illustrates the internal steps taken to translate a user’s application into an executable that can offload computation to the AMDGPU. The compilation is a two-pass process. Pass 1 compiles the application to generate the CPU code and Pass 2 links the CPU code to the AMDGPU device code. - -![OpenMP toolchain](../../data/reference/openmp/openmp-toolchain.svg "OpenMP toolchain") - -### Installation - -The OpenMP toolchain is automatically installed as part of the standard ROCm -installation and is available under `/opt/rocm-{version}/llvm`. The -sub-directories are: - -* bin: Compilers (`flang` and `clang`) and other binaries. -* examples: The usage section below shows how to compile and run these programs. -* include: Header files. -* lib: Libraries including those required for target offload. -* lib-debug: Debug versions of the above libraries. - -## OpenMP: usage - -The example programs can be compiled and run by pointing the environment -variable `ROCM_PATH` to the ROCm install directory. - -**Example:** - -```bash -export ROCM_PATH=/opt/rocm-{version} -cd $ROCM_PATH/share/openmp-extras/examples/openmp/veccopy -sudo make run -``` - -:::{note} -`sudo` is required since we are building inside the `/opt` directory. -Alternatively, copy the files to your home directory first. -::: - -The above invocation of Make compiles and runs the program. Note the options -that are required for target offload from an OpenMP program: - -```bash --fopenmp --offload-arch= -``` - -:::{note} -The compiler also accepts the alternative offloading notation: - -```bash --fopenmp -fopenmp-targets=amdgcn-amd-amdhsa -Xopenmp-target=amdgcn-amd-amdhsa -march= -``` - -::: - -Obtain the value of `gpu-arch` by running the following command: - -```bash -% /opt/rocm-{version}/bin/rocminfo | grep gfx -``` - -[//]: # (dated link below, needs updating) - -See the complete list of [compiler command-line references](https://github.com/ROCm/llvm-project/blob/amd-staging/openmp/docs/CommandLineArgumentReference.rst). - -### Using `rocprof` with OpenMP - -The following steps describe a typical workflow for using `rocprof` with OpenMP -code compiled with AOMP: - -1. Run `rocprof` with the program command line: - - ```bash - % rocprof - ``` - - This produces a `results.csv` file in the user’s current directory that - shows basic stats such as kernel names, grid size, number of registers used, - etc. The user can choose to specify the preferred output file name using the - o option. - -2. Add options for a detailed result: - - ```bash - --stats: % rocprof --stats - ``` - - The stats option produces timestamps for the kernels. Look into the output - CSV file for the field, `DurationNs`, which is useful in getting an - understanding of the critical kernels in the code. - - Apart from `--stats`, the option `--timestamp` on produces a timestamp for - the kernels. - -3. After learning about the required kernels, the user can take a detailed look - at each one of them. `rocprof` has support for hardware counters: a set of - basic and a set of derived ones. See the complete list of counters using - options --list-basic and --list-derived. `rocprof` accepts either a text or - an XML file as an input. - -For more details on `rocprof`, refer to the {doc}`ROCProfilerV1 User Manual `. - -### Using tracing options - -**Prerequisite:** When using the `--sys-trace` option, compile the OpenMP -program with: - -```bash - -Wl,-rpath,/opt/rocm-{version}/lib -lamdhip64 -``` - -The following tracing options are widely used to generate useful information: - -* **`--hsa-trace`**: This option is used to get a JSON output file with the HSA - API execution traces and a flat profile in a CSV file. - -* **`--sys-trace`**: This allows programmers to trace both HIP and HSA calls. - Since this option results in loading ``libamdhip64.so``, follow the - prerequisite as mentioned above. - -A CSV and a JSON file are produced by the above trace options. The CSV file -presents the data in a tabular format, and the JSON file can be visualized using -Google Chrome at chrome://tracing/ or [Perfetto](https://perfetto.dev/). -Navigate to Chrome or Perfetto and load the JSON file to see the timeline of the -HSA calls. - -For more details on tracing, refer to the {doc}`ROCProfilerV1 User Manual `. - -### Environment variables - -:::{table} -:widths: auto -| Environment Variable | Purpose | -| --------------------------- | ---------------------------- | -| `OMP_NUM_TEAMS` | To set the number of teams for kernel launch, which is otherwise chosen by the implementation by default. You can set this number (subject to implementation limits) for performance tuning. | -| `LIBOMPTARGET_KERNEL_TRACE` | To print useful statistics for device operations. Setting it to 1 and running the program emits the name of every kernel launched, the number of teams and threads used, and the corresponding register usage. Setting it to 2 additionally emits timing information for kernel launches and data transfer operations between the host and the device. | -| `LIBOMPTARGET_INFO` | To print informational messages from the device runtime as the program executes. Setting it to a value of 1 or higher, prints fine-grain information and setting it to -1 prints complete information. | -| `LIBOMPTARGET_DEBUG` | To get detailed debugging information about data transfer operations and kernel launch when using a debug version of the device library. Set this environment variable to 1 to get the detailed information from the library. | -| `GPU_MAX_HW_QUEUES` | To set the number of HSA queues in the OpenMP runtime. The HSA queues are created on demand up to the maximum value as supplied here. The queue creation starts with a single initialized queue to avoid unnecessary allocation of resources. The provided value is capped if it exceeds the recommended, device-specific value. | -| `LIBOMPTARGET_AMDGPU_MAX_ASYNC_COPY_BYTES` | To set the threshold size up to which data transfers are initiated asynchronously. The default threshold size is 1*1024*1024 bytes (1MB). | -| `OMPX_FORCE_SYNC_REGIONS` | To force the runtime to execute all operations synchronously, i.e., wait for an operation to complete immediately. This affects data transfers and kernel execution. While it is mainly designed for debugging, it may have a minor positive effect on performance in certain situations. | -::: - -## OpenMP: features - -The OpenMP programming model is greatly enhanced with the following new features -implemented in the past releases. - -(openmp_usm)= - -### Asynchronous behavior in OpenMP target regions - -* Controlling Asynchronous Behavior - -The OpenMP offloading runtime executes in an asynchronous fashion by default, allowing multiple data transfers to start concurrently. However, if the data to be transferred becomes larger than the default threshold of 1MB, the runtime falls back to a synchronous data transfer. The buffers that have been locked already are always executed asynchronously. -You can overrule this default behavior by setting `LIBOMPTARGET_AMDGPU_MAX_ASYNC_COPY_BYTES` and `OMPX_FORCE_SYNC_REGIONS`. See the [Environment Variables](#environment-variables) table for details. - -* Multithreaded Offloading on the Same Device - -The `libomptarget` plugin for GPU offloading allows creation of separate configurable HSA queues per chiplet, which enables two or more threads to concurrently offload to the same device. - -* Parallel Memory Copy Invocations - -Implicit asynchronous execution of single target region enables parallel memory copy invocations. - -### Unified shared memory - -Unified Shared Memory (USM) provides a pointer-based approach to memory -management. To implement USM, fulfill the following system requirements along -with Xnack capability. - -#### Prerequisites - -* Linux Kernel versions above 5.14 -* Latest KFD driver packaged in ROCm stack -* Xnack, as USM support can only be tested with applications compiled with Xnack - capability - -#### Xnack capability - -When enabled, Xnack capability allows GPU threads to access CPU (system) memory, -allocated with OS-allocators, such as `malloc`, `new`, and `mmap`. Xnack must be -enabled both at compile- and run-time. To enable Xnack support at compile-time, -use: - -```bash ---offload-arch=gfx908:xnack+ -``` - -Or use another functionally equivalent option Xnack-any: - -```bash ---offload-arch=gfx908 -``` - -To enable Xnack functionality at runtime on a per-application basis, -use environment variable: - -```bash -HSA_XNACK=1 -``` - -When Xnack support is not needed: - -* Build the applications to maximize resource utilization using: - -```bash ---offload-arch=gfx908:xnack- -``` - -* At runtime, set the `HSA_XNACK` environment variable to 0. - -#### Unified shared memory pragma - -This OpenMP pragma is available on MI200 through `xnack+` support. - -```bash -omp requires unified_shared_memory -``` - -As stated in the OpenMP specifications, this pragma makes the map clause on -target constructs optional. By default, on MI200, all memory allocated on the -host is fine grain. Using the map clause on a target clause is allowed, which -transforms the access semantics of the associated memory to coarse grain. - -```bash -A simple program demonstrating the use of this feature is: -$ cat parallel_for.cpp -#include -#include - -#define N 64 -#pragma omp requires unified_shared_memory -int main() { - int n = N; - int *a = new int[n]; - int *b = new int[n]; - - for(int i = 0; i < n; i++) - b[i] = i; - - #pragma omp target parallel for map(to:b[:n]) - for(int i = 0; i < n; i++) - a[i] = b[i]; - - for(int i = 0; i < n; i++) - if(a[i] != i) - printf("error at %d: expected %d, got %d\n", i, i+1, a[i]); - - return 0; -} -$ clang++ -O2 -target x86_64-pc-linux-gnu -fopenmp --offload-arch=gfx90a:xnack+ parallel_for.cpp -$ HSA_XNACK=1 ./a.out -``` - -In the above code example, pointer “a” is not mapped in the target region, while -pointer “b” is. Both are valid pointers on the GPU device and passed by-value to -the kernel implementing the target region. This means the pointer values on the -host and the device are the same. - -The difference between the memory pages pointed to by these two variables is -that the pages pointed by “a” are in fine-grain memory, while the pages pointed -to by “b” are in coarse-grain memory during and after the execution of the -target region. This is accomplished in the OpenMP runtime library with calls to -the ROCr runtime to set the pages pointed by “b” as coarse grain. - -### OMPT target support - -The OpenMP runtime in ROCm implements a subset of the OMPT device APIs, as -described in the OpenMP specification document. These APIs allow first-party -tools to examine the profile and kernel traces that execute on a device. A tool -can register callbacks for data transfer and kernel dispatch entry points or use -APIs to start and stop tracing for device-related activities such as data -transfer and kernel dispatch timings and associated metadata. If device tracing -is enabled, trace records for device activities are collected during program -execution and returned to the tool using the APIs described in the -specification. - -The following example demonstrates how a tool uses the supported OMPT target -APIs. The `README` in `/opt/rocm/llvm/examples/tools/ompt` outlines the steps to -be followed, and the provided example can be run as shown below: - -```bash -cd $ROCM_PATH/share/openmp-extras/examples/tools/ompt/veccopy-ompt-target-tracing -sudo make run -``` - -The file `veccopy-ompt-target-tracing.c` simulates how a tool initiates device -activity tracing. The file `callbacks.h` shows the callbacks registered and -implemented by the tool. - -### Floating point atomic operations - -The MI200-series GPUs support the generation of hardware floating-point atomics -using the OpenMP atomic pragma. The support includes single- and -double-precision floating-point atomic operations. The programmer must ensure -that the memory subjected to the atomic operation is in coarse-grain memory by -mapping it explicitly with the help of map clauses when not implicitly mapped by -the compiler as per the [OpenMP -specifications](https://www.openmp.org/specifications/). This makes these -hardware floating-point atomic instructions “fast,” as they are faster than -using a default compare-and-swap loop scheme, but at the same time “unsafe,” as -they are not supported on fine-grain memory. The operation in -`unified_shared_memory` mode also requires programmers to map the memory -explicitly when not implicitly mapped by the compiler. - -To request fast floating-point atomic instructions at the file level, use -compiler flag `-munsafe-fp-atomics` or a hint clause on a specific pragma: - -```bash -double a = 0.0; -#pragma omp atomic hint(AMD_fast_fp_atomics) -a = a + 1.0; -``` - -:::{note} -`AMD_unsafe_fp_atomics` is an alias for `AMD_fast_fp_atomics`, and -`AMD_safe_fp_atomics` is implemented with a compare-and-swap loop. -::: - -To disable the generation of fast floating-point atomic instructions at the file -level, build using the option `-msafe-fp-atomics` or use a hint clause on a -specific pragma: - -```bash -double a = 0.0; -#pragma omp atomic hint(AMD_safe_fp_atomics) -a = a + 1.0; -``` - -The hint clause value always has a precedence over the compiler flag, which -allows programmers to create atomic constructs with a different behavior than -the rest of the file. - -See the example below, where the user builds the program using -`-msafe-fp-atomics` to select a file-wide “safe atomic” compilation. However, -the fast atomics hint clause over variable “a” takes precedence and operates on -“a” using a fast/unsafe floating-point atomic, while the variable “b” in the -absence of a hint clause is operated upon using safe floating-point atomics as -per the compiler flag. - -```bash -double a = 0.0;. -#pragma omp atomic hint(AMD_fast_fp_atomics) -a = a + 1.0; - -double b = 0.0; -#pragma omp atomic -b = b + 1.0; -``` - -### AddressSanitizer tool - -AddressSanitizer (ASan) is a memory error detector tool utilized by applications to -detect various errors ranging from spatial issues such as out-of-bound access to -temporal issues such as use-after-free. The AOMP compiler supports ASan for AMD -GPUs with applications written in both HIP and OpenMP. - -**Features supported on host platform (Target x86_64):** - -* Use-after-free -* Buffer overflows -* Heap buffer overflow -* Stack buffer overflow -* Global buffer overflow -* Use-after-return -* Use-after-scope -* Initialization order bugs - -**Features supported on AMDGPU platform (`amdgcn-amd-amdhsa`):** - -* Heap buffer overflow -* Global buffer overflow - -**Software (kernel/OS) requirements:** Unified Shared Memory support with Xnack -capability. See the section on [Unified Shared Memory](#unified-shared-memory) -for prerequisites and details on Xnack. - -**Example:** - -* Heap buffer overflow - -```bash -void main() { -....... // Some program statements -....... // Some program statements -#pragma omp target map(to : A[0:N], B[0:N]) map(from: C[0:N]) -{ -#pragma omp parallel for - for(int i =0 ; i < N; i++){ - C[i+10] = A[i] + B[i]; - } // end of for loop -} -....... // Some program statements -}// end of main -``` - -See the complete sample code for heap buffer overflow -[here](https://github.com/ROCm/aomp/blob/aomp-dev/examples/tools/asan/heap_buffer_overflow/openmp/vecadd-HBO.cpp). - -* Global buffer overflow - -```bash -#pragma omp declare target - int A[N],B[N],C[N]; -#pragma omp end declare target -void main(){ -...... // some program statements -...... // some program statements -#pragma omp target data map(to:A[0:N],B[0:N]) map(from: C[0:N]) -{ -#pragma omp target update to(A,B) -#pragma omp target parallel for -for(int i=0; i - - - - - -# ROCm compilers disambiguation - -ROCm ships multiple compilers of varying origins and purposes. This article -disambiguates compiler naming used throughout the documentation. - -## Compiler terms - -| Term | Description | -| - | - | -| `amdclang++` | Clang/LLVM-based compiler that is part of `rocm-llvm` package. The source code is available at https://github.com/ROCm/llvm-project. | -| AOCC | Closed-source clang-based compiler that includes additional CPU optimizations. Offered as part of ROCm via the `rocm-llvm-alt` package. See for details, https://developer.amd.com/amd-aocc/. | -| HIP-Clang | Informal term for the `amdclang++` compiler | -| HIPIFY | Tools including `hipify-clang` and `hipify-perl`, used to automatically translate CUDA source code into portable HIP C++. The source code is available at https://github.com/ROCm/HIPIFY | -| `hipcc` | HIP compiler driver. A utility that invokes `clang` or `nvcc` depending on the target and passes the appropriate include and library options for the target compiler and HIP infrastructure. The source code is available at https://github.com/ROCm/HIPCC. | -| ROCmCC | Clang/LLVM-based compiler. ROCmCC in itself is not a binary but refers to the overall compiler. | diff --git a/docs/conceptual/compiler-topics.md b/docs/conceptual/compiler-topics.md index efb4044c4..e117e84d6 100644 --- a/docs/conceptual/compiler-topics.md +++ b/docs/conceptual/compiler-topics.md @@ -9,6 +9,6 @@ The following topics describe using specific features of the compilation tools: -* [Using AddressSanitizer](./using-gpu-sanitizer.md) -* [Compiler disambiguation](./compiler-disambiguation.md) -* [OpenMP support in ROCm](../about/compatibility/openmp.md) +* [ROCm compiler infrastructure](https://rocm.docs.amd.com/projects/llvm-project/en/latest/index.html) +* [Using AddressSanitizer](https://rocm.docs.amd.com/projects/llvm-project/en/latest/conceptual/using-gpu-sanitizer.html) +* [OpenMP support](https://rocm.docs.amd.com/projects/llvm-project/en/latest/conceptual/openmp.html) diff --git a/docs/conceptual/using-gpu-sanitizer.md b/docs/conceptual/using-gpu-sanitizer.md deleted file mode 100644 index 6206fd0dc..000000000 --- a/docs/conceptual/using-gpu-sanitizer.md +++ /dev/null @@ -1,427 +0,0 @@ - - - - - - -# Using the AddressSanitizer on a GPU (beta release) - -The LLVM AddressSanitizer (ASan) provides a process that allows developers to detect runtime addressing errors in applications and libraries. The detection is achieved using a combination of compiler-added instrumentation and runtime techniques, including function interception and replacement. -Until now, the LLVM ASan process was only available for traditional purely CPU applications. However, ROCm has extended this mechanism to additionally allow the detection of some addressing errors on the GPU in heterogeneous applications. Ideally, developers should treat heterogeneous HIP and OpenMP applications exactly like pure CPU applications. However, this simplicity has not been achieved yet. -This document provides documentation on using ROCm ASan. - -For information about LLVM ASan, see the [LLVM documentation](https://clang.llvm.org/docs/AddressSanitizer.html). - -:::{note} -The beta release of LLVM ASan for ROCm is currently tested and validated on Ubuntu 20.04. -::: - -## Compiling for ASan - -The ASan process begins by compiling the application of interest with the ASan instrumentation. - -Recommendations for doing this are: - -* Compile as many application and dependent library sources as possible using an AMD-built clang-based compiler such as `amdclang++`. -* Add the following options to the existing compiler and linker options: - - * `-fsanitize=address` - enables instrumentation - - * `-shared-libsan` - use shared version of runtime - - * `-g` - add debug info for improved reporting - -* Explicitly use `xnack+` in the offload architecture option. For example, `--offload-arch=gfx90a:xnack+` - -Other architectures are allowed, but their device code will not be instrumented and a warning will be emitted. - -:::{tip} -It is not an error to compile some files without ASan instrumentation, but doing so reduces the ability of the process to detect addressing errors. However, if the main program "`a.out`" does not directly depend on the ASan runtime (`libclang_rt.asan-x86_64.so`) after the build completes (check by running `ldd` (List Dynamic Dependencies) or `readelf`), the application will immediately report an error at runtime as described in the next section. -::: - -:::{note} -When compiling OpenMP programs with ASan instrumentation, it is currently necessary to set the environment variable `LIBRARY_PATH` to `/opt/rocm-/lib/llvm/lib/asan:/opt/rocm-/lib/asan`. At runtime, it may be necessary to add `/opt/rocm-/lib/llvm/lib/asan` to `LD_LIBRARY_PATH`. -::: - -### About compilation time - -When `-fsanitize=address` is used, the LLVM compiler adds instrumentation code around every memory operation. This added code must be handled by all downstream components of the compiler toolchain and results in increased overall compilation time. This increase is especially evident in the AMDGPU device compiler and has in a few instances raised the compile time to an unacceptable level. - -There are a few options if the compile time becomes unacceptable: - -* Avoid instrumentation of the files which have the worst compile times. This will reduce the effectiveness of the ASan process. -* Add the option `-fsanitize-recover=address` to the compiles with the worst compile times. This option simplifies the added instrumentation resulting in faster compilation. See below for more information. -* Disable instrumentation on a per-function basis by adding `__attribute__`((no_sanitize("address"))) to functions found to be responsible for the large compile time. Again, this will reduce the effectiveness of the process. - -## Installing ROCm GPU ASan packages - -For a complete ROCm GPU Sanitizer installation, including packages, instrumented HSA and HIP runtimes, tools, and math libraries, use the following instruction, - -```bash - sudo apt-get install rocm-ml-sdk-asan - -``` - -## Using AMD-supplied ASan instrumented libraries - -ROCm releases have optional packages that contain additional ASan instrumented builds of the ROCm libraries (usually found in `/opt/rocm-/lib`). The instrumented libraries have identical names to the regular uninstrumented libraries, and are located in `/opt/rocm-/lib/asan`. -These additional libraries are built using the `amdclang++` and `hipcc` compilers, while some uninstrumented libraries are built with `g++`. The preexisting build options are used but, as described above, additional options are used: `-fsanitize=address`, `-shared-libsan` and `-g`. - -These additional libraries avoid additional developer effort to locate repositories, identify the correct branch, check out the correct tags, and other efforts needed to build the libraries from the source. And they extend the ability of the process to detect addressing errors into the ROCm libraries themselves. - -When adjusting an application build to add instrumentation, linking against these instrumented libraries is unnecessary. For example, any `-L` `/opt/rocm-/lib` compiler options need not be changed. However, the instrumented libraries should be used when the application is run. It is particularly important that the instrumented language runtimes, like `libamdhip64.so` and `librocm-core.so`, are used; otherwise, device invalid access detections may not be reported. - -## Running ASan instrumented applications - -### Preparing to run an instrumented application - -Here are a few recommendations to consider before running an ASan instrumented heterogeneous application. - -* Ensure the Linux kernel running on the system has Heterogeneous Memory Management (HMM) support. A kernel version of 5.6 or higher should be sufficient. -* Ensure XNACK is enabled - * For `gfx90a` (MI-2X0) or `gfx940` (MI-3X0) use environment `HSA_XNACK = 1`. - * For `gfx906` (MI-50) or `gfx908` (MI-100) use environment `HSA_XNACK = 1` but also ensure the amdgpu kernel module is loaded with module argument `noretry=0`. -This requirement is due to the fact that the XNACK setting for these GPUs is system-wide. - -* Ensure that the application will use the instrumented libraries when it runs. The output from the shell command `ldd ` can be used to see which libraries will be used. -If the instrumented libraries are not listed by `ldd`, the environment variable `LD_LIBRARY_PATH` may need to be adjusted, or in some cases an `RPATH` compiled into the application may need to be changed and the application recompiled. - -* Ensure that the application depends on the ASan runtime. This can be checked by running the command `readelf -d | grep NEEDED` and verifying that shared library: `libclang_rt.asan-x86_64.so` appears in the output. -If it does not appear, when executed the application will quickly output an ASan error that looks like: - -```bash -==3210==ASan runtime does not come first in initial library list; you should either link runtime to your application or manually preload it with LD_PRELOAD. -``` - -* Ensure that the application `llvm-symbolizer` can be executed, and that it is located in `/opt/rocm-/llvm/bin`. This executable is not strictly required, but if found is used to translate ("symbolize") a host-side instruction address into a more useful function name, file name, and line number (assuming the application has been built to include debug information). - -There is an environment variable, `ASAN_OPTIONS`, that can be used to adjust the runtime behavior of the ASan runtime itself. There are more than a hundred "flags" that can be adjusted (see an old list at [flags](https://github.com/google/sanitizers/wiki/AddressSanitizerFlags)) but the default settings are correct and should be used in most cases. It must be noted that these options only affect the host ASan runtime. The device runtime only currently supports the default settings for the few relevant options. - -There are three `ASAN_OPTION` flags of note. - -* `halt_on_error=0/1 default 1`. - - This tells the ASan runtime to halt the application immediately after detecting and reporting an addressing error. The default makes sense because the application has entered the realm of undefined behavior. If the developer wishes to have the application continue anyway, this option can be set to zero. However, the application and libraries should then be compiled with the additional option `-fsanitize-recover=address`. Note that the ROCm optional ASan instrumented libraries are not compiled with this option and if an error is detected within one of them, but halt_on_error is set to 0, more undefined behavior will occur. - -* `detect_leaks=0/1 default 1`. - - This option directs the ASan runtime to enable the [Leak Sanitizer](https://clang.llvm.org/docs/LeakSanitizer.html) (LSan). For heterogeneous applications, this default results in significant output from the leak sanitizer when the application exits due to allocations made by the language runtime which are not considered to be leaks. This output can be avoided by adding `detect_leaks=0` to the `ASAN_OPTIONS`, or alternatively by producing an LSan suppression file (syntax described [here](https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer)) and activating it with environment variable `LSAN_OPTIONS=suppressions=/path/to/suppression/file`. When using a suppression file, a suppression report is printed by default. The suppression report can be disabled by using the `LSAN_OPTIONS` flag `print_suppressions=0`. - -* `quarantine_size_mb=N default 256` - - This option defines the number of megabytes (MB) `N` of memory that the ASan runtime will hold after it is `freed` to detect use-after-free situations. This memory is unavailable for other purposes. The default of 256 MB may be too small to detect some use-after-free situations, especially given that the large size of many GPU memory allocations may push `freed` allocations out of quarantine before the attempted use. - - :::{note} - Setting the value of `quarantine_size_mb` larger may enable more problematic uses to be detected, but at the cost of reducing memory available for other purposes. - ::: - -## Runtime overhead - -Running an ASan instrumented application incurs -overheads which may result in unacceptably long runtimes -or failure to run at all. - -### Higher execution time - -ASan detection works by checking each address at runtime -before the address is actually accessed by a load, store, or atomic -instruction. -This checking involves an additional load to "shadow" memory which -records whether the address is "poisoned" or not, and additional logic -that decides whether to produce an detection report or not. - -This extra runtime work can cause the application to slow down by -a factor of three or more, depending on how many memory accesses are -executed. -For heterogeneous applications, the shadow memory must be accessible by all devices -and this can mean that shadow accesses from some devices may be more costly -than non-shadow accesses. - -### Higher memory use - -The address checking described above relies on the compiler to surround -each program variable with a red zone and on ASan -runtime to surround each runtime memory allocation with a red zone and -fill the shadow corresponding to each red zone with poison. -The added memory for the red zones is additional overhead on top -of the 13% overhead for the shadow memory itself. - -Applications which consume most one or more available memory pools when -run normally are likely to encounter allocation failures when run with -instrumentation. - -## Runtime reporting - -It is not the intention of this document to provide a detailed explanation of all the types of reports that can be output by the ASan runtime. Instead, the focus is on the differences between the standard reports for CPU issues, and reports for GPU issues. - -An invalid address detection report for the CPU always starts with - -```bash -====ERROR: AddressSanitizer: on address at pc bp sp of size at thread T0 -``` - -and continues with a stack trace for the access, a stack trace for the allocation and deallocation, if relevant, and a dump of the shadow near the . - -In contrast, an invalid address detection report for the GPU always starts with - -```bash -====ERROR: AddressSanitizer: on amdgpu device at pc of size in workgroup id (,,) -``` - -Above, `` is the integer device ID, and `(, , )` is the ID of the workgroup or block where the invalid address was detected. - -While the CPU report include a call stack for the thread attempting the invalid access, the GPU is currently to a call stack of size one, i.e. the (symbolized) of the invalid access, e.g. - -```bash -#0 in at /path/to/file.hip:: -``` - -This short call stack is followed by a GPU unique section that looks like - -```bash -Thread ids and accessed addresses: - : : ... -``` - -where each ` ` indicates the lane ID and the invalid memory address held by lane `j` of the wavefront attempting the invalid access. - -Additionally, reports for invalid GPU accesses to memory allocated by GPU code via `malloc` or new starting with, for example, - -```bash -==1234==ERROR: AddressSanitizer: heap-buffer-overflow on amdgpu device 0 at pc 0x7fa9f5c92dcc -``` - -or - -```bash -==5678==ERROR: AddressSanitizer: heap-use-after-free on amdgpu device 3 at pc 0x7f4c10062d74 -``` - -currently may include one or two surprising CPU side tracebacks mentioning :`hostcall`". This is due to how `malloc` and `free` are implemented for GPU code and these call stacks can be ignored. - -## Running ASan with `rocgdb` - -`rocgdb` can be used to further investigate ASan detected errors, with some preparation. - -Currently, the ASan runtime complains when starting `rocgdb` without preparation. - -```bash -$ rocgdb my_app -==1122==ASan` runtime does not come first in initial library list; you should either link runtime to your application or manually preload it with LD_PRELOAD. -``` - -This is solved by setting environment variable `LD_PRELOAD` to the path to the ASan runtime, whose path can be obtained using the command - -```bash -amdclang++ -print-file-name=libclang_rt.asan-x86_64.so -``` - -You should also set the environment variable `HIP_ENABLE_DEFERRED_LOADING=0` before debugging HIP applications. - -After starting `rocgdb` breakpoints can be set on the ASan runtime error reporting entry points of interest. For example, if an ASan error report includes - -```bash -WRITE of size 4 in workgroup id (10,0,0) -``` - -the `rocgdb` command needed to stop the program before the report is printed is - -```bash -(gdb) break __asan_report_store4 -``` - -Similarly, the appropriate command for a report including - -```bash -READ of size in workgroup ID (1,2,3) -``` - -is - -```bash -(gdb) break __asan_report_load -``` - -It is possible to set breakpoints on all ASan report functions using these commands: - -```bash -$ rocgdb -(gdb) start -(gdb) rbreak ^__asan_report -(gdb) c -``` - -## Using ASan with a short HIP application - -Consider the following simple and short demo of using the Address Sanitizer with a HIP application: - -```C++ - -#include -#include - -__global__ void -set1(int *p) -{ - int i = blockDim.x*blockIdx.x + threadIdx.x; - p[i] = 1; -} - -int -main(int argc, char **argv) -{ - int m = std::atoi(argv[1]); - int n1 = std::atoi(argv[2]); - int n2 = std::atoi(argv[3]); - int c = std::atoi(argv[4]); - int *dp; - hipMalloc(&dp, m*sizeof(int)); - hipLaunchKernelGGL(set1, dim3(n1), dim3(n2), 0, 0, dp); - int *hp = (int*)malloc(c * sizeof(int)); - hipMemcpy(hp, dp, m*sizeof(int), hipMemcpyDeviceToHost); - hipDeviceSynchronize(); - hipFree(dp); - free(hp); - std::puts("Done."); - return 0; -} -``` - -This application will attempt to access invalid addresses for certain command line arguments. In particular, if `m < n1 * n2` some device threads will attempt to access -unallocated device memory. - -Or, if `c < m`, the `hipMemcpy` function will copy past the end of the `malloc` allocated memory. - -**Note**: The `hipcc` compiler is used here for simplicity. - -Compiling without XNACK results in a warning. - -```bash -$ hipcc -g --offload-arch=gfx90a:xnack- -fsanitize=address -shared-libsan mini.hip -o mini -clang++: warning: ignoring` `-fsanitize=address' option for offload arch 'gfx90a:xnack-`, as it is not currently supported there. Use it with an offload arch containing 'xnack+' instead [-Woption-ignored]`. -``` - -The binary compiled above will run, but the GPU code will not be instrumented and the `m < n1 * n2` error will not be detected. Switching to `--offload-arch=gfx90a:xnack+` in the command above results in a warning-free compilation and an instrumented application. After setting `PATH`, `LD_LIBRARY_PATH` and `HSA_XNACK` as described earlier, a check of the binary with `ldd` yields the following, - -```bash -$ ldd mini - linux-vdso.so.1 (0x00007ffd1a5ae000) - libclang_rt.asan-x86_64.so => /opt/rocm-6.1.0-99999/llvm/lib/clang/17.0.0/lib/linux/libclang_rt.asan-x86_64.so (0x00007fb9c14b6000) - libamdhip64.so.5 => /opt/rocm-6.1.0-99999/lib/asan/libamdhip64.so.5 (0x00007fb9bedd3000) - libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fb9beba8000) - libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb9bea59000) - libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fb9bea3e000) - libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb9be84a000) - libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb9be844000) - libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb9be821000) - librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fb9be817000) - libamd_comgr.so.2 => /opt/rocm-6.1.0-99999/lib/asan/libamd_comgr.so.2 (0x00007fb9b4382000) - libhsa-runtime64.so.1 => /opt/rocm-6.1.0-99999/lib/asan/libhsa-runtime64.so.1 (0x00007fb9b3b00000) - libnuma.so.1 => /lib/x86_64-linux-gnu/libnuma.so.1 (0x00007fb9b3af3000) - /lib64/ld-linux-x86-64.so.2 (0x00007fb9c2027000) - libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fb9b3ad7000) - libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007fb9b3aa7000) - libelf.so.1 => /lib/x86_64-linux-gnu/libelf.so.1 (0x00007fb9b3a89000) - libdrm.so.2 => /opt/amdgpu/lib/x86_64-linux-gnu/libdrm.so.2 (0x00007fb9b3a70000) - libdrm_amdgpu.so.1 => /opt/amdgpu/lib/x86_64-linux-gnu/libdrm_amdgpu.so.1 (0x00007fb9b3a62000) - -``` - -This confirms that the address sanitizer runtime is linked in, and the ASan instrumented version of the runtime libraries are used. -Checking the `PATH` yields - -```bash -$ which llvm-symbolizer -/opt/rocm-6.1.0-99999/llvm/bin/llvm-symbolizer -``` - -Lastly, a check of the OS kernel version yields - -```bash -$ uname -rv -5.15.0-73-generic #80~20.04.1-Ubuntu SMP Wed May 17 14:58:14 UTC 2023 -``` - -which indicates that the required HMM support (kernel version > 5.6) is available. This completes the necessary setup. Running with `m = 100`, `n1 = 11`, `n2 = 10` and `c = 100` should produce -a report for an invalid access by the last 10 threads. - -```bash -================================================================= -==3141==ERROR: AddressSanitizer: heap-buffer-overflow on amdgpu device 0 at pc 0x7fb1410d2cc4 -WRITE of size 4 in workgroup id (10,0,0) - #0 0x7fb1410d2cc4 in set1(int*) at /home/dave/mini/mini.cpp:0:10 - -Thread ids and accessed addresses: -00 : 0x7fb14371d190 01 : 0x7fb14371d194 02 : 0x7fb14371d198 03 : 0x7fb14371d19c 04 : 0x7fb14371d1a0 05 : 0x7fb14371d1a4 06 : 0x7fb14371d1a8 07 : 0x7fb14371d1ac -08 : 0x7fb14371d1b0 09 : 0x7fb14371d1b4 - -0x7fb14371d190 is located 0 bytes after 400-byte region [0x7fb14371d000,0x7fb14371d190) -allocated by thread T0 here: - #0 0x7fb151c76828 in hsa_amd_memory_pool_allocate /work/dave/git/compute/external/llvm-project/compiler-rt/lib/asan/asan_interceptors.cpp:692:3 - #1 ... - - #12 0x7fb14fb99ec4 in hipMalloc /work/dave/git/compute/external/clr/hipamd/src/hip_memory.cpp:568:3 - #13 0x226630 in hipError_t hipMalloc(int**, unsigned long) /opt/rocm-6.1.0-99999/include/hip/hip_runtime_api.h:8367:12 - #14 0x226630 in main /home/dave/mini/mini.cpp:19:5 - #15 0x7fb14ef02082 in __libc_start_main /build/glibc-SzIz7B/glibc-2.31/csu/../csu/libc-start.c:308:16 - -Shadow bytes around the buggy address: - 0x7fb14371cf00: ... - -=>0x7fb14371d180: 00 00[fa]fa fa fa fa fa fa fa fa fa fa fa fa fa - 0x7fb14371d200: ... - -Shadow byte legend (one shadow byte represents 8 application bytes): - Addressable: 00 - Partially addressable: 01 02 03 04 05 06 07 - Heap left redzone: fa - ... -==3141==ABORTING -``` - -Running with `m = 100`, `n1 = 10`, `n2 = 10` and `c = 99` should produce a report for an invalid copy. - -```shell -================================================================= -==2817==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x514000150dcc at pc 0x7f5509551aca bp 0x7ffc90a7ae50 sp 0x7ffc90a7a610 -WRITE of size 400 at 0x514000150dcc thread T0 - #0 0x7f5509551ac9 in __asan_memcpy /work/dave/git/compute/external/llvm-project/compiler-rt/lib/asan/asan_interceptors_memintrinsics.cpp:61:3 - #1 ... - - #9 0x7f5507462a28 in hipMemcpy_common(void*, void const*, unsigned long, hipMemcpyKind, ihipStream_t*) /work/dave/git/compute/external/clr/hipamd/src/hip_memory.cpp:637:10 - #10 0x7f5507464205 in hipMemcpy /work/dave/git/compute/external/clr/hipamd/src/hip_memory.cpp:642:3 - #11 0x226844 in main /home/dave/mini/mini.cpp:22:5 - #12 0x7f55067c3082 in __libc_start_main /build/glibc-SzIz7B/glibc-2.31/csu/../csu/libc-start.c:308:16 - #13 0x22605d in _start (/home/dave/mini/mini+0x22605d) - -0x514000150dcc is located 0 bytes after 396-byte region [0x514000150c40,0x514000150dcc) -allocated by thread T0 here: - #0 0x7f5509553dcf in malloc /work/dave/git/compute/external/llvm-project/compiler-rt/lib/asan/asan_malloc_linux.cpp:69:3 - #1 0x226817 in main /home/dave/mini/mini.cpp:21:21 - #2 0x7f55067c3082 in __libc_start_main /build/glibc-SzIz7B/glibc-2.31/csu/../csu/libc-start.c:308:16 - -SUMMARY: AddressSanitizer: heap-buffer-overflow /work/dave/git/compute/external/llvm-project/compiler-rt/lib/asan/asan_interceptors_memintrinsics.cpp:61:3 in __asan_memcpy -Shadow bytes around the buggy address: - 0x514000150b00: ... - -=>0x514000150d80: 00 00 00 00 00 00 00 00 00[04]fa fa fa fa fa fa - 0x514000150e00: ... - -Shadow byte legend (one shadow byte represents 8 application bytes): - Addressable: 00 - Partially addressable: 01 02 03 04 05 06 07 - Heap left redzone: fa - ... -==2817==ABORTING -``` - -## Known issues with using GPU sanitizer - -* Red zones must have limited size. It is possible for an invalid access to completely miss a red zone and not be detected. - -* Lack of detection or false reports can be caused by the runtime not properly maintaining red zone shadows. - -* Lack of detection on the GPU might also be due to the implementation not instrumenting accesses to all GPU specific address spaces. For example, in the current implementation accesses to "private" or "stack" variables on the GPU are not instrumented, and accesses to HIP shared variables (also known as "local data store" or "LDS") are also not instrumented. - -* It can also be the case that a memory fault is hit for an invalid address even with the instrumentation. This is usually caused by the invalid address being so wild that its shadow address is outside any memory region, and the fault actually occurs on the access to the shadow address. It is also possible to hit a memory fault for the `NULL` pointer. While address 0 does have a shadow location, it is not poisoned by the runtime. diff --git a/docs/index.md b/docs/index.md index 4bcf6a33b..7a1201726 100644 --- a/docs/index.md +++ b/docs/index.md @@ -95,9 +95,9 @@ Our documentation is organized into the following categories: * [RDNA2](./how-to/tuning-guides/w6000-v620.md) * [GPU-enabled MPI](./how-to/gpu-enabled-mpi.rst) * [Using compiler features](./conceptual/compiler-topics.md) - * [Using AddressSanitizer](./conceptual/using-gpu-sanitizer.md) - * [Compiler disambiguation](./conceptual/compiler-disambiguation.md) - * [OpenMP support in ROCm](./about/compatibility/openmp.md) + * [ROCm compiler infrastructure](https://rocm.docs.amd.com/projects/llvm-project/en/latest/index.html) + * [Using AddressSanitizer](https://rocm.docs.amd.com/projects/llvm-project/en/latest/conceptual/using-gpu-sanitizer.html) + * [OpenMP support](https://rocm.docs.amd.com/projects/llvm-project/en/latest/conceptual/openmp.html) * [Setting the number of CUs](./how-to/setting-cus) * [System level debugging](./how-to/system-debugging.md) * [GitHub examples](https://github.com/amd/rocm-examples) diff --git a/docs/reference/rocm-tools.md b/docs/reference/rocm-tools.md index 9cc080b62..7c2c0ce0b 100644 --- a/docs/reference/rocm-tools.md +++ b/docs/reference/rocm-tools.md @@ -19,10 +19,10 @@ :img-alt: Development tools :padding: 2 +* [ROCm Compilers](https://rocm.docs.amd.com/projects/llvm-project/en/latest/reference/rocmcc.html) * {doc}`HIPIFY ` -* {doc}`ROCdbgapi ` -* [ROCmCC](./rocmcc.md) * {doc}`ROCm Debugger (ROCgdb) ` +* {doc}`ROCdbgapi ` * {doc}`ROCr Debug Agent ` ::: diff --git a/docs/sphinx/_toc.yml.in b/docs/sphinx/_toc.yml.in index aa7029071..74d68120e 100644 --- a/docs/sphinx/_toc.yml.in +++ b/docs/sphinx/_toc.yml.in @@ -93,11 +93,11 @@ subtrees: title: Using compiler features subtrees: - entries: - - file: conceptual/using-gpu-sanitizer.md + - url: https://rocm.docs.amd.com/projects/llvm-project/en/latest/index.html + title: ROCm compiler infrastructure + - url: https://rocm.docs.amd.com/projects/llvm-project/en/latest/conceptual/using-gpu-sanitizer.html title: Using AddressSanitizer - - file: conceptual/compiler-disambiguation.md - title: Compiler disambiguation - - file: about/compatibility/openmp.md + - url: https://rocm.docs.amd.com/projects/llvm-project/en/latest/conceptual/openmp.html title: OpenMP support - file: how-to/setting-cus title: Setting the number of CUs diff --git a/docs/what-is-rocm.rst b/docs/what-is-rocm.rst index 08f367d0e..5303c39e8 100644 --- a/docs/what-is-rocm.rst +++ b/docs/what-is-rocm.rst @@ -44,8 +44,8 @@ Machine Learning & Computer Vision ":doc:`MIGraphX `", "Graph inference engine that accelerates machine learning model inference" ":doc:`MIOpen `", "An open source deep-learning library" ":doc:`MIVisionX `", "Set of comprehensive computer vision and machine learning libraries, utilities, and applications" - ":doc:`rocAL `", "An augmentation library designed to decode and process images and videos" - ":doc:`rocDecode `", "High-performance SDK for access to video decoding features on AMD GPUs" + ":doc:`rocAL `", "An augmentation library designed to decode and process images and videos" + ":doc:`rocDecode `", "High-performance SDK for access to video decoding features on AMD GPUs" ":doc:`ROCm Performance Primitives (RPP) `", "Comprehensive high-performance computer vision library for AMD processors with HIP/OpenCL/CPU back-ends" Communication @@ -100,7 +100,7 @@ Tools ":doc:`AMD SMI `", "C library for Linux that provides a user space interface for applications to monitor and control AMD devices" ":doc:`HIPIFY `", "Translates CUDA source code into portable HIP C++" ":doc:`ROCdbgapi `", "ROCm debugger API library" - ":doc:`ROCmCC <./reference/rocmcc>`", "Clang/LLVM-based compiler" + "`ROCm Compilers `_", "Clang/LLVM-based compilers" ":doc:`rocminfo `", "Reports system information" ":doc:`ROCProfiler `", "Profiling tool for HIP applications" ":doc:`ROCTracer `", "Intercepts runtime API calls and traces asynchronous activity" @@ -120,7 +120,7 @@ Compilers :header: "Component", "Description" "`FLANG `_", "An out-of-tree Fortran compiler targeting LLVM" - ":doc:`hipCC `", "Compiler driver utility that calls Clang or NVCC and passes the appropriate include and library options for the target compiler and HIP infrastructure" + "`HIPCC `_", "Compiler driver utility that calls Clang or NVCC and passes the appropriate include and library options for the target compiler and HIP infrastructure" "`LLVM (amdclang) `_ ", "Toolkit for the construction of highly optimized compilers, optimizers, and runtime environments" Runtimes @@ -129,6 +129,6 @@ Runtimes .. csv-table:: :header: "Component", "Description" - "`AMD Common Language Runtime (CLR) `_", "Contains source code for AMD's common language runtimes: :doc:`HIP ` and OpenCL" + "`AMD Common Language Runtime (CLR) `_", "Contains source code for AMD's `common language runtimes (CLR) `_ HIP and OpenCL" ":doc:`HIP `", "AMD's GPU programming language extension and the GPU runtime" ":doc:`ROCR-Runtime `", "User-mode API interfaces and libraries necessary for host applications to launch compute kernels on available HSA ROCm kernel agents" From be4ed8cd84c6f86e9fb40fe28ec249cd72763293 Mon Sep 17 00:00:00 2001 From: Sam Wu <22262939+samjwu@users.noreply.github.com> Date: Thu, 4 Jul 2024 09:32:12 -0600 Subject: [PATCH 04/21] Add new sections for changelog template (#103) --- RELEASE.md | 126 +++++++++--------- tools/autotag/README.md | 4 +- tools/autotag/templates/changelog.jinja | 21 ++- .../6.1.2.md | 17 --- .../{rocm_changes => highlights}/5.0.0.md | 0 .../{rocm_changes => highlights}/5.0.1.md | 0 .../{rocm_changes => highlights}/5.0.2.md | 0 .../{rocm_changes => highlights}/5.1.0.md | 0 .../{rocm_changes => highlights}/5.2.0.md | 0 .../{rocm_changes => highlights}/5.2.3.md | 0 .../{rocm_changes => highlights}/5.3.0.md | 0 .../{rocm_changes => highlights}/5.3.2.md | 0 .../{rocm_changes => highlights}/5.3.3.md | 0 .../{rocm_changes => highlights}/5.4.0.md | 0 .../{rocm_changes => highlights}/5.4.1.md | 0 .../{rocm_changes => highlights}/5.4.2.md | 0 .../{rocm_changes => highlights}/5.4.3.md | 0 .../{rocm_changes => highlights}/5.5.0.md | 0 .../{rocm_changes => highlights}/5.5.1.md | 0 .../{rocm_changes => highlights}/5.6.0.md | 0 .../{rocm_changes => highlights}/5.6.1.md | 0 .../{rocm_changes => highlights}/5.7.0.md | 0 .../{rocm_changes => highlights}/5.7.1.md | 0 .../{rocm_changes => highlights}/6.0.0.md | 0 .../{rocm_changes => highlights}/6.0.2.md | 0 .../{rocm_changes => highlights}/6.1.0.md | 0 .../{rocm_changes => highlights}/6.1.1.md | 0 tools/autotag/templates/highlights/6.1.2.md | 1 + tools/autotag/templates/support/6.1.2.md | 3 + .../templates/upcoming_changes/6.1.2.md | 9 ++ 30 files changed, 95 insertions(+), 86 deletions(-) rename tools/autotag/templates/{rocm_changes => extra_components}/6.1.2.md (61%) rename tools/autotag/templates/{rocm_changes => highlights}/5.0.0.md (100%) rename tools/autotag/templates/{rocm_changes => highlights}/5.0.1.md (100%) rename tools/autotag/templates/{rocm_changes => highlights}/5.0.2.md (100%) rename tools/autotag/templates/{rocm_changes => highlights}/5.1.0.md (100%) rename tools/autotag/templates/{rocm_changes => highlights}/5.2.0.md (100%) rename tools/autotag/templates/{rocm_changes => highlights}/5.2.3.md (100%) rename tools/autotag/templates/{rocm_changes => highlights}/5.3.0.md (100%) rename tools/autotag/templates/{rocm_changes => highlights}/5.3.2.md (100%) rename tools/autotag/templates/{rocm_changes => highlights}/5.3.3.md (100%) rename tools/autotag/templates/{rocm_changes => highlights}/5.4.0.md (100%) rename tools/autotag/templates/{rocm_changes => highlights}/5.4.1.md (100%) rename tools/autotag/templates/{rocm_changes => highlights}/5.4.2.md (100%) rename tools/autotag/templates/{rocm_changes => highlights}/5.4.3.md (100%) rename tools/autotag/templates/{rocm_changes => highlights}/5.5.0.md (100%) rename tools/autotag/templates/{rocm_changes => highlights}/5.5.1.md (100%) rename tools/autotag/templates/{rocm_changes => highlights}/5.6.0.md (100%) rename tools/autotag/templates/{rocm_changes => highlights}/5.6.1.md (100%) rename tools/autotag/templates/{rocm_changes => highlights}/5.7.0.md (100%) rename tools/autotag/templates/{rocm_changes => highlights}/5.7.1.md (100%) rename tools/autotag/templates/{rocm_changes => highlights}/6.0.0.md (100%) rename tools/autotag/templates/{rocm_changes => highlights}/6.0.2.md (100%) rename tools/autotag/templates/{rocm_changes => highlights}/6.1.0.md (100%) rename tools/autotag/templates/{rocm_changes => highlights}/6.1.1.md (100%) create mode 100644 tools/autotag/templates/highlights/6.1.2.md create mode 100644 tools/autotag/templates/support/6.1.2.md create mode 100644 tools/autotag/templates/upcoming_changes/6.1.2.md diff --git a/RELEASE.md b/RELEASE.md index 7739868e2..8a23c474e 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -21,69 +21,7 @@ ROCm 6.1.2 includes enhancements to SMI tools and improvements to some libraries ### OS support -ROCm 6.1.2 has been tested against a pre-release version of Ubuntu 22.04.5 (kernel: 5.15 [GA], 6.8 [HWE]). - -### AMD SMI - -AMD SMI for ROCm 6.1.2 - -#### Additions - -* Added process isolation and clean shader APIs and CLI commands. - * `amdsmi_get_gpu_process_isolation()` - * `amdsmi_set_gpu_process_isolation()` - * `amdsmi_set_gpu_clear_sram_data()` -* Added the `MIN_POWER` metric to output provided by `amd-smi static --limit`. - -#### Optimizations - -* Updated the `amd-smi monitor --pcie` output to prevent delays with the `monitor` command. - -#### Changes - -* Updated `amismi_get_power_cap_info` to return values in uW instead of W. -* Updated Python library return types for `amdsmi_get_gpu_memory_reserved_pages` and `amdsmi_get_gpu_bad_page_info`. -* Updated the output of `amd-smi metric --ecc-blocks` to show counters available from blocks. - -#### Fixes - -* `amdsmi_get_gpu_board_info()` no longer returns junk character strings. -* `amd-smi metric --power` now correctly details power output for RDNA3, RDNA2, and MI1x devices. -* Fixed the `amdsmitstReadWrite.TestPowerCapReadWrite` test for RDNA3, RDNA2, and MI100 devices. -* Fixed an issue with the `amdsmi_get_gpu_memory_reserved_pages` and `amdsmi_get_gpu_bad_page_info` Python interface calls. - -#### Removals - -* Removed the `amdsmi_get_gpu_process_info` API from the Python library. It was removed from the C library in an earlier release. - -```{note} -See the AMD SMI [detailed changelog](https://github.com/ROCm/amdsmi/blob/rocm-6.1.x/CHANGELOG.md) with code samples for more information. -``` - -### HIPCC - -HIPCC for ROCm 6.1.2 - -#### Changes - -* **Upcoming:** a future release will enable use of compiled binaries `hipcc.bin` and `hipconfig.bin` by default. No action is needed by users; you may continue calling high-level Perl scripts `hipcc` and `hipconfig`. `hipcc.bin` and `hipconfig.bin` will be invoked by the high-level Perl scripts. To revert to the previous behavior and invoke `hipcc.pl` and `hipconfig.pl`, set the `HIP_USE_PERL_SCRIPTS` environment variable to `1`. -* **Upcoming:** a subsequent release will remove high-level Perl scripts `hipcc` and `hipconfig`. This release will remove the `HIP_USE_PERL_SCRIPTS` environment variable. It will rename `hipcc.bin` and `hipconfig.bin` to `hipcc` and `hipconfig` respectively. No action is needed by the users. To revert to the previous behavior, invoke `hipcc.pl` and `hipconfig.pl` explicitly. -* **Upcoming:** a subsequent release will remove `hipcc.pl` and `hipconfig.pl`. - -### ROCm SMI - -ROCm SMI for ROCm 6.1.2 - -#### Additions - -* Added the ring hang event to the `amdsmi_evt_notification_type_t` enum. - -#### Fixes - -* Fixed an issue causing ROCm SMI to incorrectly report GPU utilization for RDNA3 GPUs. See the issue on [GitHub](https://github.com/ROCm/ROCm/issues/3112). -* Fixed the parsing of `pp_od_clk_voltage` in `get_od_clk_volt_info` to work better with MI-series hardware. - -### Library changes in ROCm 6.1.2 +ROCm 6.1.2 has been tested against a pre-release version of Ubuntu 22.04.5 (kernel: 5.15 [GA], 6.8 [HWE]).### Library changes in ROCm 6.1.2 | Category | Group | Name | Version | Repository | |----------|-------|------|---------|------------| @@ -679,3 +617,65 @@ Tensile 4.40.0 for ROCm 6.1.2 - mismatch issue with LdsPad + LdsBlockSizePerPad!=0 and SplitLds - incorrect reject condition check for DirectToLds + LdsBlockSizePerPad=-1 case - small fix for LdsPad optimization (LdsElement calculation) + +### AMD SMI + +AMD SMI for ROCm 6.1.2 + +#### Additions + +* Added process isolation and clean shader APIs and CLI commands. + * `amdsmi_get_gpu_process_isolation()` + * `amdsmi_set_gpu_process_isolation()` + * `amdsmi_set_gpu_clear_sram_data()` +* Added the `MIN_POWER` metric to output provided by `amd-smi static --limit`. + +#### Optimizations + +* Updated the `amd-smi monitor --pcie` output to prevent delays with the `monitor` command. + +#### Changes + +* Updated `amismi_get_power_cap_info` to return values in uW instead of W. +* Updated Python library return types for `amdsmi_get_gpu_memory_reserved_pages` and `amdsmi_get_gpu_bad_page_info`. +* Updated the output of `amd-smi metric --ecc-blocks` to show counters available from blocks. + +#### Fixes + +* `amdsmi_get_gpu_board_info()` no longer returns junk character strings. +* `amd-smi metric --power` now correctly details power output for RDNA3, RDNA2, and MI1x devices. +* Fixed the `amdsmitstReadWrite.TestPowerCapReadWrite` test for RDNA3, RDNA2, and MI100 devices. +* Fixed an issue with the `amdsmi_get_gpu_memory_reserved_pages` and `amdsmi_get_gpu_bad_page_info` Python interface calls. + +#### Removals + +* Removed the `amdsmi_get_gpu_process_info` API from the Python library. It was removed from the C library in an earlier release. + +```{note} +See the AMD SMI [detailed changelog](https://github.com/ROCm/amdsmi/blob/rocm-6.1.x/CHANGELOG.md) with code samples for more information. +``` + +### ROCm SMI + +ROCm SMI for ROCm 6.1.2 + +#### Additions + +* Added the ring hang event to the `amdsmi_evt_notification_type_t` enum. + +#### Fixes + +* Fixed an issue causing ROCm SMI to incorrectly report GPU utilization for RDNA3 GPUs. See the issue on [GitHub](https://github.com/ROCm/ROCm/issues/3112). +* Fixed the parsing of `pp_od_clk_voltage` in `get_od_clk_volt_info` to work better with MI-series hardware. + + + +### HIPCC + +HIPCC for ROCm 6.1.2 + +#### Changes + +* **Upcoming:** a future release will enable use of compiled binaries `hipcc.bin` and `hipconfig.bin` by default. No action is needed by users; you may continue calling high-level Perl scripts `hipcc` and `hipconfig`. `hipcc.bin` and `hipconfig.bin` will be invoked by the high-level Perl scripts. To revert to the previous behavior and invoke `hipcc.pl` and `hipconfig.pl`, set the `HIP_USE_PERL_SCRIPTS` environment variable to `1`. +* **Upcoming:** a subsequent release will remove high-level Perl scripts `hipcc` and `hipconfig`. This release will remove the `HIP_USE_PERL_SCRIPTS` environment variable. It will rename `hipcc.bin` and `hipconfig.bin` to `hipcc` and `hipconfig` respectively. No action is needed by the users. To revert to the previous behavior, invoke `hipcc.pl` and `hipconfig.pl` explicitly. +* **Upcoming:** a subsequent release will remove `hipcc.pl` and `hipconfig.pl`. diff --git a/tools/autotag/README.md b/tools/autotag/README.md index 9660fa86c..28f69acab 100755 --- a/tools/autotag/README.md +++ b/tools/autotag/README.md @@ -13,9 +13,9 @@ ## Updating the changelog and release notes -> IMPORTANT: It is key to update the template Markdown files in `tools/autotag/templates/rocm_changes` (eg: `5.6.0.md`) and not the `CHANGELOG.md` or `RELEASE.md` itself to ensure that updates are not overwritten by the autotag script. The template should only have content from changelogs that are not included by the script to avoid duplicating data. +> IMPORTANT: It is key to update the template Markdown files in `tools/autotag/templates/` (eg: `5.6.0.md`) and not the `CHANGELOG.md` or `RELEASE.md` itself to ensure that updates are not overwritten by the autotag script. The template should only have content from changelogs that are not included by the script to avoid duplicating data. -* Add or update the release specific notes in `tools/autotag/templates/rocm_changes` +* Add or update the release specific notes in `tools/autotag/templates/` * Ensure the all the repositories have their release specific branch with the updated changelogs * Run this for 5.6.0 (change for whatever version you require) * `GITHUB_ACCESS_TOKEN=my_token_here` diff --git a/tools/autotag/templates/changelog.jinja b/tools/autotag/templates/changelog.jinja index f6ab9eb09..7a5adb4a0 100644 --- a/tools/autotag/templates/changelog.jinja +++ b/tools/autotag/templates/changelog.jinja @@ -23,9 +23,12 @@ This page contains the release notes for AMD ROCm™ Software. ------------------- ## ROCm {{version}} - -{%- set rocm_changes = "./rocm_changes/" ~ version ~ ".md" %} -{% include rocm_changes ignore missing %} +{{- "\n\n" -}} +{%- set highlights = "./highlights/" ~ version ~ ".md" %} +{%- include highlights ignore missing -%} +{{- "\n\n" -}} +{%- set support = "./support/" ~ version ~ ".md" %} +{%- include support ignore missing -%} ### Library changes in ROCm {{version}} @@ -54,7 +57,17 @@ This page contains the release notes for AMD ROCm™ Software. {{change|trim|e}} {%- endfor %}{# change in lib.data.changes #} -{%- endif %} +{%- endif -%} {%- endfor %}{# lib in release.libraries #} +{{- "\n\n" -}} +{%- set extra_components = "./extra_components/" ~ version ~ ".md" %} +{%- include extra_components ignore missing -%} +{{- "\n\n" -}} +{%- set known_issues = "./known_issues/" ~ version ~ ".md" %} +{%- include known_issues ignore missing -%} +{{- "\n\n" -}} +{%- set upcoming_changes = "./upcoming_changes/" ~ version ~ ".md" %} +{%- include upcoming_changes ignore missing -%} + {%- endfor %}{# release in releases #} {# EOF #} diff --git a/tools/autotag/templates/rocm_changes/6.1.2.md b/tools/autotag/templates/extra_components/6.1.2.md similarity index 61% rename from tools/autotag/templates/rocm_changes/6.1.2.md rename to tools/autotag/templates/extra_components/6.1.2.md index dbc86f447..257ac6efe 100644 --- a/tools/autotag/templates/rocm_changes/6.1.2.md +++ b/tools/autotag/templates/extra_components/6.1.2.md @@ -1,10 +1,3 @@ - -ROCm 6.1.2 includes enhancements to SMI tools and improvements to some libraries. - -### OS support - -ROCm 6.1.2 has been tested against a pre-release version of Ubuntu 22.04.5 (kernel: 5.15 [GA], 6.8 [HWE]). - ### AMD SMI AMD SMI for ROCm 6.1.2 @@ -42,16 +35,6 @@ AMD SMI for ROCm 6.1.2 See the AMD SMI [detailed changelog](https://github.com/ROCm/amdsmi/blob/rocm-6.1.x/CHANGELOG.md) with code samples for more information. ``` -### HIPCC - -HIPCC for ROCm 6.1.2 - -#### Changes - -* **Upcoming:** a future release will enable use of compiled binaries `hipcc.bin` and `hipconfig.bin` by default. No action is needed by users; you may continue calling high-level Perl scripts `hipcc` and `hipconfig`. `hipcc.bin` and `hipconfig.bin` will be invoked by the high-level Perl scripts. To revert to the previous behavior and invoke `hipcc.pl` and `hipconfig.pl`, set the `HIP_USE_PERL_SCRIPTS` environment variable to `1`. -* **Upcoming:** a subsequent release will remove high-level Perl scripts `hipcc` and `hipconfig`. This release will remove the `HIP_USE_PERL_SCRIPTS` environment variable. It will rename `hipcc.bin` and `hipconfig.bin` to `hipcc` and `hipconfig` respectively. No action is needed by the users. To revert to the previous behavior, invoke `hipcc.pl` and `hipconfig.pl` explicitly. -* **Upcoming:** a subsequent release will remove `hipcc.pl` and `hipconfig.pl`. - ### ROCm SMI ROCm SMI for ROCm 6.1.2 diff --git a/tools/autotag/templates/rocm_changes/5.0.0.md b/tools/autotag/templates/highlights/5.0.0.md similarity index 100% rename from tools/autotag/templates/rocm_changes/5.0.0.md rename to tools/autotag/templates/highlights/5.0.0.md diff --git a/tools/autotag/templates/rocm_changes/5.0.1.md b/tools/autotag/templates/highlights/5.0.1.md similarity index 100% rename from tools/autotag/templates/rocm_changes/5.0.1.md rename to tools/autotag/templates/highlights/5.0.1.md diff --git a/tools/autotag/templates/rocm_changes/5.0.2.md b/tools/autotag/templates/highlights/5.0.2.md similarity index 100% rename from tools/autotag/templates/rocm_changes/5.0.2.md rename to tools/autotag/templates/highlights/5.0.2.md diff --git a/tools/autotag/templates/rocm_changes/5.1.0.md b/tools/autotag/templates/highlights/5.1.0.md similarity index 100% rename from tools/autotag/templates/rocm_changes/5.1.0.md rename to tools/autotag/templates/highlights/5.1.0.md diff --git a/tools/autotag/templates/rocm_changes/5.2.0.md b/tools/autotag/templates/highlights/5.2.0.md similarity index 100% rename from tools/autotag/templates/rocm_changes/5.2.0.md rename to tools/autotag/templates/highlights/5.2.0.md diff --git a/tools/autotag/templates/rocm_changes/5.2.3.md b/tools/autotag/templates/highlights/5.2.3.md similarity index 100% rename from tools/autotag/templates/rocm_changes/5.2.3.md rename to tools/autotag/templates/highlights/5.2.3.md diff --git a/tools/autotag/templates/rocm_changes/5.3.0.md b/tools/autotag/templates/highlights/5.3.0.md similarity index 100% rename from tools/autotag/templates/rocm_changes/5.3.0.md rename to tools/autotag/templates/highlights/5.3.0.md diff --git a/tools/autotag/templates/rocm_changes/5.3.2.md b/tools/autotag/templates/highlights/5.3.2.md similarity index 100% rename from tools/autotag/templates/rocm_changes/5.3.2.md rename to tools/autotag/templates/highlights/5.3.2.md diff --git a/tools/autotag/templates/rocm_changes/5.3.3.md b/tools/autotag/templates/highlights/5.3.3.md similarity index 100% rename from tools/autotag/templates/rocm_changes/5.3.3.md rename to tools/autotag/templates/highlights/5.3.3.md diff --git a/tools/autotag/templates/rocm_changes/5.4.0.md b/tools/autotag/templates/highlights/5.4.0.md similarity index 100% rename from tools/autotag/templates/rocm_changes/5.4.0.md rename to tools/autotag/templates/highlights/5.4.0.md diff --git a/tools/autotag/templates/rocm_changes/5.4.1.md b/tools/autotag/templates/highlights/5.4.1.md similarity index 100% rename from tools/autotag/templates/rocm_changes/5.4.1.md rename to tools/autotag/templates/highlights/5.4.1.md diff --git a/tools/autotag/templates/rocm_changes/5.4.2.md b/tools/autotag/templates/highlights/5.4.2.md similarity index 100% rename from tools/autotag/templates/rocm_changes/5.4.2.md rename to tools/autotag/templates/highlights/5.4.2.md diff --git a/tools/autotag/templates/rocm_changes/5.4.3.md b/tools/autotag/templates/highlights/5.4.3.md similarity index 100% rename from tools/autotag/templates/rocm_changes/5.4.3.md rename to tools/autotag/templates/highlights/5.4.3.md diff --git a/tools/autotag/templates/rocm_changes/5.5.0.md b/tools/autotag/templates/highlights/5.5.0.md similarity index 100% rename from tools/autotag/templates/rocm_changes/5.5.0.md rename to tools/autotag/templates/highlights/5.5.0.md diff --git a/tools/autotag/templates/rocm_changes/5.5.1.md b/tools/autotag/templates/highlights/5.5.1.md similarity index 100% rename from tools/autotag/templates/rocm_changes/5.5.1.md rename to tools/autotag/templates/highlights/5.5.1.md diff --git a/tools/autotag/templates/rocm_changes/5.6.0.md b/tools/autotag/templates/highlights/5.6.0.md similarity index 100% rename from tools/autotag/templates/rocm_changes/5.6.0.md rename to tools/autotag/templates/highlights/5.6.0.md diff --git a/tools/autotag/templates/rocm_changes/5.6.1.md b/tools/autotag/templates/highlights/5.6.1.md similarity index 100% rename from tools/autotag/templates/rocm_changes/5.6.1.md rename to tools/autotag/templates/highlights/5.6.1.md diff --git a/tools/autotag/templates/rocm_changes/5.7.0.md b/tools/autotag/templates/highlights/5.7.0.md similarity index 100% rename from tools/autotag/templates/rocm_changes/5.7.0.md rename to tools/autotag/templates/highlights/5.7.0.md diff --git a/tools/autotag/templates/rocm_changes/5.7.1.md b/tools/autotag/templates/highlights/5.7.1.md similarity index 100% rename from tools/autotag/templates/rocm_changes/5.7.1.md rename to tools/autotag/templates/highlights/5.7.1.md diff --git a/tools/autotag/templates/rocm_changes/6.0.0.md b/tools/autotag/templates/highlights/6.0.0.md similarity index 100% rename from tools/autotag/templates/rocm_changes/6.0.0.md rename to tools/autotag/templates/highlights/6.0.0.md diff --git a/tools/autotag/templates/rocm_changes/6.0.2.md b/tools/autotag/templates/highlights/6.0.2.md similarity index 100% rename from tools/autotag/templates/rocm_changes/6.0.2.md rename to tools/autotag/templates/highlights/6.0.2.md diff --git a/tools/autotag/templates/rocm_changes/6.1.0.md b/tools/autotag/templates/highlights/6.1.0.md similarity index 100% rename from tools/autotag/templates/rocm_changes/6.1.0.md rename to tools/autotag/templates/highlights/6.1.0.md diff --git a/tools/autotag/templates/rocm_changes/6.1.1.md b/tools/autotag/templates/highlights/6.1.1.md similarity index 100% rename from tools/autotag/templates/rocm_changes/6.1.1.md rename to tools/autotag/templates/highlights/6.1.1.md diff --git a/tools/autotag/templates/highlights/6.1.2.md b/tools/autotag/templates/highlights/6.1.2.md new file mode 100644 index 000000000..f9c8fb41b --- /dev/null +++ b/tools/autotag/templates/highlights/6.1.2.md @@ -0,0 +1 @@ +ROCm 6.1.2 includes enhancements to SMI tools and improvements to some libraries. diff --git a/tools/autotag/templates/support/6.1.2.md b/tools/autotag/templates/support/6.1.2.md new file mode 100644 index 000000000..e73f45dbc --- /dev/null +++ b/tools/autotag/templates/support/6.1.2.md @@ -0,0 +1,3 @@ +### OS support + +ROCm 6.1.2 has been tested against a pre-release version of Ubuntu 22.04.5 (kernel: 5.15 [GA], 6.8 [HWE]). diff --git a/tools/autotag/templates/upcoming_changes/6.1.2.md b/tools/autotag/templates/upcoming_changes/6.1.2.md new file mode 100644 index 000000000..4034c5f9d --- /dev/null +++ b/tools/autotag/templates/upcoming_changes/6.1.2.md @@ -0,0 +1,9 @@ +### HIPCC + +HIPCC for ROCm 6.1.2 + +#### Changes + +* **Upcoming:** a future release will enable use of compiled binaries `hipcc.bin` and `hipconfig.bin` by default. No action is needed by users; you may continue calling high-level Perl scripts `hipcc` and `hipconfig`. `hipcc.bin` and `hipconfig.bin` will be invoked by the high-level Perl scripts. To revert to the previous behavior and invoke `hipcc.pl` and `hipconfig.pl`, set the `HIP_USE_PERL_SCRIPTS` environment variable to `1`. +* **Upcoming:** a subsequent release will remove high-level Perl scripts `hipcc` and `hipconfig`. This release will remove the `HIP_USE_PERL_SCRIPTS` environment variable. It will rename `hipcc.bin` and `hipconfig.bin` to `hipcc` and `hipconfig` respectively. No action is needed by the users. To revert to the previous behavior, invoke `hipcc.pl` and `hipconfig.pl` explicitly. +* **Upcoming:** a subsequent release will remove `hipcc.pl` and `hipconfig.pl`. From b601290c285a6f2a16312e371ace8046f3d58b7b Mon Sep 17 00:00:00 2001 From: randyh62 <42045079+randyh62@users.noreply.github.com> Date: Thu, 4 Jul 2024 09:23:23 -0700 Subject: [PATCH 05/21] Framework image update (#104) * added professional graphic to replace hand modified * Update deep-learning-rocm.rst update image reference * Delete docs/data/how-to/framework_install_2024_05_23-update.png replace with renamed file with correct date * Add files via upload updated dat in file name * Update deep-learning-rocm.rst corrected image name to reflect new date * Update deep-learning-rocm.rst corrected file name * Add files via upload correct name * Delete docs/data/how-to/framework_install_2024_07-04.png name format incorrect * Update deep-learning-rocm.rst correct image name --- .../how-to/framework_install_2024_07_04.png | Bin 0 -> 100225 bytes docs/how-to/deep-learning-rocm.rst | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 docs/data/how-to/framework_install_2024_07_04.png diff --git a/docs/data/how-to/framework_install_2024_07_04.png b/docs/data/how-to/framework_install_2024_07_04.png new file mode 100644 index 0000000000000000000000000000000000000000..92be00d83f8bfcc905ec36f8fba4488c8db9ba6d GIT binary patch literal 100225 zcmeFY1ys~s*EdXecL)sKFf>D#lprY~APzG_2n;YoO1B~n0!o8{h$tWp(ybr{Egd2a z0@B|fjO)7NeV^xD-?yH3eQVt;g>%k-pM7ed{o8w=bM6{m)gmQgBErDHAl1>o7Gc{;fv(Le=^;a?SaE-Ki$q5e$;*dOX=Fn}W80s6Bf zw9x)%%K3aWA_%yXCj#z@cC+{Nfuazq4hW>Dt18^h4gu11LLuy3{5;@J4o;p>7ZW!x z6bxbN=Z^3-arE?bmlG9*d5bu?d%{HAP!6IWV;~bG8S$LXl4P00|80;$V+6 z7hM&Hx%}%2z+9kCt^hga)Ok0H9N{oIPbW_ogqs!ui9kVtSqC|}LLCrJzz2Iblq=NJ z=^`)cj&!)?gaihHgdub^eEED`-9?-Lagx@QmXHL?$cn4Us*8zT)|7>)imOR!YRbrJ zib15o;%*l$+5#(h&fX2>t8}rBwuX*wo^EJIH+NBSDG@0VFbI0Syte1dFA5fs5s?-a z2c2hxQD`6!(1;7WLp@=Rp8v$p)(L6v7TR<%p>97#6fZ>X&!<~|Np)BO%nRk>%lpr?e^H2D)cqyIzgA7xsipC(Xi^pI z`-W@n?GG`zmO=P^Ni&Z;QfIshnNKf&GUflTnEnx}Uu;L3O9jk6f_`joiEMTFKJ3Gz z8FDv_@PEg>-CZ;lP@DTV@xj0VQ~VNzpHeFh`!~Dy&xiqW5S>03hYt~!B&`LQvRn-8 zVU~Cl;4nNAa2WRYJZvmXEG&xPZBMqr&Pnyk)Z6h0_naIsDITFfly=lUDJCW{E(X|3 zj2KLahkXqPj~eTmi5MrC{X9cN&Gd6sO#INE2v;;n2MKdSxw~D+nivb1`J9NDn&u~w zDas4&2{J*Tyq#bOv=|2%bp9Een(^1lqTJwKu)hdES`uJZdQx#ou$Y(__~Pd}kd*?m zU~vg4h!o^HI9QAlOn$+Iga8J05_Si8h*5(nFFHp;^pi2rDUsiF_#^}-P$Wp#4UPCs zM?gZP4s~$?HU!cM`j5i|fm#1d10g0I<#`is?r0V0xj2geItCnu$?^B8!oj`C@^0e^`>r{xWn}GR<=5A=}t{liS_OiG3eSW_3D3M)xaahf6LsRysa3 O* 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 literal 0 HcmV?d00001 diff --git a/docs/how-to/deep-learning-rocm.rst b/docs/how-to/deep-learning-rocm.rst index f33d7c912..700057158 100644 --- a/docs/how-to/deep-learning-rocm.rst +++ b/docs/how-to/deep-learning-rocm.rst @@ -19,7 +19,7 @@ The following guides cover installation processes for ROCm-aware deep learning f The following chart steps through typical installation workflows for installing deep learning frameworks for ROCm. -.. image:: ../data/how-to/framework_install_2024_05_23.png +.. image:: ../data/how-to/framework_install_2024_07_04.png :alt: Flowchart for installing ROCm-aware machine learning frameworks :align: center From 2a34212dddb987189b587859b992498433d3e84b Mon Sep 17 00:00:00 2001 From: randyh62 <42045079+randyh62@users.noreply.github.com> Date: Tue, 16 Jul 2024 09:17:34 -0700 Subject: [PATCH 06/21] reorg ROCm landing page (#112) * reorg ROCm landing page * Conceptual --- docs/index.md | 98 ++++++++++++--------------------- docs/reference/api-libraries.md | 2 +- docs/reference/rocm-tools.md | 2 +- docs/sphinx/_toc.yml.in | 50 +++++++++-------- 4 files changed, 64 insertions(+), 88 deletions(-) diff --git a/docs/index.md b/docs/index.md index 7a1201726..20bbfc47a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -5,53 +5,34 @@ reference, ROCm, AMD"> -# AMD ROCm™ documentation +# AMD ROCm documentation -Welcome to the ROCm docs home page! If you're new to ROCm, you can review the following -resources to learn more about our products and what we support: +ROCm is an open-source software platform optimized to extract HPC and AI workload +performance from AMD Instinct accelerators and AMD Radeon GPUs while maintaining +compatibility with industry software frameworks. For more information, see [What is ROCm?](./what-is-rocm.rst) -* [What is ROCm?](./what-is-rocm.rst) -* [Release notes](./about/release-notes.md) +If you're using Radeon GPUs, consider reviewing {doc}`Radeon-specific ROCm documentation`. -You can install ROCm on our Radeon™, Radeon™ PRO, and Instinct™ GPUs. If you're using Radeon -GPUs, we recommend reading the -{doc}`Radeon-specific ROCm documentation`. +Installation instructions are available from: -For hands-on applications, refer to our [ROCm blogs](https://rocm.blogs.amd.com/) site. +* {doc}`ROCm installation for Linux` +* {doc}`HIP SDK installation for Windows` +* [Deep learning frameworks installation](./how-to/deep-learning-rocm.rst) -Our documentation is organized into the following categories: +ROCm documentation is organized into the following categories: ::::{grid} 1 2 2 2 :class-container: rocm-doc-grid :::{grid-item-card} -:img-top: ./data/banner-installation.jpg -:img-alt: Install documentation -:padding: 2 - -* Linux - * {doc}`Quick start guide` - * {doc}`Linux install guide` - * {doc}`Package manager integration` - * {doc}`Install Docker containers` - * {doc}`ROCm & Spack` -* Windows - * {doc}`Windows install guide` - * {doc}`Application deployment guidelines` -* [Deep learning frameworks](./how-to/deep-learning-rocm.rst) - * {doc}`PyTorch for ROCm` - * {doc}`TensorFlow for ROCm` - * {doc}`JAX for ROCm` -::: - -:::{grid-item-card} +:class-card: sd-text-black :img-top: ./data/banner-compatibility.jpg :img-alt: Compatibility information :padding: 2 * [Compatibility matrix](./compatibility/compatibility-matrix.rst) -* {doc}`System requirements (Linux)` -* {doc}`System requirements (Windows)` +* {doc}`Linux system requirements` +* {doc}`Windows system requirements` * {doc}`Third-party support` * {doc}`User/kernel space` * {doc}`Docker` @@ -60,28 +41,8 @@ Our documentation is organized into the following categories: * {doc}`ROCm on Radeon GPUs` ::: - -:::{grid-item-card} -:img-top: ./data/banner-reference.jpg -:img-alt: Reference documentation -:padding: 2 - -* [API libraries](./reference/api-libraries.md) - * [Artificial intelligence](#artificial-intelligence-apis) - * [C++ primitives](#cpp-primitives) - * [Communication](#communication-libraries) - * [Math](#math-apis) - * [Random number generators](#random-number-apis) - * [HIP runtime](#hip-runtime) -* [Tools](./reference/rocm-tools.md) - * [Development](#development-tools) - * [Performance analysis](#performance-analysis) - * [System](#system-tools) -* [Hardware specifications](./reference/gpu-arch-specs.rst) -::: - - :::{grid-item-card} +:class-card: sd-text-black :img-top: ./data/banner-howto.jpg :img-alt: How-to documentation :padding: 2 @@ -90,28 +51,20 @@ Our documentation is organized into the following categories: * [Using ROCm for HPC](./how-to/rocm-for-hpc/index.rst) * [Fine-tuning LLMs and inference optimization](./how-to/llm-fine-tuning-optimization/index.rst) * [System tuning for various architectures](./how-to/tuning-guides.md) - * [MI100](./how-to/tuning-guides/mi100.md) - * [MI200](./how-to/tuning-guides/mi200.md) - * [RDNA2](./how-to/tuning-guides/w6000-v620.md) * [GPU-enabled MPI](./how-to/gpu-enabled-mpi.rst) -* [Using compiler features](./conceptual/compiler-topics.md) - * [ROCm compiler infrastructure](https://rocm.docs.amd.com/projects/llvm-project/en/latest/index.html) - * [Using AddressSanitizer](https://rocm.docs.amd.com/projects/llvm-project/en/latest/conceptual/using-gpu-sanitizer.html) - * [OpenMP support](https://rocm.docs.amd.com/projects/llvm-project/en/latest/conceptual/openmp.html) +* [Using advanced compiler features](./conceptual/compiler-topics.md) * [Setting the number of CUs](./how-to/setting-cus) * [System level debugging](./how-to/system-debugging.md) * [GitHub examples](https://github.com/amd/rocm-examples) ::: :::{grid-item-card} +:class-card: sd-text-black :img-top: ./data/banner-conceptual.jpg :img-alt: Conceptual documentation :padding: 2 * [GPU architecture](./conceptual/gpu-arch.md) - * [MI100](./conceptual/gpu-arch/mi100.md) - * [MI250](./conceptual/gpu-arch/mi250.md) - * [MI300](./conceptual/gpu-arch/mi300.md) * [GPU memory](./conceptual/gpu-memory.md) * [File structure (Linux FHS)](./conceptual/file-reorg.md) * [GPU isolation techniques](./conceptual/gpu-isolation.md) @@ -121,4 +74,23 @@ Our documentation is organized into the following categories: * [Inference optimization with MIGraphX](./conceptual/ai-migraphx-optimization.md) ::: + +:::{grid-item-card} +:class-card: sd-text-black +:img-top: ./data/banner-reference.jpg +:img-alt: Reference documentation +:padding: 2 + +* [Libraries](./reference/api-libraries.md) + * [Artificial intelligence](#artificial-intelligence-apis) + * [C++ primitives](#cpp-primitives) + * [Communication](#communication-libraries) + * [Math](#math-apis) + * [Random number generators](#random-number-apis) + * [HIP runtime](#hip-runtime) +* [ROCm tools and compilers](./reference/rocm-tools.md) +* [GPU hardware specifications](./reference/gpu-arch-specs.rst) +::: + + :::: diff --git a/docs/reference/api-libraries.md b/docs/reference/api-libraries.md index b3eb9c702..37cb6bb15 100644 --- a/docs/reference/api-libraries.md +++ b/docs/reference/api-libraries.md @@ -6,7 +6,7 @@ algebra, AMD"> -# ROCm API libraries +# ROCm libraries ::::{grid} 1 2 2 2 :class-container: rocm-doc-grid diff --git a/docs/reference/rocm-tools.md b/docs/reference/rocm-tools.md index 7c2c0ce0b..3707d60f3 100644 --- a/docs/reference/rocm-tools.md +++ b/docs/reference/rocm-tools.md @@ -6,7 +6,7 @@ algebra, AMD"> -# ROCm tools +# ROCm tools and compilers ::::{grid} 1 2 2 2 :class-container: rocm-doc-grid diff --git a/docs/sphinx/_toc.yml.in b/docs/sphinx/_toc.yml.in index 74d68120e..940c0fb17 100644 --- a/docs/sphinx/_toc.yml.in +++ b/docs/sphinx/_toc.yml.in @@ -9,6 +9,10 @@ subtrees: - file: what-is-rocm.rst - file: about/release-notes.md title: Release notes + subtrees: + - entries: + - file: about/changelog.md + title: Changelog - url: https://github.com/ROCm/ROCm/labels/Verified%20Issue title: Known issues @@ -21,28 +25,6 @@ subtrees: - file: how-to/deep-learning-rocm.md title: Deep learning frameworks -- caption: Compatibility - entries: - - file: compatibility/compatibility-matrix.rst - title: Compatibility matrix - - url: https://rocm.docs.amd.com/projects/install-on-linux/en/${branch}/reference/system-requirements.html - title: Linux - - url: https://rocm.docs.amd.com/projects/install-on-windows/en/${branch}/reference/system-requirements.html - title: Windows - - file: compatibility/precision-support.rst - title: Precision support - - url: https://rocm.docs.amd.com/projects/install-on-linux/en/${branch}/reference/3rd-party-support-matrix.html - title: Third-party - -- caption: Reference - entries: - - file: reference/api-libraries.md - title: API libraries - - file: reference/rocm-tools.md - title: Tools - - file: reference/gpu-arch-specs.rst - title: Hardware specifications - - caption: How to entries: - file: how-to/rocm-for-ai/index.rst @@ -90,7 +72,7 @@ subtrees: - file: how-to/gpu-enabled-mpi.rst title: Using MPI - file: conceptual/compiler-topics.md - title: Using compiler features + title: Using advanced compiler features subtrees: - entries: - url: https://rocm.docs.amd.com/projects/llvm-project/en/latest/index.html @@ -106,6 +88,19 @@ subtrees: - url: https://github.com/amd/rocm-examples title: GitHub examples +- caption: Compatibility + entries: + - file: compatibility/compatibility-matrix.rst + title: Compatibility matrix + - url: https://rocm.docs.amd.com/projects/install-on-linux/en/${branch}/reference/system-requirements.html + title: Linux + - url: https://rocm.docs.amd.com/projects/install-on-windows/en/${branch}/reference/system-requirements.html + title: Windows + - file: compatibility/precision-support.rst + title: Precision support + - url: https://rocm.docs.amd.com/projects/install-on-linux/en/${branch}/reference/3rd-party-support-matrix.html + title: Third-party + - caption: Conceptual entries: - file: conceptual/gpu-arch.md @@ -153,6 +148,15 @@ subtrees: - file: conceptual/ai-migraphx-optimization.md title: Inference optimization with MIGraphX +- caption: Reference + entries: + - file: reference/api-libraries.md + title: ROCm libraries + - file: reference/rocm-tools.md + title: Tools and compilers + - file: reference/gpu-arch-specs.rst + title: Hardware specifications + - caption: Contribute entries: - file: contribute/contributing.md From 867d8e294ef562b2957911d113406ae9a34852e1 Mon Sep 17 00:00:00 2001 From: Sam Wu <22262939+samjwu@users.noreply.github.com> Date: Wed, 17 Jul 2024 16:37:28 -0600 Subject: [PATCH 07/21] Set environment variables for RTD builds (#113) * Format conf.py with black and isort * Set env vars for RTD builds * Define html_context * Use rocm-stg for canonical url --- docs/conf.py | 45 +++++++++++++++++++-------------------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index d66ff3bc2..fadd426c8 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -4,9 +4,10 @@ # list see the documentation: # https://www.sphinx-doc.org/en/master/usage/configuration.html -import shutil -import jinja2 import os +import shutil + +import jinja2 # Environment to process Jinja templates. jinja_env = jinja2.Environment(loader=jinja2.FileSystemLoader(".")) @@ -18,10 +19,10 @@ templates = [] # For example: 'install.md.jinja' becomes 'install.md'. for template in templates: rendered = jinja_env.get_template(template).render() - with open(os.path.splitext(template)[0], 'w') as file: + with open(os.path.splitext(template)[0], "w") as file: file.write(rendered) -shutil.copy2('../RELEASE.md','./about/release-notes.md') +shutil.copy2("../RELEASE.md", "./about/release-notes.md") latex_engine = "xelatex" latex_elements = { @@ -44,24 +45,15 @@ all_article_info_author = "" # pages with specific settings article_pages = [ - { - "file":"about/release-notes", - "os":["linux", "windows"], - "date":"2024-06-04" - }, - { - "file":"about/changelog", - "os":["linux", "windows"], - "date":"2024-06-04" - }, - - {"file":"how-to/deep-learning-rocm", "os":["linux"]}, - {"file":"how-to/gpu-enabled-mpi", "os":["linux"]}, - {"file":"how-to/system-debugging", "os":["linux"]}, - {"file":"how-to/tuning-guides", "os":["linux", "windows"]}, + {"file": "about/release-notes", "os": ["linux", "windows"], "date": "2024-06-04"}, + {"file": "about/changelog", "os": ["linux", "windows"], "date": "2024-06-04"}, + {"file": "how-to/deep-learning-rocm", "os": ["linux"]}, + {"file": "how-to/gpu-enabled-mpi", "os": ["linux"]}, + {"file": "how-to/system-debugging", "os": ["linux"]}, + {"file": "how-to/tuning-guides", "os": ["linux", "windows"]}, ] -exclude_patterns = ['temp'] +exclude_patterns = ["temp"] external_toc_path = "./sphinx/_toc.yml" @@ -69,6 +61,11 @@ extensions = ["rocm_docs", "sphinx_reredirects"] external_projects_current_project = "rocm" +html_baseurl = os.environ.get("READTHEDOCS_CANONICAL_URL", "https://rocm-stg.amd.com") +html_context = {} +if os.environ.get("READTHEDOCS", "") == "True": + html_context["READTHEDOCS"] = True + html_theme = "rocm_docs_theme" html_theme_options = {"flavor": "rocm-docs-home"} @@ -77,10 +74,6 @@ html_css_files = ["rocm_custom.css"] html_title = "ROCm Documentation" -html_theme_options = { - "link_main_doc": False -} +html_theme_options = {"link_main_doc": False} -redirects = { - "reference/openmp/openmp": "../../about/compatibility/openmp.html" -} +redirects = {"reference/openmp/openmp": "../../about/compatibility/openmp.html"} From e800ec18471a596525186befeba2e984566cd0e4 Mon Sep 17 00:00:00 2001 From: Sam Wu <22262939+samjwu@users.noreply.github.com> Date: Thu, 18 Jul 2024 09:56:33 -0600 Subject: [PATCH 08/21] Remove protocol from canonical url --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index fadd426c8..bb01a6c86 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -61,7 +61,7 @@ extensions = ["rocm_docs", "sphinx_reredirects"] external_projects_current_project = "rocm" -html_baseurl = os.environ.get("READTHEDOCS_CANONICAL_URL", "https://rocm-stg.amd.com") +html_baseurl = os.environ.get("READTHEDOCS_CANONICAL_URL", "rocm-stg.amd.com") html_context = {} if os.environ.get("READTHEDOCS", "") == "True": html_context["READTHEDOCS"] = True From 2c5aabec5417ce4dd356a7ce8cc551ba6d4b8024 Mon Sep 17 00:00:00 2001 From: Young Hui - AMD <145490163+yhuiYH@users.noreply.github.com> Date: Thu, 25 Jul 2024 11:16:12 -0400 Subject: [PATCH 09/21] Add Build-ROCm page (#109) * add build-rocm page * change tools name to Optimization with new card image, and reordered tool groups * Update docs/how-to/build-rocm.rst with writer edits Co-authored-by: Leo Paoletti <164940351+lpaoletti@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Leo Paoletti <164940351+lpaoletti@users.noreply.github.com> * fix link to build page on index * restore the performance banner --------- Co-authored-by: Leo Paoletti <164940351+lpaoletti@users.noreply.github.com> --- .../unused-images/banner-optimization.jpg | Bin 0 -> 60704 bytes docs/how-to/build-rocm.rst | 23 +++++++ docs/index.md | 1 + docs/reference/rocm-tools.md | 58 +++++++++--------- docs/sphinx/_toc.yml.in | 2 + 5 files changed, 55 insertions(+), 29 deletions(-) create mode 100644 docs/data/unused-images/banner-optimization.jpg create mode 100644 docs/how-to/build-rocm.rst diff --git a/docs/data/unused-images/banner-optimization.jpg b/docs/data/unused-images/banner-optimization.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cd4a2f15d29424df3b9a6f7cbb698fbe65d00e40 GIT binary patch literal 60704 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

;k%# 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

RUoTEt&$Y~@O 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 literal 0 HcmV?d00001 diff --git a/docs/how-to/build-rocm.rst b/docs/how-to/build-rocm.rst new file mode 100644 index 000000000..42b06f79b --- /dev/null +++ b/docs/how-to/build-rocm.rst @@ -0,0 +1,23 @@ +.. meta:: + :description: Build ROCm from source + :keywords: build ROCm, source, ROCm source, ROCm, repo, make, makefile + + +.. _building-rocm: + +************************************************************* +Build ROCm from source +************************************************************* + +ROCm is an open-source stack from which you can build from source code. The source code is available from ``__. + + +The general steps to build ROCm are: + +#. Clone the ROCm source code +#. Prepare the build environment +#. Run the build command + +Because the ROCm stack is constantly evolving, the most current instructions are stored with the source code in GitHub. +For detailed build instructions, see `Build ROCm from source `_ + diff --git a/docs/index.md b/docs/index.md index d51dec2df..36a051d11 100644 --- a/docs/index.md +++ b/docs/index.md @@ -18,6 +18,7 @@ Installation instructions are available from: * {doc}`ROCm installation for Linux` * {doc}`HIP SDK installation for Windows` * [Deep learning frameworks installation](./how-to/deep-learning-rocm.rst) +* [Build ROCm from source](./how-to/build-rocm.rst) ROCm documentation is organized into the following categories: diff --git a/docs/reference/rocm-tools.md b/docs/reference/rocm-tools.md index fbec6eddd..c874676ac 100644 --- a/docs/reference/rocm-tools.md +++ b/docs/reference/rocm-tools.md @@ -11,35 +11,6 @@ ::::{grid} 1 2 2 2 :class-container: rocm-doc-grid -(development-tools)= - -:::{grid-item-card} -:class-card: sd-text-black -:img-top: ../data/reference/banner-development.jpg -:img-alt: Development tools -:padding: 2 - -* [ROCm Compilers](https://rocm.docs.amd.com/projects/llvm-project/en/latest/reference/rocmcc.html) -* {doc}`HIPIFY ` -* {doc}`ROCm Debugger (ROCgdb) ` -* {doc}`ROCdbgapi ` -* {doc}`ROCr Debug Agent ` -::: - -(performance-tools)= - -:::{grid-item-card} -:class-card: sd-text-black -:img-top: ../data/reference/banner-performance.jpg -:img-alt: Performance tools -:padding: 2 - -* {doc}`ROCm Bandwidth Test ` -* {doc}`ROCProfiler ` -* [rocprofiler-register](https://github.com/ROCm/rocprofiler-register) -* {doc}`ROCTracer ` -::: - (system-tools)= :::{grid-item-card} @@ -55,4 +26,33 @@ * {doc}`ROCm Validation Suite ` ::: +(performance-tools)= + +:::{grid-item-card} +:class-card: sd-text-black +:img-top: ../data/reference/banner-performance.jpg +:img-alt: Performance tools +:padding: 2 + +* {doc}`ROCm Bandwidth Test ` +* {doc}`ROCProfiler ` +* [rocprofiler-register](https://github.com/ROCm/rocprofiler-register) +* {doc}`ROCTracer ` +::: + +(development-tools)= + +:::{grid-item-card} +:class-card: sd-text-black +:img-top: ../data/reference/banner-development.jpg +:img-alt: Development tools +:padding: 2 + +* [ROCm Compilers](https://rocm.docs.amd.com/projects/llvm-project/en/latest/reference/rocmcc.html) +* {doc}`HIPIFY ` +* {doc}`ROCm Debugger (ROCgdb) ` +* {doc}`ROCdbgapi ` +* {doc}`ROCr Debug Agent ` +::: + :::: diff --git a/docs/sphinx/_toc.yml.in b/docs/sphinx/_toc.yml.in index 68456488e..e8ba06271 100644 --- a/docs/sphinx/_toc.yml.in +++ b/docs/sphinx/_toc.yml.in @@ -24,6 +24,8 @@ subtrees: title: HIP SDK on Windows - file: how-to/deep-learning-rocm.md title: Deep learning frameworks + - file: how-to/build-rocm.rst + title: Build ROCm from source - caption: How to entries: From f56aca0d316ccd6470e736da724e37a4b2d4d5fc Mon Sep 17 00:00:00 2001 From: Young Hui Date: Mon, 29 Jul 2024 16:07:37 -0400 Subject: [PATCH 10/21] add new compilers banner graphic --- docs/data/reference/banner-compilers.jpg | Bin 0 -> 62481 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/data/reference/banner-compilers.jpg diff --git a/docs/data/reference/banner-compilers.jpg b/docs/data/reference/banner-compilers.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bb04c977c352201cd00edd85106fe0145de81328 GIT binary patch literal 62481 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 literal 0 HcmV?d00001 From 59df2fc1105b2e9e1129b50df4fa505898f5a31f Mon Sep 17 00:00:00 2001 From: Peter Park Date: Tue, 30 Jul 2024 10:57:58 -0400 Subject: [PATCH 11/21] Update license.md for 6.2 (#119) * add omniperf, omnitrace, rocprofiler-sdk, and rocpydecode to license.md * remove clang-ocl * fix rocpydecode license --- docs/about/license.md | 69 ++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/docs/about/license.md b/docs/about/license.md index 13324e261..a8765f884 100644 --- a/docs/about/license.md +++ b/docs/about/license.md @@ -25,66 +25,69 @@ additional licenses. Please review individual repositories for more information. | Component | License | |:---------------------|:-------------------------| -| [HIP](https://github.com/ROCm/HIP/) | [MIT](https://github.com/ROCm/HIP/blob/develop/LICENSE.txt) | -| [HIPCC](https://github.com/ROCm/llvm-project/tree/amd-staging/amd/hipcc) | [MIT](https://github.com/ROCm/llvm-project/blob/amd-staging/amd/hipcc/LICENSE.txt) | -| [HIPIFY](https://github.com/ROCm/HIPIFY/) | [MIT](https://github.com/ROCm/HIPIFY/blob/amd-staging/LICENSE.txt) | -| [AMDMIGraphX](https://github.com/ROCm/AMDMIGraphX/) | [MIT](https://github.com/ROCm/AMDMIGraphX/blob/develop/LICENSE) | -| [MIOpen](https://github.com/ROCm/MIOpen/) | [MIT](https://github.com/ROCm/MIOpen/blob/develop/LICENSE.txt) | -| [MIVisionX](https://github.com/ROCm/MIVisionX/) | [MIT](https://github.com/ROCm/MIVisionX/blob/develop/LICENSE.txt) | | [AMD Common Language Runtime (CLR)](https://github.com/ROCm/clr) | [MIT](https://github.com/ROCm/clr/blob/develop/LICENCE) | -| [ROCm-Core](https://github.com/ROCm/rocm-core) | [MIT](https://github.com/ROCm/rocm-core/blob/master/copyright) | -| [hipamd](https://github.com/ROCm/clr/tree/develop/hipamd) | [MIT](https://github.com/ROCm/clr/blob/develop/hipamd/LICENSE.txt) | -| [ROCm-OpenCL-Runtime](https://github.com/ROCm/clr/tree/develop/opencl) | [MIT](https://github.com/ROCm/clr/blob/develop/opencl/LICENSE.txt) | -| [Tensile](https://github.com/ROCm/Tensile/) | [MIT](https://github.com/ROCm/Tensile/blob/develop/LICENSE.md) | +| [AMD SMI](https://github.com/ROCm/amdsmi) | [MIT](https://github.com/ROCm/amdsmi/blob/develop/LICENSE) | | [aomp](https://github.com/ROCm/aomp/) | [Apache 2.0](https://github.com/ROCm/aomp/blob/aomp-dev/LICENSE) | | [aomp-extras](https://github.com/ROCm/aomp-extras/) | [MIT](https://github.com/ROCm/aomp-extras/blob/aomp-dev/LICENSE) | -| [llvm-project](https://github.com/ROCm/llvm-project/) | [Apache](https://github.com/ROCm/llvm-project/blob/amd-staging/LICENSE.TXT) | -| [llvm-project/flang](https://github.com/ROCm/llvm-project/tree/amd-staging/flang) | [Apache 2.0](https://github.com/ROCm/llvm-project/blob/amd-staging/flang/LICENSE.TXT) | | [Code Object Manager (Comgr)](https://github.com/ROCm/llvm-project/tree/amd-staging/amd/comgr) | [The University of Illinois/NCSA](https://github.com/ROCm/llvm-project/blob/amd-staging/amd/comgr/LICENSE.txt) | -| [ROCm-Device-Libs](https://github.com/ROCm/llvm-project/tree/amd-staging/amd/device-libs) | [The University of Illinois/NCSA](https://github.com/ROCm/llvm-project/blob/amd-staging/amd/device-libs/LICENSE.TXT) | -| [clang-ocl](https://github.com/ROCm/clang-ocl/) | [MIT](https://github.com/ROCm/clang-ocl/blob/master/LICENSE) | -| [ROCK-Kernel-Driver](https://github.com/ROCm/ROCK-Kernel-Driver/) | [GPL 2.0 WITH Linux-syscall-note](https://github.com/ROCm/ROCK-Kernel-Driver/blob/master/COPYING) | -| [ROCT-Thunk-Interface](https://github.com/ROCm/ROCT-Thunk-Interface/) | [MIT](https://github.com/ROCm/ROCT-Thunk-Interface/blob/master/LICENSE.md) | -| [ROCR-Runtime](https://github.com/ROCm/ROCR-Runtime/) | [The University of Illinois/NCSA](https://github.com/ROCm/ROCR-Runtime/blob/master/LICENSE.txt) | -| [ROCR Debug Agent](https://github.com/ROCm/rocr_debug_agent/) | [The University of Illinois/NCSA](https://github.com/ROCm/rocr_debug_agent/blob/amd-staging/LICENSE.txt) | | [Composable Kernel](https://github.com/ROCm/composable_kernel) | [MIT](https://github.com/ROCm/composable_kernel/blob/develop/LICENSE) | | [half](https://github.com/ROCm/half/) | [MIT](https://github.com/ROCm/half/blob/rocm/LICENSE.txt) | +| [HIP](https://github.com/ROCm/HIP/) | [MIT](https://github.com/ROCm/HIP/blob/develop/LICENSE.txt) | +| [hipamd](https://github.com/ROCm/clr/tree/develop/hipamd) | [MIT](https://github.com/ROCm/clr/blob/develop/hipamd/LICENSE.txt) | | [hipBLAS](https://github.com/ROCm/hipBLAS/) | [MIT](https://github.com/ROCm/hipBLAS/blob/develop/LICENSE.md) | | [hipBLASLt](https://github.com/ROCm/hipBLASLt/) | [MIT](https://github.com/ROCm/hipBLASLt/blob/develop/LICENSE.md) | +| [HIPCC](https://github.com/ROCm/llvm-project/tree/amd-staging/amd/hipcc) | [MIT](https://github.com/ROCm/llvm-project/blob/amd-staging/amd/hipcc/LICENSE.txt) | | [hipCUB](https://github.com/ROCm/hipCUB/) | [Custom](https://github.com/ROCm/hipCUB/blob/develop/LICENSE.txt) | | [hipFFT](https://github.com/ROCm/hipFFT/) | [MIT](https://github.com/ROCm/hipFFT/blob/develop/LICENSE.md) | -| [hipFORT](https://github.com/ROCm/hipfort/) | [MIT](https://github.com/ROCm/hipfort/blob/develop/LICENSE) | +| [hipfort](https://github.com/ROCm/hipfort/) | [MIT](https://github.com/ROCm/hipfort/blob/develop/LICENSE) | +| [HIPIFY](https://github.com/ROCm/HIPIFY/) | [MIT](https://github.com/ROCm/HIPIFY/blob/amd-staging/LICENSE.txt) | | [hipRAND](https://github.com/ROCm/hipRAND/) | [MIT](https://github.com/ROCm/hipRAND/blob/develop/LICENSE.txt) | | [hipSOLVER](https://github.com/ROCm/hipSOLVER/) | [MIT](https://github.com/ROCm/hipSOLVER/blob/develop/LICENSE.md) | | [hipSPARSE](https://github.com/ROCm/hipSPARSE/) | [MIT](https://github.com/ROCm/hipSPARSE/blob/develop/LICENSE.md) | | [hipSPARSELt](https://github.com/ROCm/hipSPARSELt/) | [MIT](https://github.com/ROCm/hipSPARSELt/blob/develop/LICENSE.md) | | [hipTensor](https://github.com/ROCm/hipTensor) | [MIT](https://github.com/ROCm/hipTensor/blob/develop/LICENSE) | +| hsa-amd-aqlprofile | [AMD Software EULA](https://www.amd.com/en/legal/eula/amd-software-eula.html) | +| [llvm-project](https://github.com/ROCm/llvm-project/) | [Apache](https://github.com/ROCm/llvm-project/blob/amd-staging/LICENSE.TXT) | +| [llvm-project/flang](https://github.com/ROCm/llvm-project/tree/amd-staging/flang) | [Apache 2.0](https://github.com/ROCm/llvm-project/blob/amd-staging/flang/LICENSE.TXT) | +| [MIGraphX](https://github.com/ROCm/AMDMIGraphX/) | [MIT](https://github.com/ROCm/AMDMIGraphX/blob/develop/LICENSE) | +| [MIOpen](https://github.com/ROCm/MIOpen/) | [MIT](https://github.com/ROCm/MIOpen/blob/develop/LICENSE.txt) | +| [MIVisionX](https://github.com/ROCm/MIVisionX/) | [MIT](https://github.com/ROCm/MIVisionX/blob/develop/LICENSE.txt) | +| [Omniperf](https://github.com/ROCm/omniperf) | [MIT](https://github.com/ROCm/omniperf/blob/main/LICENSE) | +| [Omnitrace](https://github.com/ROCm/omnitrace) | [MIT](https://github.com/ROCm/omnitrace/blob/main/LICENSE) | | [rocAL](https://github.com/ROCm/rocAL) | [MIT](https://github.com/ROCm/rocAL/blob/develop/LICENSE.txt) | | [rocALUTION](https://github.com/ROCm/rocALUTION/) | [MIT](https://github.com/ROCm/rocALUTION/blob/develop/LICENSE.md) | | [rocBLAS](https://github.com/ROCm/rocBLAS/) | [MIT](https://github.com/ROCm/rocBLAS/blob/develop/LICENSE.md) | +| [ROCdbgapi](https://github.com/ROCm/ROCdbgapi/) | [MIT](https://github.com/ROCm/ROCdbgapi/blob/amd-staging/LICENSE.txt) | | [rocDecode](https://github.com/ROCm/rocDecode) | [MIT](https://github.com/ROCm/rocDecode/blob/develop/LICENSE) | | [rocFFT](https://github.com/ROCm/rocFFT/) | [MIT](https://github.com/ROCm/rocFFT/blob/develop/LICENSE.md) | -| [rocPRIM](https://github.com/ROCm/rocPRIM/) | [MIT](https://github.com/ROCm/rocPRIM/blob/develop/LICENSE.txt) | +| [ROCgdb](https://github.com/ROCm/ROCgdb/) | [GNU General Public License v2.0](https://github.com/ROCm/ROCgdb/blob/amd-master/COPYING) | +| [ROCK-Kernel-Driver](https://github.com/ROCm/ROCK-Kernel-Driver/) | [GPL 2.0 WITH Linux-syscall-note](https://github.com/ROCm/ROCK-Kernel-Driver/blob/master/COPYING) | +| [rocminfo](https://github.com/ROCm/rocminfo/) | [The University of Illinois/NCSA](https://github.com/ROCm/rocminfo/blob/amd-staging/License.txt) | +| [ROCm Bandwidth Test](https://github.com/ROCm/rocm_bandwidth_test/) | [The University of Illinois/NCSA](https://github.com/ROCm/rocm_bandwidth_test/blob/master/LICENSE.txt) | +| [ROCm CMake](https://github.com/ROCm/rocm-cmake/) | [MIT](https://github.com/ROCm/rocm-cmake/blob/develop/LICENSE) | +| [ROCm Communication Collectives Library (RCCL)](https://github.com/ROCm/rccl/) | [Custom](https://github.com/ROCm/rccl/blob/develop/LICENSE.txt) | +| [ROCm-Core](https://github.com/ROCm/rocm-core) | [MIT](https://github.com/ROCm/rocm-core/blob/master/copyright) | +| [ROCm Data Center (RDC)](https://github.com/ROCm/rdc/) | [MIT](https://github.com/ROCm/rdc/blob/develop/LICENSE) | +| [ROCm-Device-Libs](https://github.com/ROCm/llvm-project/tree/amd-staging/amd/device-libs) | [The University of Illinois/NCSA](https://github.com/ROCm/llvm-project/blob/amd-staging/amd/device-libs/LICENSE.TXT) | +| [ROCm-OpenCL-Runtime](https://github.com/ROCm/clr/tree/develop/opencl) | [MIT](https://github.com/ROCm/clr/blob/develop/opencl/LICENSE.txt) | | [ROCm Performance Primitives (RPP)](https://github.com/ROCm/rpp) | [MIT](https://github.com/ROCm/rpp/blob/develop/LICENSE) | +| [ROCm SMI Lib](https://github.com/ROCm/rocm_smi_lib/) | [MIT](https://github.com/ROCm/rocm_smi_lib/blob/develop/License.txt) | +| [ROCm Validation Suite](https://github.com/ROCm/ROCmValidationSuite/) | [MIT](https://github.com/ROCm/ROCmValidationSuite/blob/master/LICENSE) | +| [rocPRIM](https://github.com/ROCm/rocPRIM/) | [MIT](https://github.com/ROCm/rocPRIM/blob/develop/LICENSE.txt) | +| [ROCProfiler](https://github.com/ROCm/rocprofiler/) | [MIT](https://github.com/ROCm/rocprofiler/blob/amd-master/LICENSE) | +| [ROCprofiler-SDK](https://github.com/ROCm/omnitrace) | [MIT](https://github.com/ROCm/omnitrace/blob/main/LICENSE) | +| [rocPyDecode](https://github.com/ROCm/omnitrace) | [MIT](https://github.com/ROCm/rocPyDecode/blob/develop/LICENSE) | | [rocRAND](https://github.com/ROCm/rocRAND/) | [MIT](https://github.com/ROCm/rocRAND/blob/develop/LICENSE.txt) | +| [ROCR Debug Agent](https://github.com/ROCm/rocr_debug_agent/) | [The University of Illinois/NCSA](https://github.com/ROCm/rocr_debug_agent/blob/amd-staging/LICENSE.txt) | +| [ROCR-Runtime](https://github.com/ROCm/ROCR-Runtime/) | [The University of Illinois/NCSA](https://github.com/ROCm/ROCR-Runtime/blob/master/LICENSE.txt) | | [rocSOLVER](https://github.com/ROCm/rocSOLVER/) | [BSD-2-Clause](https://github.com/ROCm/rocSOLVER/blob/develop/LICENSE.md) | | [rocSPARSE](https://github.com/ROCm/rocSPARSE/) | [MIT](https://github.com/ROCm/rocSPARSE/blob/develop/LICENSE.md) | | [rocThrust](https://github.com/ROCm/rocThrust/) | [Apache 2.0](https://github.com/ROCm/rocThrust/blob/develop/LICENSE) | -| [rocWMMA](https://github.com/ROCm/rocWMMA/) | [MIT](https://github.com/ROCm/rocWMMA/blob/develop/LICENSE.md) | -| [ROCm Communication Collectives Library (RCCL)](https://github.com/ROCm/rccl/) | [Custom](https://github.com/ROCm/rccl/blob/develop/LICENSE.txt) | -| [ROCm Data Center (RDC)](https://github.com/ROCm/rdc/) | [MIT](https://github.com/ROCm/rdc/blob/develop/LICENSE) | -| [ROCm CMake](https://github.com/ROCm/rocm-cmake/) | [MIT](https://github.com/ROCm/rocm-cmake/blob/develop/LICENSE) | -| [ROCdbgapi](https://github.com/ROCm/ROCdbgapi/) | [MIT](https://github.com/ROCm/ROCdbgapi/blob/amd-staging/LICENSE.txt) | -| [ROCgdb](https://github.com/ROCm/ROCgdb/) | [GNU General Public License v2.0](https://github.com/ROCm/ROCgdb/blob/amd-master/COPYING) | -| [ROCm SMI Lib](https://github.com/ROCm/rocm_smi_lib/) | [MIT](https://github.com/ROCm/rocm_smi_lib/blob/develop/License.txt) | -| [AMD SMI](https://github.com/ROCm/amdsmi) | [MIT](https://github.com/ROCm/amdsmi/blob/develop/LICENSE) | -| [rocminfo](https://github.com/ROCm/rocminfo/) | [The University of Illinois/NCSA](https://github.com/ROCm/rocminfo/blob/amd-staging/License.txt) | -| [ROCProfiler](https://github.com/ROCm/rocprofiler/) | [MIT](https://github.com/ROCm/rocprofiler/blob/amd-master/LICENSE) | | [ROCTracer](https://github.com/ROCm/roctracer/) | [MIT](https://github.com/ROCm/roctracer/blob/amd-master/LICENSE) | -| [ROCm Bandwidth Test](https://github.com/ROCm/rocm_bandwidth_test/) | [The University of Illinois/NCSA](https://github.com/ROCm/rocm_bandwidth_test/blob/master/LICENSE.txt) | +| [ROCT-Thunk-Interface](https://github.com/ROCm/ROCT-Thunk-Interface/) | [MIT](https://github.com/ROCm/ROCT-Thunk-Interface/blob/master/LICENSE.md) | +| [rocWMMA](https://github.com/ROCm/rocWMMA/) | [MIT](https://github.com/ROCm/rocWMMA/blob/develop/LICENSE.md) | +| [Tensile](https://github.com/ROCm/Tensile/) | [MIT](https://github.com/ROCm/Tensile/blob/develop/LICENSE.md) | | [TransferBench](https://github.com/ROCm/TransferBench) | [MIT](https://github.com/ROCm/TransferBench/blob/develop/LICENSE.md) | -| [ROCmValidationSuite](https://github.com/ROCm/ROCmValidationSuite/) | [MIT](https://github.com/ROCm/ROCmValidationSuite/blob/master/LICENSE) | -| hsa-amd-aqlprofile | [AMD Software EULA](https://www.amd.com/en/legal/eula/amd-software-eula.html) Open sourced ROCm components are released via public GitHub repositories, packages on [https://repo.radeon.com](https://repo.radeon.com) and other distribution channels. From a4d6a8259c20ba5dd922182abc79c94d8c95f81e Mon Sep 17 00:00:00 2001 From: Young Hui Date: Tue, 30 Jul 2024 11:53:06 -0400 Subject: [PATCH 12/21] add runtimes banner graphic --- docs/data/reference/banner-runtimes.jpg | Bin 0 -> 74527 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/data/reference/banner-runtimes.jpg diff --git a/docs/data/reference/banner-runtimes.jpg b/docs/data/reference/banner-runtimes.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0c9f812f25221ac8b516db9c859cc0603010f6e2 GIT binary patch literal 74527 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 literal 0 HcmV?d00001 From 222865c8be3386d2b651003ac68c008c7a6d91f5 Mon Sep 17 00:00:00 2001 From: Peter Park Date: Tue, 30 Jul 2024 16:43:00 -0400 Subject: [PATCH 13/21] reorg ROCm landing page (#112) (#120) * reorg ROCm landing page * Conceptual Co-authored-by: randyh62 <42045079+randyh62@users.noreply.github.com> --- docs/index.md | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/docs/index.md b/docs/index.md index 86bf7e4d8..7e2ca2afd 100644 --- a/docs/index.md +++ b/docs/index.md @@ -42,27 +42,6 @@ ROCm documentation is organized into the following categories: * {doc}`ROCm on Radeon GPUs` ::: - -:::{grid-item-card} -:img-top: ./data/banner-reference.jpg -:img-alt: Reference documentation -:padding: 2 - -* [API libraries](./reference/api-libraries.md) - * [Artificial intelligence](#artificial-intelligence-apis) - * [C++ primitives](#cpp-primitives) - * [Communication](#communication-libraries) - * [Math](#math-apis) - * [Random number generators](#random-number-apis) - * [HIP runtime](#hip-runtime) -* [Tools](./reference/rocm-tools.md) - * [Development](#development-tools) - * [Performance analysis](#performance-tools) - * [System](#system-tools) -* [Hardware specifications](./reference/gpu-arch-specs.rst) -::: - - :::{grid-item-card} :class-card: sd-text-black :img-top: ./data/banner-howto.jpg From bdcb82372bb226f6789d990040a608c6a87b6999 Mon Sep 17 00:00:00 2001 From: Jeffrey Novotny Date: Wed, 31 Jul 2024 13:29:49 -0400 Subject: [PATCH 14/21] MI300A system optimization guide internal draft (#117) * MI300A system optimization guide internal draft * Small changes to System BIOS paragraph * Some minor edits * Changes after external review feedback * Add CPU Affinity debug setting * Edit CPU Affinity debug setting * Changes from external discussion * Add glossary and other small fixes * Additional changes from the review * Update the IOMMU guidance * Change description of CPU affinity setting * Slight rewording * Change Debian to Red Hat-based * A few changes from the second internal review --- .../mi300a-rocm-bandwidth-test-output.png | Bin 0 -> 28507 bytes .../mi300a-rocm-peak-bandwidth-output.png | Bin 0 -> 55051 bytes .../tuning-guides/mi300a-rocm-smi-output.png | Bin 0 -> 29150 bytes .../mi300a-rocm-smi-showhw-output.png | Bin 0 -> 105157 bytes .../mi300a-rocm-smi-showtopo-output.png | Bin 0 -> 115652 bytes docs/how-to/system-optimization/index.rst | 6 + docs/how-to/system-optimization/mi300a.rst | 391 ++++++++++++++++++ docs/index.md | 1 + docs/sphinx/_toc.yml.in | 2 + 9 files changed, 400 insertions(+) create mode 100644 docs/data/how-to/tuning-guides/mi300a-rocm-bandwidth-test-output.png create mode 100644 docs/data/how-to/tuning-guides/mi300a-rocm-peak-bandwidth-output.png create mode 100644 docs/data/how-to/tuning-guides/mi300a-rocm-smi-output.png create mode 100644 docs/data/how-to/tuning-guides/mi300a-rocm-smi-showhw-output.png create mode 100644 docs/data/how-to/tuning-guides/mi300a-rocm-smi-showtopo-output.png create mode 100644 docs/how-to/system-optimization/mi300a.rst diff --git a/docs/data/how-to/tuning-guides/mi300a-rocm-bandwidth-test-output.png b/docs/data/how-to/tuning-guides/mi300a-rocm-bandwidth-test-output.png new file mode 100644 index 0000000000000000000000000000000000000000..a56d957e2ea4aabe917534f9e866f5f71fe66772 GIT binary patch literal 28507 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 S!qED+95p>@QgY~A^#1^viCIhl literal 0 HcmV?d00001 diff --git a/docs/data/how-to/tuning-guides/mi300a-rocm-peak-bandwidth-output.png b/docs/data/how-to/tuning-guides/mi300a-rocm-peak-bandwidth-output.png new file mode 100644 index 0000000000000000000000000000000000000000..8a546925cef8e769ce776f9a035b933438e17ec8 GIT binary patch literal 55051 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

dk#%8Ia$Ltu>1J?E;&*rGu=~Cdf>$Ejv|@ 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

9RNgT+cE2n7LI?AbsN6bJ>H#;VZt#k} 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 -# ROCm tools and compilers +# ROCm tools, compilers, and runtimes ::::{grid} 1 2 2 2 :class-container: rocm-doc-grid @@ -20,8 +20,8 @@ :padding: 2 * {doc}`AMD SMI ` -* {doc}`rocminfo ` * {doc}`ROCm Data Center Tool ` +* {doc}`rocminfo ` * {doc}`ROCm SMI ` * {doc}`ROCm Validation Suite ` ::: @@ -34,9 +34,11 @@ :img-alt: Performance tools :padding: 2 +* {doc}`Omniperf ` +* {doc}`Omnitrace ` * {doc}`ROCm Bandwidth Test ` -* {doc}`ROCProfiler ` -* [rocprofiler-register](https://github.com/ROCm/rocprofiler-register) +* {doc}`ROCProfiler ` +* {doc}`ROCprofiler-SDK ` * {doc}`ROCTracer ` ::: @@ -48,11 +50,37 @@ :img-alt: Development tools :padding: 2 -* [ROCm Compilers](https://rocm.docs.amd.com/projects/llvm-project/en/latest/reference/rocmcc.html) +* {doc}`ROCm CMake ` * {doc}`HIPIFY ` -* {doc}`ROCm Debugger (ROCgdb) ` * {doc}`ROCdbgapi ` +* {doc}`ROCm Debugger (ROCgdb) ` * {doc}`ROCr Debug Agent ` ::: +(compilers)= + +:::{grid-item-card} +:class-card: sd-text-black +:img-top: ../data/reference/banner-compilers.jpg +:img-alt: Compilers +:padding: 2 + +* {doc}`ROCm Compilers ` +* {doc}`HIPCC ` +* [FLANG](https://github.com/ROCm/flang/) +::: + +(runtimes)= + +:::{grid-item-card} +:class-card: sd-text-black +:img-top: ../data/reference/banner-runtimes.jpg +:img-alt: Runtimes +:padding: 2 + +* {doc}`AMD Common Language Runtime (CLR) ` +* {doc}`HIP ` +* {doc}`ROCR-Runtime ` +::: + :::: diff --git a/docs/reference/rocmcc.md b/docs/reference/rocmcc.md deleted file mode 100644 index 5e7b15707..000000000 --- a/docs/reference/rocmcc.md +++ /dev/null @@ -1,1450 +0,0 @@ - - - - - - -# Compiler reference guide - -## Introduction to compiler reference guide - -ROCmCC is a Clang/LLVM-based compiler. It is optimized for high-performance -computing on AMD GPUs and CPUs and supports various heterogeneous programming -models such as HIP, OpenMP, and OpenCL. - -ROCmCC is made available via two packages: `rocm-llvm` and `rocm-llvm-alt`. -The differences are listed in [the table below](rocm-llvm-vs-alt). - -:::{table} Differences between `rocm-llvm` and `rocm-llvm-alt` -:name: rocm-llvm-vs-alt -| **`rocm-llvm`** | **`rocm-llvm-alt`** | -|:---------------------------------------------------:|:-------------------------------------------------------------------------------------------------------------------------------:| -| Installed by default when ROCm™ itself is installed | An optional package | -| Provides an open-source compiler | Provides an additional closed-source compiler for users interested in additional CPU optimizations not available in `rocm-llvm` | -::: - -For more details, see: - -* AMD GPU usage: [llvm.org/docs/AMDGPUUsage.html](https://llvm.org/docs/AMDGPUUsage.html) -* Releases and source: - -### ROCm compiler interfaces - -ROCm currently provides two compiler interfaces for compiling HIP programs: - -* `/opt/rocm/bin/hipcc` -* `/opt/rocm/bin/amdclang++` - -Both leverage the same LLVM compiler technology with the AMD GCN GPU support; -however, they offer a slightly different user experience. The `hipcc` command-line -interface aims to provide a more familiar user interface to users who are -experienced in CUDA but relatively new to the ROCm/HIP development environment. -On the other hand, `amdclang++` provides a user interface identical to the clang++ -compiler. It is more suitable for experienced developers who want to directly -interact with the clang compiler and gain full control of their application’s -build process. - -The major differences between `hipcc` and `amdclang++` are listed below: - -::::{table} Differences between `hipcc` and `amdclang++` -:name: hipcc-vs-amdclang -| * | **`hipcc`** | **`amdclang++`** | -|:----------------------------------:|:------------------------------------------------------------------------------------------------------------------------:|:----------------:| -| Compiling HIP source files | Treats all source files as HIP language source files | Enables the HIP language support for files with the `.hip` extension or through the `-x hip` compiler option | -| Detecting GPU architecture | Auto-detects the GPUs available on the system and generates code for those devices when no GPU architecture is specified | Has AMD GCN gfx803 as the default GPU architecture. The `--offload-arch` compiler option may be used to target other GPU architectures | -| Finding a HIP installation | Finds the HIP installation based on its own location and its knowledge about the ROCm directory structure | First looks for HIP under the same parent directory as its own LLVM directory and then falls back on `/opt/rocm`. Users can use the `--rocm-path` option to instruct the compiler to use HIP from the specified ROCm installation. | -| Linking to the HIP runtime library | Is configured to automatically link to the HIP runtime from the detected HIP installation | Requires the `--hip-link` flag to be specified to link to the HIP runtime. Alternatively, users can use the `-l -lamdhip64` option to link to a HIP runtime library. | -| Device function inlining | Inlines all GPU device functions, which provide greater performance and compatibility for codes that contain file scoped or device function scoped `__shared__` variables. However, it may increase compile time. | Relies on inlining heuristics to control inlining. Users experiencing performance or compilation issues with code using file scoped or device function scoped `__shared__` variables could try `-mllvm -amdgpu-early-inline-all=true -mllvm -amdgpu-function-calls=false` to work around the issue. There are plans to address these issues with future compiler improvements. | -| Source code location | | | -:::: - -## Compiler options and features - -This chapter discusses compiler options and features. - -### AMD GPU compilation - -This section outlines commonly used compiler flags for `hipcc` and `amdclang++`. -:::{option} -x hip - Compiles the source file as a HIP program. -::: - -:::{option} -fopenmp - Enables the OpenMP support. -::: - -:::{option} -fopenmp-targets= - Enables the OpenMP target offload support of the specified GPU architecture. - - :gpu: The GPU architecture. E.g. gfx908. -::: - -:::{option} --gpu-max-threads-per-block=: - Sets the default limit of threads per block. Also referred to as the launch bounds. - - :value: The default maximum amount of threads per block. -::: - -:::{option} -munsafe-fp-atomics - Enables unsafe floating point atomic instructions (AMDGPU only). -::: - -:::{option} -ffast-math - Allows aggressive, lossy floating-point optimizations. -::: - -:::{option} -mwavefrontsize64, -mno-wavefrontsize64 - Sets wavefront size to be 64 or 32 on RDNA architectures. -::: - -:::{option} -mcumode - Switches between CU and WGP modes on RDNA architectures. -::: - -:::{option} --offload-arch= - HIP offloading target ID. May be specified more than once. - - :gpu: The a device architecture followed by target ID features - delimited by a colon. Each target ID feature is a predefined - string followed by a plus or minus sign (e.g. `gfx908:xnack+:sramecc-`). -::: - -:::{option} -g - Generates source-level debug information. -::: - -:::{option} -fgpu-rdc, -fno-gpu-rdc - Generates relocatable device code, also known as separate compilation mode. -::: - -### AMD optimizations for zen architectures - -The CPU compiler optimizations described in this chapter originate from the AMD -Optimizing C/C++ Compiler (AOCC) compiler. They are available in ROCmCC if the -optional `rocm-llvm-alt` package is installed. The user’s interaction with the -compiler does not change once `rocm-llvm-alt` is installed. The user should use -the same compiler entry point, provided AMD provides high-performance compiler -optimizations for Zen-based processors in AOCC. - -For more information, refer to -[https://www.amd.com/en/developer/aocc.html](https://www.amd.com/en/developer/aocc.html). - -#### `-famd-opt` - -Enables a default set of AMD proprietary optimizations for the AMD Zen CPU -architectures. - -`-fno-amd-opt` disables the AMD proprietary optimizations. - -The `-famd-opt` flag is useful when a user wants to build with the proprietary -optimization compiler and not have to depend on setting any of the other -proprietary optimization flags. - -:::{note} -`-famd-opt` can be used in addition to the other proprietary CPU optimization -flags. The table of optimizations below implicitly enables the invocation of the -AMD proprietary optimizations compiler, whereas the `-famd-opt` flag requires -this to be handled explicitly. -::: - -#### `-fstruct-layout=[1,2,3,4,5,6,7]` - -Analyzes the whole program to determine if the structures in the code can be -peeled and the pointer or integer fields in the structure can be compressed. If -feasible, this optimization transforms the code to enable these improvements. -This transformation is likely to improve cache utilization and memory bandwidth. -It is expected to improve the scalability of programs executed on multiple cores. - -This is effective only under `-flto`, as the whole program analysis is required -to perform this optimization. Users can choose different levels of -aggressiveness with which this optimization can be applied to the application, -with 1 being the least aggressive and 7 being the most aggressive level. - -:::{table} -fstruct-layout Values and Their Effects -| `-fstruct-layout` value | Structure peeling | Pointer size after selective compression of self-referential pointers in structures, wherever safe | Type of structure fields eligible for compression | Whether compression performed under safety check | -| ----------- | ----------- | ----------- | ----------- | ----------- | -| 1 | Enabled | NA | NA | NA | -| 2 | Enabled | 32-bit | NA | NA | -| 3 | Enabled | 16-bit | NA | NA | -| 4 | Enabled | 32-bit | Integer | Yes | -| 5 | Enabled | 16-bit | Integer | Yes | -| 6 | Enabled | 32-bit | 64-bit signed int or unsigned int. Users must ensure that the values assigned to 64-bit signed int fields are in range -(2^31 - 1) to +(2^31 - 1) and 64-bit unsigned int fields are in the range 0 to +(2^31 - 1). Otherwise, you may obtain incorrect results. | No. Users must ensure the safety based on the program compiled. | -| 7 | Enabled | 16-bit | 64-bit signed int or unsigned int. Users must ensure that the values assigned to 64-bit signed int fields are in range -(2^31 - 1) to +(2^31 - 1) and 64-bit unsigned int fields are in the range 0 to +(2^31 - 1). Otherwise, you may obtain incorrect results. | No. Users must ensure the safety based on the program compiled. | -::: - -#### `-fitodcalls` - -Promotes indirect-to-direct calls by placing conditional calls. Application or -benchmarks that have a small and deterministic set of target functions for -function pointers passed as call parameters benefit from this optimization. -Indirect-to-direct call promotion transforms the code to use all possible -determined targets under runtime checks and falls back to the original code for -all the other cases. Runtime checks are introduced by the compiler for each of -these possible function pointer targets followed by direct calls to the targets. - -This is a link time optimization, which is invoked as `-flto -fitodcalls` - -#### `-fitodcallsbyclone` - -Performs value specialization for functions with function pointers passed as an -argument. It does this specialization by generating a clone of the function. The -cloning of the function happens in the call chain as needed, to allow conversion -of indirect function call to direct call. - -This complements `-fitodcalls` optimization and is also a link time -optimization, which is invoked as `-flto -fitodcallsbyclone`. - -#### `-fremap-arrays` - -Transforms the data layout of a single dimensional array to provide better cache -locality. This optimization is effective only under `-flto`, as the whole program -needs to be analyzed to perform this optimization, which can be invoked as -`-flto -fremap-arrays`. - -#### `-finline-aggressive` - -Enables improved inlining capability through better heuristics. This -optimization is more effective when used with `-flto`, as the whole program -analysis is required to perform this optimization, which can be invoked as -`-flto -finline-aggressive`. - -#### `-fnt-store (non-temporal store)` - -Generates a non-temporal store instruction for array accesses in a loop with a -large trip count. - -#### `-fnt-store=aggressive` - -This is an experimental option to generate non-temporal store instruction for -array accesses in a loop, whose iteration count cannot be determined at compile -time. In this case, the compiler assumes the iteration count to be huge. - -#### Optimizations through driver `-mllvm ` - -The following optimization options must be invoked through driver -`-mllvm `: - -##### `-enable-partial-unswitch` - -Enables partial loop unswitching, which is an enhancement to the existing loop -unswitching optimization in LLVM. Partial loop unswitching hoists a condition -inside a loop from a path for which the execution condition remains invariant, -whereas the original loop unswitching works for a condition that is completely -loop invariant. The condition inside the loop gets hoisted out from the -invariant path, and the original loop is retained for the path where the -condition is variant. - -##### `-aggressive-loop-unswitch` - -Experimental option that enables aggressive loop unswitching heuristic -(including `-enable-partial-unswitch`) based on the usage of the branch -conditional values. Loop unswitching leads to code bloat. Code bloat can be -minimized if the hoisted condition is executed more often. This heuristic -prioritizes the conditions based on the number of times they are used within the -loop. The heuristic can be controlled with the following options: - -* `-unswitch-identical-branches-min-count=` - * Enables unswitching of a loop with respect to a branch conditional value - (B), where B appears in at least `` compares in the loop. This option is - enabled with `-aggressive-loop-unswitch`. The default value is 3. - - **Usage:** `-mllvm -aggressive-loop-unswitch -mllvm -unswitch-identical-branches-min-count=` - - Where, `n` is a positive integer and lower value of `` facilitates more - unswitching. -* `-unswitch-identical-branches-max-count=` - * Enables unswitching of a loop with respect to a branch conditional value - (B), where B appears in at most `` compares in the loop. This option is - enabled with `-aggressive-loop-unswitch`. The default value is 6. - - **Usage:** `-mllvm -aggressive-loop-unswitch -mllvm -unswitch-identical-branches-max-count=` - - Where, `n` is a positive integer and higher value of `` facilitates more unswitching. - - :::{note} - These options may facilitate more unswitching under some workloads. Since - loop-unswitching inherently leads to code bloat, facilitating more - unswitching may significantly increase the code size. Hence, it may also lead - to longer compilation times. - ::: - -##### `-enable-strided-vectorization` - -Enables strided memory vectorization as an enhancement to the interleaved -vectorization framework present in LLVM. It enables the effective use of gather -and scatter kind of instruction patterns. This flag must be used along with the -interleave vectorization flag. - -##### `-enable-epilog-vectorization` - -Enables vectorization of epilog-iterations as an enhancement to existing -vectorization framework. This enables generation of an additional epilog vector -loop version for the remainder iterations of the original vector loop. The -vector size or factor of the original loop should be large enough to allow an -effective epilog vectorization of the remaining iterations. This optimization -takes place only when the original vector loop is vectorized with a vector width -or factor of 16. This vectorization width of 16 may be overwritten by -`-min-width-epilog-vectorization` command-line option. - -##### `-enable-redundant-movs` - -Removes any redundant `mov` operations including redundant loads from memory and -stores to memory. This can be invoked using -`-Wl,-plugin-opt=-enable-redundant-movs`. - -##### `-merge-constant` - -Attempts to promote frequently occurring constants to registers. The aim is to -reduce the size of the instruction encoding for instructions using constants and -obtain a performance improvement. - -##### `-function-specialize` - -Optimizes the functions with compile time constant formal arguments. - -##### `-lv-function-specialization` - -Generates specialized function versions when the loops inside function are -vectorizable and the arguments are not aliased with each other. - -##### `-enable-vectorize-compares` - -Enables vectorization on certain loops with conditional breaks assuming the -memory accesses are safely bound within the page boundary. - -##### `-inline-recursion=[1,2,3,4]` - -Enables inlining for recursive functions based on heuristics where the -aggressiveness of heuristics increases with the level (1-4). The default level -is 2. Higher levels may lead to code bloat due to expansion of recursive -functions at call sites. - -:::{table} -inline-recursion Level and Their Effects -| `-inline-recursion` **value** | **Inline depth of heuristics used to enable inlining for recursive functions** | -|:-----------------------------:|:------------------------------------------------------------------------------:| -| 1 | 1 | -| 2 | 1 | -| 3 | 1 | -| 4 | 10 | -::: - -This is more effective with `-flto` as the whole program needs to be analyzed to -perform this optimization, which can be invoked as -`-flto -inline-recursion=[1,2,3,4]`. - -##### `-reduce-array-computations=[1,2,3]` - -Performs array data flow analysis and optimizes the unused array computations. - -:::{table} -reduce-array-computations Values and Their Effects -| -reduce-array-computations value | Array elements eligible for elimination of computations | -| -------------------------------- | --------------------------- | -| 1 | Unused | -| 2 | Zero valued | -| 3 | Both unused and zero valued | -::: - -This optimization is effective with `-flto` as the whole program needs to be -analyzed to perform this optimization, which can be invoked as -`-flto -reduce-array-computations=[1,2,3]`. - -##### `-global-vectorize-slp={true,false}` - -Vectorizes the straight-line code inside a basic block with data reordering -vector operations. This option is set to **true** by default. - -##### `-region-vectorize` - -Experimental flag for enabling vectorization on certain loops with complex -control flow, which the normal vectorizer cannot handle. - -This optimization is effective with `-flto` as the whole program needs to be -analyzed to perform this optimization, which can be invoked as -`-flto -region-vectorize`. - -##### `-enable-x86-prefetching` - -Enables the generation of x86 prefetch instruction for the memory references -inside a loop or inside an innermost loop of a loop nest to prefetch the second -dimension of multidimensional array/memory references in the innermost loop of a -loop nest. This is an experimental pass; its profitability is being improved. - -##### `-suppress-fmas` - -Identifies the reduction patterns on FMA and suppresses the FMA generation, as -it is not profitable on the reduction patterns. - -##### `-enable-icm-vrp` - -Enables estimation of the virtual register pressure before performing loop -invariant code motion. This estimation is used to control the number of loop -invariants that will be hoisted during the loop invariant code motion. - -##### `-loop-splitting` - -Enables splitting of loops into multiple loops to eliminate the branches, which -compare the loop induction with an invariant or constant expression. This option -is enabled under `-O3` by default. To disable this optimization, use -`-loop-splitting=false`. - -##### `-enable-ipo-loop-split` - -Enables splitting of loops into multiple loops to eliminate the branches, which -compares the loop induction with a constant expression. This constant expression -can be derived through inter-procedural analysis. This option is enabled under -`-O3` by default. To disable this optimization, use -`-enable-ipo-loop-split=false`. - -##### `-compute-interchange-order` - -Enables heuristic for finding the best possible interchange order for a loop -nest. To enable this option, use `-enable-loopinterchange`. This option is set -to **false** by default. - -**Usage:** - -```bash --mllvm -enable-loopinterchange -mllvm -compute-interchange-order -``` - -##### `-convert-pow-exp-to-int={true,false}` - -Converts the call to floating point exponent version of pow to its integer -exponent version if the floating-point exponent can be converted to integer. -This option is set to **true** by default. - -##### `-do-lock-reordering={none,normal,aggressive}` - -Reorders the control predicates in increasing order of complexity from outer -predicate to inner when it is safe. The **normal** mode reorders simple -expressions, while the **aggressive** mode reorders predicates involving -function calls if no side effects are determined. This option is set to -**normal** by default. - -##### `-fuse-tile-inner-loop` - -Enables fusion of adjacent tiled loops as a part of loop tiling transformation. -This option is set to false by default. - -##### `-Hz,1,0x1 [Fortran]` - -Helps to preserve array index information for array access expressions which get -linearized in the compiler front end. The preserved information is used by the -compiler optimization phase in performing optimizations such as loop -transformations. It is recommended that any user who is using optimizations -such as loop transformations and other optimizations requiring de-linearized -index expressions should use the Hz option. This option has no impact on any -other aspects of the Flang front end. - -### Inline ASM statements - -Inline assembly (ASM) statements allow a developer to include assembly -instructions directly in either host or device code. While the ROCm compiler -supports ASM statements, their use is not recommended for the following reasons: - -* The compiler's ability to produce both correct code and to optimize - surrounding code is impeded. -* The compiler does not parse the content of the ASM statements and so - cannot "see" its contents. -* The compiler must make conservative assumptions in an effort to retain - correctness. -* The conservative assumptions may yield code that, on the whole, is less - performant compared to code without ASM statements. It is possible that a - syntactically correct ASM statement may cause incorrect runtime behavior. -* ASM statements are often ASIC-specific; code containing them is less portable - and adds a maintenance burden to the developer if different ASICs are - targeted. -* Writing correct ASM statements is often difficult; we strongly recommend - thorough testing of any use of ASM statements. - -:::{note} -For developers who choose to include ASM statements in the code, AMD is -interested in understanding the use case and appreciates feedback at -[https://github.com/ROCm/ROCm/issues](https://github.com/ROCm/ROCm/issues) -::: - -### Miscellaneous OpenMP compiler features - -This section discusses features that have been added or enhanced in the OpenMP -compiler. - -#### Offload-arch tool - -An LLVM library and tool that is used to query the execution capability of the -current system as well as to query requirements of a binary file. It is used by -OpenMP device runtime to ensure compatibility of an image with the current -system while loading it. It is compatible with target ID support and multi-image -fat binary support. - -**Usage:** - -```bash -offload-arch [Options] [Optional lookup-value] -``` - -When used without an option, offload-arch prints the value of the first offload -arch found in the underlying system. This can be used by various clang -front ends. For example, to compile for OpenMP offloading on your current system, -invoke clang with the following command: - -```bash -clang -fopenmp -fopenmp-targets=`offload-arch` foo.c -``` - -If an optional lookup-value is specified, offload-arch will check if the value -is either a valid offload-arch or a codename and look up requested additional -information. - -The following command provides all the information for offload-arch gfx906: - -```bash -offload-arch gfx906 -v -``` - -The options are listed below: - -:::{option} -h - Prints the help message. -::: - -:::{option} -a - Prints values for all devices. Do not stop at the first device found. -::: - -:::{option} -m - Prints device code name (often found in `pci.ids` file). -::: - -:::{option} -n - Prints numeric `pci-id`. -::: - -:::{option} -t - Prints clang offload triple to use for the offload arch. -::: - -:::{option} -v - Verbose. Implies: `-a -m -n -t`. For: all devices, prints codename, numeric value, and triple. -::: - -:::{option} -f - Prints offload requirements including offload-arch for each compiled offload image built into an application binary file. -::: - -:::{option} -c - Prints offload capabilities of the underlying system. This option is used by the language runtime to select an image when multiple images are available. A capability must exist for each requirement of the selected image. -::: - -There are symbolic link aliases `amdgpu-offload-arch` and `nvidia-arch` for -`offload-arch`. These aliases return 1 if no AMD GCN GPU or CUDA GPU is found. -These aliases are useful in determining whether architecture-specific tests -should be run or to conditionally load architecture-specific software. - -#### Command-line simplification using `offload-arch` flag - -Legacy mechanism of specifying offloading target for OpenMP involves using three -flags, `-fopenmp-targets`, `-Xopenmp-target`, and `-march`. The first two flags -take a target triple (like `amdgcn-amd-amdhsa` or `nvptx64-nvidia-cuda`), while -the last flag takes device name (like `gfx908` or `sm_70`) as input. -Alternatively, users of ROCmCC compiler can use the flag `—offload-arch` for a -combined effect of the above three flags. - -**Example:** - -```bash -# Legacy mechanism -clang -fopenmp -target x86_64-linux-gnu \ --fopenmp-targets=amdgcn-amd-amdhsa -Xopenmp-target=amdgcn-amd-amdhsa \ --march=gfx906 helloworld.c -o helloworld -``` - -**Example:** - -```bash -# Using offload-arch flag -clang -fopenmp -target x86_64-linux-gnu \ ---offload-arch=gfx906 helloworld.c -o helloworld. -``` - -To ensure backward compatibility, both styles are supported. This option is -compatible with target ID support and multi-image fat binaries. - -#### Target ID support for OpenMP - -The ROCmCC compiler supports specification of target features along with the GPU -name while specifying a target offload device in the command line, using -`-march` or `--offload-arch` options. The compiled image in such cases is -specialized for a given configuration of device and target features (target ID). - -**Example:** - -```bash -# compiling for a gfx908 device with XNACK paging support turned ON -clang -fopenmp -target x86_64-linux-gnu \ --fopenmp-targets=amdgcn-amd-amdhsa -Xopenmp-target=amdgcn-amd-amdhsa \ --march=gfx908:xnack+ helloworld.c -o helloworld -``` - -**Example:** - -```bash -# compiling for a gfx908 device with SRAMECC support turned OFF -clang -fopenmp -target x86_64-linux-gnu \ --fopenmp-targets=amdgcn-amd-amdhsa -Xopenmp-target=amdgcn-amd-amdhsa \ --march=gfx908:sramecc- helloworld.c -o helloworld -``` - -**Example:** - -```bash -# compiling for a gfx908 device with SRAMECC support turned ON and XNACK paging support turned OFF -clang -fopenmp -target x86_64-linux-gnu \ --fopenmp-targets=amdgcn-amd-amdhsa -Xopenmp-target=amdgcn-amd-amdhsa \ --march=gfx908:sramecc+:xnack- helloworld.c -o helloworld -``` - -The target ID specified on the command line is passed to the clang driver using -`target-feature` flag, to the LLVM optimizer and back end using `-mattr` flag, and -to linker using `-plugin-opt=-mattr` flag. This feature is compatible with -offload-arch command-line option and multi-image binaries for multiple -architectures. - -#### Multi-image fat binary for OpenMP - -The ROCmCC compiler is enhanced to generate binaries that can contain -heterogenous images. This heterogeneity could be in terms of: - -* Images of different architectures, like AMD GCN and NVPTX -* Images of same architectures but for different GPUs, like gfx906 and gfx908 -* Images of same architecture and same GPU but for different target features, - like `gfx908:xnack+` and `gfx908:xnack-` - -An appropriate image is selected by the OpenMP device runtime for execution -depending on the capability of the current system. This feature is compatible -with target ID support and offload-arch command-line options and uses -offload-arch tool to determine capability of the current system. - -**Example:** - -```bash -clang -fopenmp -target x86_64-linux-gnu \ --fopenmp-targets=amdgcn-amd-amdhsa,amdgcn-amd-amdhsa \ --Xopenmp-target=amdgcn-amd-amdhsa -march=gfx906 \ --Xopenmp-target=amdgcn-amd-amdhsa -march=gfx908 \ -helloworld.c -o helloworld -``` - -**Example:** - -```bash -clang -fopenmp -target x86_64-linux-gnu \ ---offload-arch=gfx906 \ ---offload-arch=gfx908 \ -helloworld.c -o helloworld -``` - -**Example:** - -```bash -clang -fopenmp -target x86_64-linux-gnu \ --fopenmp-targets=amdgcn-amd-amdhsa,amdgcn-amd-amdhsa,amdgcn-amd-amdhsa,amdgcn-amd-amdhsa \ --Xopenmp-target=amdgcn-amd-amdhsa -march=gfx908:sramecc+:xnack+ \ --Xopenmp-target=amdgcn-amd-amdhsa -march=gfx908:sramecc-:xnack+ \ --Xopenmp-target=amdgcn-amd-amdhsa -march=gfx908:sramecc+:xnack- \ --Xopenmp-target=amdgcn-amd-amdhsa -march=gfx908:sramecc-:xnack- \ -helloworld.c -o helloworld -``` - -The ROCmCC compiler creates an instance of toolchain for each unique combination -of target triple and the target GPU (along with the associated target features). -`clang-offload-wrapper` tool is modified to insert a new structure -`__tgt_image_info` along with each image in the binary. Device runtime is also -modified to query this structure to identify a compatible image based on the -capability of the current system. - -#### Unified shared memory - -The following OpenMP pragma is available on MI200, and it must be executed with -`xnack+` support. - -```cpp -omp requires unified_shared_memory -``` - -For more details on unified shared memory refer to the {ref}`openmp_usm` section of the OpenMP -Guide. - -### Support status of other Clang options - -The following table lists the other Clang options and their support status. - - - -:::{table} Clang Options -:name: clang-options -:widths: auto -:align: center - -| **Option** | **Support Status** | **Description** | -|--------------|:-----------------------:|-------------------------| -| `-###` | Supported | Prints (but does not run) the commands to run for this compilation | -| `--analyzer-output ` | Supported | "Static analyzer report output format (`html|plist|plist-multi-file|plist-html|sarif|text`)" | -| `--analyze` | Supported | Runs the static analyzer | -| `-arcmt-migrate-emit-errors` | Unsupported | Emits ARC errors even if the migrator can fix them | -| `-arcmt-migrate-report-output ` | Unsupported | Output path for the plist report | -| `-byteswapio` | Supported | Swaps byte-order for unformatted input/output | -| `-B ` | Supported | Adds `` to search path for binaries and object files used implicitly | -| `-CC` | Supported | Includes comments from within the macros in the preprocessed output | -| `-cl-denorms-are-zero` | Supported | OpenCL only. Allows denormals to be flushed to zero | -| `-cl-fast-relaxed-math` | Supported | OpenCL only. Sets `-cl-finite-math-only` and `-cl-unsafe-math-optimizations` and defines `__FAST_RELAXED_MATH__` | -| `-cl-finite-math-only` | Supported | OpenCL only. Allows floating-point optimizations that assume arguments and results are not `NaN`s or `+-Inf` | -| `-cl-fp32-correctly-rounded-divide-sqrt` | Supported | OpenCL only. Specifies that single-precision floating-point divide and `sqrt` used in the program source are correctly rounded | -| `-cl-kernel-arg-info` | Supported | OpenCL only. Generates kernel argument metadata | -| `-cl-mad-enable` | Supported | OpenCL only. Allows use of less precise MAD computations in the generated binary | -| `-cl-no-signed-zeros` | Supported | OpenCL only. Allows use of less precise no-signed-zeros computations in the generated binary | -| `-cl-opt-disable` | Supported | OpenCL only. Disables all optimizations. By default, optimizations are enabled. | -| `-cl-single-precision-constant` | Supported | OpenCL only. Treats double-precision floating-point constant as single precision constant | -| `-cl-std= ` | Supported | OpenCL language standard to compile for | -| `-cl-strict-aliasing` | Supported | OpenCL only. This option is added for compatibility with OpenCL 1.0. | -| `-cl-uniform-work-group-size` | Supported | OpenCL only. Defines the global work-size to be a multiple of the work-group size specified for `clEnqueueNDRangeKernel` | -| `-cl-unsafe-math-optimizations` | Supported | OpenCL only. Allows unsafe floating-point optimizations. Also implies `-cl-no-signed-zeros` and `-cl-mad-enable` | -| `--config ` | Supported | Specifies configuration file | -| `--cuda-compile-host-device` | Supported | Compiles CUDA code for both host and device (default). Has no effect on non-CUDA compilations | -| `--cuda-device-only` | Supported | Compiles CUDA code for device only | -| `--cuda-host-only` | Supported | Compiles CUDA code for host only. Has no effect on non-CUDA compilations | -| `--cuda-include-ptx=` | Unsupported | Includes PTX for the following GPU architecture (e.g. `sm_35`) or "all." May be specified more than once | -| `--cuda-noopt-device-debug` | Unsupported | Enables device-side debug info generation. Disables ptxas optimizations | -| `--cuda-path-ignore-env` | Unsupported | Ignores environment variables to detect CUDA installation | -| `--cuda-path=` | Unsupported | CUDA installation path | -| `-cxx-isystem ` | Supported | Adds a directory to the C++ SYSTEM include search path | -| `-C` | Supported | Includes comments in the preprocessed output | -| `-c` | Supported | Runs only preprocess, compile, and assemble steps | -| `-dD` | Supported | Prints macro definitions in `-E` mode in addition to the normal output | -| `-dependency-dot ` | Supported | Writes DOT-formatted header dependencies to the specified filename | -| `-dependency-file ` | Supported | Writes dependency output to the specified filename (or `-`) | -| `-dI` | Supported | Prints include directives in `-E` mode in addition to the normal output | -| `-dM` | Supported | Prints macro definitions in `-E` mode instead of the normal output | -| `-dsym-dir ` | Unsupported | Outputs dSYMs (if any) to the specified directory | -| `-D ` | Supported | `=`. Defines `` to `` (or `1` if `` omitted) | -| `-emit-ast` | Supported | Emits Clang AST files for source inputs | -| `-emit-interface-stubs` | Supported | Generates interface stub files | -| `-emit-llvm` | Supported | Uses the LLVM representation for assembler and object files | -| `-emit-merged-ifs` | Supported | Generates interface stub files and emits merged text not binary | -| `--emit-static-lib` | Supported | Enables linker job to emit a static library | -| `-enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang` | Supported | Declares enabling trivial automatic variable initialization to zero for benchmarking purpose with the knowledge that it will eventually be removed | -| `-E` | Supported | Runs the preprocessor only | -| `-fAAPCSBitfieldLoad` | Unsupported | Follows the AAPCS standard where all volatile bit-field writes generate at least one load (ARM only) | -| `-faddrsig` | Supported | Emits an address-significance table | -| `-faligned-allocation` | Supported | Enables C++17 aligned allocation functions | -| `-fallow-editor-placeholders` | Supported | Treats editor placeholders as valid source code | -| `-fallow-fortran-gnu-ext` | Supported | Allows Fortran GNU extensions | -| `-fansi-escape-codes` | Supported | Uses ANSI escape codes for diagnostics | -| `-fapple-kext` | Unsupported | Uses Apple's kernel extensions ABI | -| `-fapple-link-rtlib` | Unsupported | Forces linking of the clang built-ins runtime library | - |-fapple-pragma-pack|Unsupported|Enables Apple gcc-compatible #pragma pack handling| - |-fapplication-extension|Unsupported|Restricts code to those available for App Extensions| - |-fbackslash|Supported|Treats backslash as C-style escape character| - |-fbasic-block-sections= \|Supported|"Places each function's basic blocks in unique sections (ELF Only) : all \| labels \| none \| list= \"| - |-fblocks|Supported|Enables the 'blocks' language feature| - |-fborland-extensions|Unsupported|Accepts non-standard constructs supported by the Borland compile| - |-fbuild-session-file= \|Supported|Uses the last modification time of \ as the build session timestamp| - |-fbuild-session-timestamp= \

KuJI_7!?41p2V44CJfsgyP`k0gEmjBDdd== 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 + * - :doc:`AMD Instinct MI300A ` + + - `AMD Instinct MI300 instruction set architecture `_ + + - `CDNA 3 architecture `_ + * - :doc:`AMD Instinct MI200 ` - `AMD Instinct MI200 instruction set architecture `_ diff --git a/docs/how-to/system-optimization/mi300a.rst b/docs/how-to/system-optimization/mi300a.rst new file mode 100644 index 000000000..0c19e3245 --- /dev/null +++ b/docs/how-to/system-optimization/mi300a.rst @@ -0,0 +1,391 @@ +.. meta:: + :description: AMD Instinct MI300A system settings + :keywords: AMD, Instinct, MI300A, HPC, tuning, BIOS settings, NBIO, ROCm, + environment variable, performance, accelerator, GPU, EPYC, GRUB, + operating system + +*************************************************** +AMD Instinct MI300A system optimization +*************************************************** + +This topic discusses the operating system settings and system management commands for +the AMD Instinct MI300A accelerator. This topic can help you optimize performance. + +System settings +======================================== + +This section reviews the system settings required to configure a MI300A SOC system and +optimize its performance. + +The MI300A system-on-a-chip (SOC) design requires you to review and potentially adjust your OS configuration as explained in +the :ref:`operating-system-settings-label` section. These settings are critical for +performance because the OS on an accelerated processing unit (APU) is responsible for memory management across the CPU and GPU accelerators. +In the APU memory model, system settings are available to limit GPU memory allocation. +This limit is important because legacy software often determines the +amount of allowable memory at start-up time +by probing discrete memory until it is exhausted. If left unchecked, this practice +can starve the OS of resources. + +System BIOS settings +----------------------------------- + +System BIOS settings are preconfigured for optimal performance from the +platform vendor. This means that you do not need to adjust these settings +when using MI300A. If you have any questions regarding these settings, +contact your MI300A platform vendor. + +GRUB settings +----------------------------------- + +The ``/etc/default/grub`` file is used to configure the GRUB bootloader on modern Linux distributions. +Linux uses the string assigned to ``GRUB_CMDLINE_LINUX`` in this file as +its command line parameters during boot. + +Appending strings using the Linux command line +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +It is recommended that you append the following string to ``GRUB_CMDLINE_LINUX``. + +``pci=realloc=off`` + This setting disables the automatic reallocation + of PCI resources, so Linux is able to unambiguously detect all GPUs on the + MI300A-based system. It's used when Single Root I/O Virtualization (SR-IOV) Base + Address Registers (BARs) have not been allocated by the BIOS. This can help + avoid potential issues with certain hardware configurations. + +Validating the IOMMU setting +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +IOMMU is a system-specific IO mapping mechanism for DMA mapping +and isolation. IOMMU is turned off by default in the operating system settings +for optimal performance. + +To verify IOMMU is turned off, first install the ``acpica-tools`` package using your +package manager. + +.. code-block:: shell + + sudo apt install acpica-tools + +Then confirm that the following commands do not return any results. + +.. code-block:: shell + + sudo acpidump | grep IVRS + sudo acpidump | grep DMAR + +Update GRUB +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Use this command to update GRUB to use the modified configuration: + +.. code-block:: shell + + sudo grub2-mkconfig -o /boot/grub2/grub.cfg + +On some Red Hat-based systems, the ``grub2-mkconfig`` command might not be available. In this case, +use ``grub-mkconfig`` instead. Verify that you have the +correct version by using the following command: + +.. code-block:: shell + + grub-mkconfig -version + +.. _operating-system-settings-label: + +Operating system settings +----------------------------------- + +The operating system provides several options to customize and tune performance. For more information +about supported operating systems, see the :doc:`Compatibility matrix <../../compatibility/compatibility-matrix>`. + +If you are using a distribution other than RHEL or SLES, the latest Linux kernel is recommended. +Performance considerations for the Zen4, which is the core architecture in the MI300A, +require a Linux kernel running version 5.18 or higher. + +This section describes performance-based settings. + +* **Enable transparent huge pages** + + To enable transparent huge pages, use one of the following methods: + + * From the command line, run the following command: + + .. code-block:: shell + + echo always > /sys/kernel/mm/transparent_hugepage/enabled + + * Set the Linux kernel parameter ``transparent_hugepage`` as follows in the + relevant ``.cfg`` file for your system. + + .. code-block:: cfg + + transparent_hugepage=always + +* **Limit the maximum and single memory allocations on the GPU** + + Many AI-related applications were originally developed on discrete GPUs. Some of these applications + have fixed problem sizes associated with the targeted GPU size, and some attempt to determine the + system memory limits by allocating chunks until failure. These techniques can cause issues in an + APU with a shared space. + + To allow these applications to run on the APU without further changes, + ROCm supports a default memory policy that restricts the percentage of the GPU that can be allocated. + The following environment variables control this feature: + + * ``GPU_MAX_ALLOC_PERCENT`` + * ``GPU_SINGLE_ALLOC_PERCENT`` + + These settings can be added to the default shell environment or the user environment. The effect of the memory allocation + settings varies depending on the system, configuration, and task. They might require adjustment, especially when performing GPU benchmarks. Setting these values to ``100`` + lets the GPU allocate any amount of free memory. However, the risk of encountering + an operating system out-of-memory (OMM) condition increases when almost + all the available memory is used. + + Before setting either of these items to 100 percent, + carefully consider the expected CPU workload allocation and the anticipated OS usage. + For instance, if the OS requires 8GB on a 128GB system, setting these + variables to ``100`` authorizes a single + workload to allocate up to 120GB of memory. Unless the system has swap space configured + any over-allocation attempts will be handled by the OMM policies. + +* **Disable NUMA (Non-uniform memory access) balancing** + + ROCm uses information from the compiled application to ensure an affinity exists + between the GPU agent processes and their CPU hosts or co-processing agents. + Because the APU has OS threads, + including threads with memory management, the default kernel NUMA policies can + adversely impact workload performance without additional tuning. + + .. note:: + + At the kernel level, ``pci_relloc`` can also be set to ``off`` as an additional tuning measure. + + To disable NUMA balancing, use one of the following methods: + + * From the command line, run the following command: + + .. code-block:: shell + + echo 0 > /proc/sys/kernel/numa_balancing + + * Set the following Linux kernel parameters in the + relevant ``.cfg`` file for your system. + + .. code-block:: cfg + + pci=realloc=off numa_balancing=disable + +* **Enable compaction** + + Compaction is necessary for proper MI300A operation because the APU dynamically shares memory + between the CPU and GPU. Compaction can be done proactively, which reduces + allocation costs, or performed during allocation, in which case it is part of the background activities. + Without compaction, the MI300A application performance eventually degrades as fragmentation increases. + In RHEL distributions, compaction is disabled by default. In Ubuntu, it's enabled by default. + + To enable compaction, enter the following commands using the command line: + + .. code-block:: shell + + echo 20 > /proc/sys/vm/compaction_proactiveness + echo 1 > /proc/sys/vm/compact_unevictable_allowed + +* **Change affinity of ROCm helper threads** + + This change prevents internal ROCm threads from having their CPU core affinity mask + set to all CPU cores available. With this setting, the threads inherit their parent's + CPU core affinity mask. If you have any questions regarding this setting, + contact your MI300A platform vendor. To enable this setting, enter the following command: + + .. code-block:: shell + + export HSA_OVERRIDE_CPU_AFFINITY_DEBUG=0 + +* **CPU core states and C-states** + + The system BIOS handles these settings for the MI300A. + They don't need to be configured on the operating system. + +System management +======================================== + +For a complete guide on installing, managing, and uninstalling ROCm on Linux, see +:doc:`Quick-start (Linux)`. To verify that the +installation was successful, see the +:doc:`Post-installation instructions` and +:doc:`ROCm tools <../../reference/rocm-tools>` guides. If verification +fails, consult the :doc:`System debugging guide <../system-debugging>`. + +.. _hw-verification-rocm-label: + +Hardware verification with ROCm +----------------------------------- + +ROCm includes tools to query the system structure. To query +the GPU hardware, use the ``rocm-smi`` command. + +``rocm-smi`` reports statistics per socket, so the power results combine CPU and GPU utilization. +In an idle state on a multi-socket system, some power imbalances are expected because +the distribution of OS threads can keep some APU devices at higher power states. + +.. note:: + + The MI300A VRAM settings show as ``N/A``. + +.. image:: ../../data/how-to/tuning-guides/mi300a-rocm-smi-output.png + :alt: Output from the rocm-smi command + +The ``rocm-smi --showhw`` command shows the available system +GPUs and their device ID and firmware details. + +In the MI300A hardware settings, the system BIOS handles the UMC RAS. The +ROCm-supplied GPU driver does not manage this setting. +This results in a value of ``DISABLED`` for the ``UMC RAS`` setting. + +.. image:: ../../data/how-to/tuning-guides/mi300a-rocm-smi-showhw-output.png + :alt: Output from the ``rocm-smi showhw`` command + +To see the system structure, the localization of the GPUs in the system, and the +fabric connections between the system components, use the ``rocm-smi --showtopo`` command. + +* The first block of the output shows the distance between the GPUs. The weight is a qualitative + measure of the “distance” data must travel to reach one GPU from another. + While the values do not have a precise physical meaning, the higher the value the + more hops are required to reach the destination from the source GPU. +* The second block contains a matrix named “Hops between two GPUs”, where ``1`` means + the two GPUs are directly connected with XGMI, ``2`` means both GPUs are linked to the + same CPU socket and GPU communications go through the CPU, and ``3`` means + both GPUs are linked to different CPU sockets so communications go + through both CPU sockets. +* The third block indicates the link types between the GPUs. This can either be + ``XGMI`` for AMD Infinity Fabric links or ``PCIE`` for PCIe Gen4 links. +* The fourth block reveals the localization of a GPU with respect to the NUMA organization + of the shared memory of the AMD EPYC processors. + +.. image:: ../../data/how-to/tuning-guides/mi300a-rocm-smi-showtopo-output.png + :alt: Output from the ``rocm-smi showtopo`` command + +Testing inter-device bandwidth +----------------------------------- + +The ``rocm-smi --showtopo`` command from the :ref:`hw-verification-rocm-label` section +displays the system structure and shows how the GPUs are located and connected within this +structure. For more information, use the :doc:`ROCm Bandwidth Test `, which can run benchmarks to +show the effective link bandwidth between the system components. + +For information on how to install the ROCm Bandwidth Test, see :doc:`Building the environment `. + +The output lists the available compute devices (CPUs and GPUs), including +their device ID and PCIe ID: + +.. image:: ../../data/how-to/tuning-guides/mi300a-rocm-bandwidth-test-output.png + :alt: Output from the rocm-bandwidth-test utility + +It also displays the measured bandwidth for unidirectional and +bidirectional transfers between the devices on the CPU and GPU: + +.. image:: ../../data/how-to/tuning-guides/mi300a-rocm-peak-bandwidth-output.png + :alt: Bandwidth information from the rocm-bandwidth-test utility + +Abbreviations +============= + +APBDIS + Algorithmic Performance Boost Disable + +APU + Accelerated processing unit + +BAR + Base Address Register + +BIOS + Basic Input/Output System + +CBS + Common BIOS Settings + +CCD + Compute Core Die + +CDNA + Compute DNA + +CLI + Command Line Interface + +CPU + Central Processing Unit + +cTDP + Configurable Thermal Design Power + +DF + Data Fabric + +DMA + Direct Memory Access + +GPU + Graphics Processing Unit + +GRUB + Grand Unified Bootloader + +HBM + High Bandwidth Memory + +HPC + High Performance Computing + +IOMMU + Input-Output Memory Management Unit + +ISA + Instruction Set Architecture + +NBIO + North Bridge Input/Output + +NUMA + Non-Uniform Memory Access + +OMM + Out of Memory + +PCI + Peripheral Component Interconnect + +PCIe + PCI Express + +POR + Power-On Reset + +RAS + Reliability, availability and serviceability + +SMI + System Management Interface + +SMT + Simultaneous Multi-threading + +SOC + System On Chip + +SR-IOV + Single Root I/O Virtualization + +TSME + Transparent Secure Memory Encryption + +UMC + Unified Memory Controller + +VRAM + Video RAM + +xGMI + Inter-chip Global Memory Interconnect diff --git a/docs/index.md b/docs/index.md index 7e2ca2afd..c4611584b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -53,6 +53,7 @@ ROCm documentation is organized into the following categories: * [Fine-tuning LLMs and inference optimization](./how-to/llm-fine-tuning-optimization/index.rst) * [System optimization](./how-to/system-optimization/index.rst) * [AMD Instinct MI300X](./how-to/system-optimization/mi300x.rst) + * [AMD Instinct MI300A](./how-to/system-optimization/mi300a.rst) * [AMD Instinct MI200](./how-to/system-optimization/mi200.md) * [AMD Instinct MI100](./how-to/system-optimization/mi100.md) * [AMD Instinct RDNA2](./how-to/system-optimization/w6000-v620.md) diff --git a/docs/sphinx/_toc.yml.in b/docs/sphinx/_toc.yml.in index 4211f79a1..47b35ea31 100644 --- a/docs/sphinx/_toc.yml.in +++ b/docs/sphinx/_toc.yml.in @@ -67,6 +67,8 @@ subtrees: - entries: - file: how-to/system-optimization/mi300x.rst title: AMD Instinct MI300X + - file: how-to/system-optimization/mi300a.rst + title: AMD Instinct MI300A - file: how-to/system-optimization/mi200.md title: AMD Instinct MI200 - file: how-to/system-optimization/mi100.md From dbea7719f91652d764323d6031aa2e987247f9b7 Mon Sep 17 00:00:00 2001 From: Young Hui - AMD <145490163+yhuiYH@users.noreply.github.com> Date: Wed, 31 Jul 2024 13:31:24 -0400 Subject: [PATCH 15/21] Compatibility Matrix with initial 6.2 data (#105) * initial commit for placeholder 6.2 data * fix TensorFlow versions, and LLVM/OpenMP version strings * add third column with 6.1.0 as last column. Update some versions from Peter's review comments * reduce RPP name * remove trailing comma * reduce length of 3rd party communications libs title * change footnote for 6.2 to remove mention of MI300A * remove TransferBench * change from 6.1.0 to 6.0.0 data in last column * fixing a few version numbers * add rocprofiler-sdk version * fix omnitrace version * adding full matrix, 2 different views * add copying csv in conf.py * 6.2 content edits, and change subheadings to remove :, renamed a few as Leo suggested * add Framework anchor within compat matrix, and fix linting error * categorized tools * update Cub/Thrust versions, abbreviate Management * remove the dedicated histtorical page * WIP commit, added anchors and in compat matrix, along with anchor test code * check 6.1.1 and 6.0.2 versions, add anchors thru table * audit 6.2 RC4 versions against table, remove clang-ocl, and update hip-other version * avoid linting --- docs/compatibility/compatibility-matrix.rst | 262 +++++++++++------- docs/conf.py | 3 + .../compatibility-matrix-historical-6.0.csv | 111 ++++++++ 3 files changed, 269 insertions(+), 107 deletions(-) create mode 100644 docs/data/reference/compatibility-matrix-historical-6.0.csv diff --git a/docs/compatibility/compatibility-matrix.rst b/docs/compatibility/compatibility-matrix.rst index 18bbe1e9e..e10efeba5 100644 --- a/docs/compatibility/compatibility-matrix.rst +++ b/docs/compatibility/compatibility-matrix.rst @@ -8,121 +8,169 @@ Compatibility matrix Use this matrix to view the ROCm compatibility across successive major and minor releases. +You can also refer to the :ref:`past versions of ROCm compatibility matrix`. .. container:: format-big-table .. csv-table:: - :header: "ROCm Version", "6.1.0", "6.0.0" + :header: "ROCm Version", "6.2.0", "6.1.2", "6.0.0" :stub-columns: 1 - :doc:`Operating Systems `, "Ubuntu 22.04.4, 22.04.3","Ubuntu 22.04.4, 22.04.3" - ,"Ubuntu 20.04.6, 20.04.5","Ubuntu 20.04.6, 20.04.5" - ,"RHEL 9.4 [#red-hat94]_, 9.3, 9.2","RHEL 9.3, 9.2" - ,"RHEL 8.9, 8.8","RHEL 8.9, 8.8" - ,"SLES 15 SP5, SP4","SLES 15 SP5, SP4" - ,CentOS 7.9,CentOS 7.9 - ,"Oracle Linux 8.9 [#oracle89]_" - ,, - :doc:`GFX Architecture `,CDNA3,CDNA3 - ,CDNA2,CDNA2 - ,CDNA,CDNA - ,RDNA3,RDNA3 - ,RDNA2,RDNA2 - ,, - :doc:`GFX Card `,gfx1100,gfx1100 - ,gfx1030,gfx1030 - ,gfx942 [#]_, gfx942 [#]_ - ,gfx90a,gfx90a - ,gfx908,gfx908 - ,, - ECOSYSTEM SUPPORT:,, - :doc:`PyTorch `,"2.1, 2.0, 1.13","2.1, 2.0, 1.13" - :doc:`TensorFlow `,"2.15, 2.14, 2.13","2.14, 2.13, 2.12" - :doc:`JAX `,0.4.26,0.4.26 - `ONNX Runtime `_,1.17.3,1.14.1 - ,, - 3RD PARTY COMMUNICATION LIBS:,, - `UCC `_,>=1.2.0,>=1.2.0 - `UCX `_,>=1.14.1,>=1.14.1 - ,, - 3RD PARTY ALGORITHM LIBS:,, - Thrust,2.1.0,2.0.1 - CUB,2.1.0,2.0.1 - ,, - ML & COMPUTER VISION LIBS:,, - :doc:`Composable Kernel `,1.1.0,1.1.0 - :doc:`MIGraphX `,2.9.0,2.8.0 - :doc:`MIOpen `,3.1.0,3.0.0 - :doc:`MIVisionX `,2.5.0,2.5.0 - :doc:`rocDecode `,0.5.0,N/A - :doc:`ROCm Performance Primitives (RPP) `,1.5.0,1.4.0 - ,, - COMMUNICATION:,, - :doc:`RCCL `,2.18.6,2.18.3 - ,, - MATH LIBS:,, - `half `_ ,1.12.0,1.12.0 - :doc:`hipBLAS `,2.1.0,2.0.0 - :doc:`hipBLASLt `,0.7.0,0.6.0 - :doc:`hipFFT `,1.0.14,1.0.13 - :doc:`hipFORT `,0.4.0,0.4.0 - :doc:`hipRAND `,2.10.16,2.10.16 - :doc:`hipSOLVER `,2.1.0,2.0.0 - :doc:`hipSPARSE `,3.0.1,3.0.0 - :doc:`hipSPARSELt `,0.1.0,0.1.0 - :doc:`rocALUTION `,3.1.1,3.0.3 - :doc:`rocBLAS `,4.1.0,4.0.0 - :doc:`rocFFT `,1.0.27,1.0.23 - :doc:`rocRAND `,3.0.1,2.10.17 - :doc:`rocSOLVER `,3.25.0,3.24.0 - :doc:`rocSPARSE `,3.1.2,3.0.2 - :doc:`rocWMMA `,1.4.0,1.3.0 - `Tensile `_,4.40.0,4.39.0 - ,, - PRIMITIVES:,, - :doc:`hipCUB `,3.1.0,3.0.0 - :doc:`hipTensor `,1.2.0,1.1.0 - :doc:`rocPRIM `,3.1.0,3.0.0 - :doc:`rocThrust `,3.0.1,3.0.0 - ,, - SUPPORT LIBS:,, - `hipother `_,6.1.40091,6.0.32830 - :doc:`ROCm CMake `,0.12.0,0.11.0 - `rocm-core `_,6.1.0,6.0.0 - `ROCT-Thunk-Interface `_,20240125.3.30,20231016.2.245 - ,, - TOOLS:,, - :doc:`AMD SMI `,24.4.1,23.4.2 - :doc:`HIPIFY `,17.0.0,17.0.0 - :doc:`ROCdbgapi `,0.71.0,0.71.0 - :doc:`rocminfo `,1.0.0,1.0.0 - :doc:`ROCProfiler `,2.0.60100,2.0.0 - `rocprofiler-register `_,0.3.0,N/A - :doc:`ROCTracer `,4.1.60100,4.1.0 - :doc:`ROCm Bandwidth Test `,1.4.0,1.4.0 - :doc:`ROCm Data Center Tool `,0.3.0,0.3.0 - :doc:`ROCm Debugger (ROCgdb) `,14.1.0,13.2.0 - :doc:`ROCm SMI `,7.0.0,6.0.0 - :doc:`ROCm Validation Suite `,rocm-6.1.0,rocm-6.0.0 - :doc:`ROCr Debug Agent `,2.0.3,2.0.3 - :doc:`TransferBench `,1.48,1.46 - ,, - COMPILERS:,, - `clang-ocl `_,0.5.0,0.5.0 - `Flang `_,17.0.0.24103,17.0.0.23483 - `llvm-project `_,17.0.0.24103,17.0.0.23483 - `OpenMP `_,17.0.0.24103,17.0.0.23483 - ,, - RUNTIMES:,, - :doc:`HIP `,6.1.40091,6.0.32830 - `OpenCL Runtime `_,2.0.0,2.0.0 - :doc:`ROCR-Runtime `,1.13.0,1.12.0 + :doc:`Operating Systems `, "Ubuntu 24.04","","" + ,"Ubuntu 22.04.5 [#Ubuntu220405]_, 22.04.4","Ubuntu 22.04.4, 22.04.3","Ubuntu 22.04.4, 22.04.3" + ,"Ubuntu 20.04.6","Ubuntu 20.04.6, 20.04.5","Ubuntu 20.04.6, 20.04.5" + ,"RHEL 9.4, 9.3","RHEL 9.4 [#red-hat94]_, 9.3, 9.2","RHEL 9.3, 9.2" + ,"RHEL 8.10, 8.9","RHEL 8.9, 8.8","RHEL 8.9, 8.8" + ,"SLES 15 SP6, SP5","SLES 15 SP5, SP4","SLES 15 SP5, SP4" + ,,CentOS 7.9,CentOS 7.9 + ,"Oracle Linux 8.9 [#oracle89]_","Oracle Linux 8.9 [#oracle89]_","" + ,".. _architecture-support-compatibility-matrix:",, + :doc:`Architecture `,CDNA3,CDNA3,CDNA3 + ,CDNA2,CDNA2,CDNA2 + ,CDNA,CDNA,CDNA + ,RDNA3,RDNA3,RDNA3 + ,RDNA2,RDNA2,RDNA2 + ,".. _gpu-support-compatibility-matrix:",, + :doc:`GPU / LLVM target `,gfx1100,gfx1100,gfx1100 + ,gfx1030,gfx1030,gfx1030 + ,gfx942 [#mi300_620]_, gfx942 [#mi300_612]_, gfx942 [#mi300_600]_ + ,gfx90a,gfx90a,gfx90a + ,gfx908,gfx908,gfx908 + ,,, + FRAMEWORK SUPPORT,".. _framework-support-compatibility-matrix:",, + :doc:`PyTorch `,"2.3, 2.2, 2.1, 2.0, 1.13","2.1, 2.0, 1.13","2.1, 2.0, 1.13" + :doc:`TensorFlow `,"2.16.1, 2.15.1, 2.14.1","2.15, 2.14, 2.13","2.14, 2.13, 2.12" + :doc:`JAX `,0.4.26,0.4.26,0.4.26 + `ONNX Runtime `_,1.17.3,1.17.3,1.14.1 + ,,, + THIRD PARTY COMMS,".. _thirdpartycomms-support-compatibility-matrix:",, + `UCC `_,>=1.2.0,>=1.2.0,>=1.2.0 + `UCX `_,>=1.15.0,>=1.14.1,>=1.14.1 + ,,, + THIRD PARTY ALGORITHM,".. _thirdpartyalgorithm-support-compatibility-matrix:",, + Thrust,2.2.0,2.1.0,2.0.1 + CUB,2.2.0,2.1.0,2.0.1 + ,,, + ML & COMPUTER VISION,".. _mllibs-support-compatibility-matrix:",, + :doc:`Composable Kernel `,1.1.0,1.1.0,1.1.0 + :doc:`MIGraphX `,2.10.0,2.9.0,2.8.0 + :doc:`MIOpen `,3.2.0,3.1.0,3.0.0 + :doc:`MIVisionX `,3.0.0,2.5.0,2.5.0 + :doc:`rocDecode `,0.6.0,0.6.0,N/A + :doc:`RPP `,1.8.0,1.5.0,1.4.0 + :doc:`rocPyDecode `,0.1.0,N/A,N/A + ,,, + COMMUNICATION,".. _commlibs-support-compatibility-matrix:",, + :doc:`RCCL `,2.20.5,2.18.6,2.18.3 + ,,, + MATH LIBS,".. _mathlibs-support-compatibility-matrix:",, + `half `_ ,1.12.0,1.12.0,1.12.0 + :doc:`hipBLAS `,2.2.0,2.1.0,2.0.0 + :doc:`hipBLASLt `,0.8.0,0.7.0,0.6.0 + :doc:`hipFFT `,1.0.14,1.0.14,1.0.13 + :doc:`hipFORT `,0.4.0,0.4.0,0.4.0 + :doc:`hipRAND `,2.11.0,2.10.16,2.10.16 + :doc:`hipSOLVER `,2.2.0,2.1.1,2.0.0 + :doc:`hipSPARSE `,3.1.1,3.0.1,3.0.0 + :doc:`hipSPARSELt `,0.2.1,0.2.0,0.1.0 + :doc:`rocALUTION `,3.2.0,3.1.1,3.0.3 + :doc:`rocBLAS `,4.2.0,4.1.2,4.0.0 + :doc:`rocFFT `,1.0.28,1.0.27,1.0.23 + :doc:`rocRAND `,3.1.0,3.0.1,2.10.17 + :doc:`rocSOLVER `,3.26.0,3.25.0,3.24.0 + :doc:`rocSPARSE `,3.2.0,3.1.2,3.0.2 + :doc:`rocWMMA `,1.5.0,1.4.0,1.3.0 + `Tensile `_,4.40.0,4.40.0,4.39.0 + ,,, + PRIMITIVES,".. _primitivelibs-support-compatibility-matrix:",, + :doc:`hipCUB `,3.2.0,3.1.0,3.0.0 + :doc:`hipTensor `,1.3.0,1.2.0,1.1.0 + :doc:`rocPRIM `,3.2.0,3.1.0,3.0.0 + :doc:`rocThrust `,3.0.1,3.0.1,3.0.0 + ,,, + SUPPORT LIBS,,, + `hipother `_,6.2.41133,6.1.40093,6.1.32830 + `rocm-core `_,6.2.0,6.1.2,6.0.0 + `ROCT-Thunk-Interface `_,20240607.1.4246,20240125.5.08,20231016.2.245 + ,,, + SYSTEM MGMT TOOLS,".. _tools-support-compatibility-matrix:",, + :doc:`AMD SMI `,24.6.2,24.5.1,23.4.2 + :doc:`ROCm Data Center Tool `,1.0.0,0.3.0,0.3.0 + :doc:`rocminfo `,1.0.0,1.0.0,1.0.0 + :doc:`ROCm SMI `,7.3.0,7.2.0,6.0.0 + :doc:`ROCm Validation Suite `,rocm-6.2.0,rocm-6.1.2,rocm-6.0.0 + ,,, + PERFORMANCE TOOLS,,, + :doc:`Omniperf `,2.0.1,N/A,N/A + :doc:`Omnitrace `,1.11.2,N/A,N/A + :doc:`ROCm Bandwidth Test `,1.4.0,1.4.0,1.4.0 + :doc:`ROCProfiler `,2.0.60200,2.0.60102,2.0.60000 + :doc:`ROCprofiler-SDK `,0.4.0,N/A,N/A + :doc:`ROCTracer `,4.1.60200,4.1.60102,4.1.60000 + ,,, + DEVELOPMENT TOOLS,,, + :doc:`HIPIFY `,18.0.0.24232,17.0.0.24193,17.0.0.23483 + :doc:`ROCm CMake `,0.13.0,0.12.0,0.11.0 + :doc:`ROCdbgapi `,0.76.0,0.71.0,0.71.0 + :doc:`ROCm Debugger (ROCgdb) `,14.2.0,14.1.0,13.2.0 + `rocprofiler-register `_,0.4.0,0.3.0,N/A + :doc:`ROCr Debug Agent `,2.0.3,2.0.3,2.0.3 + ,,, + COMPILERS,".. _compilers-support-compatibility-matrix:",, + `clang-ocl `_,N/A,0.5.0,0.5.0 + `Flang `_,18.0.0.24232,17.0.0.24193,17.0.0.23483 + `llvm-project `_,18.0.0.24232,17.0.0.24193,17.0.0.23483 + `OpenMP `_,18.0.0.24232,17.0.0.24193,17.0.0.23483 + ,,, + RUNTIMES,".. _runtime-support-compatibility-matrix:",, + :doc:`HIP `,6.2.41133,6.1.40093,6.1.32830 + `OpenCL Runtime `_,2.0.0,2.0.0,2.0.0 + :doc:`ROCR-Runtime `,1.13.0,1.13.0,1.12.0 .. rubric:: Footnotes -.. [#red-hat94] **For ROCm 6.1** - RHEL 9.4 is supported only on AMD Instinct MI300A. -.. [#oracle89] **For ROCm 6.1.1** - Oracle Linux is supported only on AMD Instinct MI300X. -.. [#] **For ROCm 6.1** - MI300A (gfx942) is supported on Ubuntu 22.04.4, RHEL 9.4, RHEL 9.3, RHEL 8.9, and SLES 15 SP5. MI300X (gfx942) is only supported on Ubuntu 22.04.4. -.. [#] **For ROCm 6.0** - MI300A (gfx942) is supported on Ubuntu 22.04.3, RHEL 8.9 and SLES 15 SP5. MI300X (gfx942) is only supported on Ubuntu 22.04.3. +.. [#Ubuntu220405] Preview support of Ubuntu 22.04.5 only +.. [#red-hat94] RHEL 9.4 is supported only on AMD Instinct MI300A. +.. [#oracle89] Oracle Linux is supported only on AMD Instinct MI300X. +.. [#mi300_620] **For ROCm 6.2.0** - MI300X (gfx942) is only supported on Ubuntu 22.04.4 and Oracle Linux. +.. [#mi300_612] **For ROCm 6.1.2** - MI300A (gfx942) is supported on Ubuntu 22.04.4, RHEL 9.4, RHEL 9.3, RHEL 8.9, and SLES 15 SP5. MI300X (gfx942) is only supported on Ubuntu 22.04.4 and Oracle Linux. +.. [#mi300_600] **For ROCm 6.0.0** - MI300A (gfx942) is supported on Ubuntu 22.04.3, RHEL 8.9, and SLES 15 SP5. MI300X (gfx942) is only supported on Ubuntu 22.04.3. + +.. + Footnotes and ref anchors in below historical tables should be appended with "-past-60", to differentiate from the + footnote references in the above, latest, compatibility matrix. It also allows to easily find & replace. + An easy way to work is to download the historical.CSV file, and update open it in excel. Then when content is ready, + delete the columns you don't need, to build the current compatibility matrix to use in above table. Find & replace all + instances of "-past-60" to make it ready for above table. + + +.. _past-rocm-compatibility-matrix: + +Past versions of ROCm compatibility matrix +*************************************************** + +Expand for full historical view of: + +.. dropdown:: ROCm 6.0 - Present + + You can `download the entire .csv <../downloads/compatibility-matrix-historical-6.0.csv>`_ for offline reference. + + .. csv-table:: + :file: ../data/reference/compatibility-matrix-historical-6.0.csv + :widths: 20,10,10,10,10,10,10 + :header-rows: 1 + :stub-columns: 1 + + .. rubric:: Footnotes + + .. [#Ubuntu220405-past-60] Preview support of Ubuntu 22.04.5 only + .. [#red-hat94-past-60] RHEL 9.4 is supported only on AMD Instinct MI300A. + .. [#oracle89-past-60] Oracle Linux is supported only on AMD Instinct MI300X. + .. [#mi300_620-past-60] **For ROCm 6.2.0** - MI300X (gfx942) is only supported on Ubuntu 22.04.4 and Oracle Linux. + .. [#mi300_612-past-60] **For ROCm 6.1.2** - MI300A (gfx942) is supported on Ubuntu 22.04.4, RHEL 9.4, RHEL 9.3, RHEL 8.9, and SLES 15 SP5. MI300X (gfx942) is only supported on Ubuntu 22.04.4 and Oracle Linux. + .. [#mi300_611-past-60] **For ROCm 6.1.1** - MI300A (gfx942) is supported on Ubuntu 22.04.4, RHEL 9.4, RHEL 9.3, RHEL 8.9, and SLES 15 SP5. MI300X (gfx942) is only supported on Ubuntu 22.04.4 and Oracle Linux. + .. [#mi300_610-past-60] **For ROCm 6.1.0** - MI300A (gfx942) is supported on Ubuntu 22.04.4, RHEL 9.4, RHEL 9.3, RHEL 8.9, and SLES 15 SP5. MI300X (gfx942) is only supported on Ubuntu 22.04.4. + .. [#mi300_602-past-60] **For ROCm 6.0.2** - MI300A (gfx942) is supported on Ubuntu 22.04.3, RHEL 8.9, and SLES 15 SP5. MI300X (gfx942) is only supported on Ubuntu 22.04.3. + .. [#mi300_600-past-60] **For ROCm 6.0.0** - MI300A (gfx942) is supported on Ubuntu 22.04.3, RHEL 8.9, and SLES 15 SP5. MI300X (gfx942) is only supported on Ubuntu 22.04.3. diff --git a/docs/conf.py b/docs/conf.py index bc6626adc..929046e75 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -9,6 +9,9 @@ import shutil shutil.copy2("../RELEASE.md", "./about/release-notes.md") +os.system("mkdir -p ../_readthedocs/html/downloads") +os.system("cp data/reference/compatibility-matrix-historical-6.0.csv ../_readthedocs/html/downloads/compatibility-matrix-historical-6.0.csv") + latex_engine = "xelatex" latex_elements = { "fontpkg": r""" diff --git a/docs/data/reference/compatibility-matrix-historical-6.0.csv b/docs/data/reference/compatibility-matrix-historical-6.0.csv new file mode 100644 index 000000000..d9bb7f507 --- /dev/null +++ b/docs/data/reference/compatibility-matrix-historical-6.0.csv @@ -0,0 +1,111 @@ +ROCm Version,6.2.0, 6.1.2, 6.1.1, 6.1.0, 6.0.2, 6.0.0 + :doc:`Operating Systems `,Ubuntu 24.04,,,,, + ,"Ubuntu 22.04.5 [#Ubuntu220405-past-60]_, 22.04.4","Ubuntu 22.04.4, 22.04.3","Ubuntu 22.04.4, 22.04.3","Ubuntu 22.04.4, 22.04.3","Ubuntu 22.04.4, 22.04.3","Ubuntu 22.04.4, 22.04.3" + ,"Ubuntu 20.04.6","Ubuntu 20.04.6, 20.04.5","Ubuntu 20.04.6, 20.04.5","Ubuntu 20.04.6, 20.04.5","Ubuntu 20.04.6, 20.04.5","Ubuntu 20.04.6, 20.04.5" + ,"RHEL 9.4, 9.3","RHEL 9.4 [#red-hat94-past-60]_, 9.3, 9.2","RHEL 9.4 [#red-hat94-past-60]_, 9.3, 9.2","RHEL 9.4 [#red-hat94-past-60]_, 9.3, 9.2","RHEL 9.3, 9.2","RHEL 9.3, 9.2" + ,"RHEL 8.10, 8.9","RHEL 8.9, 8.8","RHEL 8.9, 8.8","RHEL 8.9, 8.8","RHEL 8.9, 8.8","RHEL 8.9, 8.8" + ,"SLES 15 SP6, SP5","SLES 15 SP5, SP4","SLES 15 SP5, SP4","SLES 15 SP5, SP4","SLES 15 SP5, SP4","SLES 15 SP5, SP4" + ,,CentOS 7.9,CentOS 7.9,CentOS 7.9,CentOS 7.9,CentOS 7.9 + ,Oracle Linux 8.9 [#oracle89-past-60]_,Oracle Linux 8.9 [#oracle89-past-60]_,Oracle Linux 8.9 [#oracle89-past-60]_,,, + ,".. _architecture-support-compatibility-matrix-past-60:",,,,, + :doc:`Architecture `,CDNA3,CDNA3,CDNA3,CDNA3,CDNA3,CDNA3 + ,CDNA2,CDNA2,CDNA2,CDNA2,CDNA2,CDNA2 + ,CDNA,CDNA,CDNA,CDNA,CDNA,CDNA + ,RDNA3,RDNA3,RDNA3,RDNA3,RDNA3,RDNA3 + ,RDNA2,RDNA2,RDNA2,RDNA2,RDNA2,RDNA2 + ,".. _gpu-support-compatibility-matrix-past-60:",,,,, + :doc:`GPU / LLVM target `,gfx1100,gfx1100,gfx1100,gfx1100,gfx1100,gfx1100 + ,gfx1030,gfx1030,gfx1030,gfx1030,gfx1030,gfx1030 + ,gfx942 [#mi300_620-past-60]_, gfx942 [#mi300_612-past-60]_, gfx942 [#mi300_611-past-60]_, gfx942 [#mi300_610-past-60]_, gfx942 [#mi300_602-past-60]_, gfx942 [#mi300_600-past-60]_ + ,gfx90a,gfx90a,gfx90a,gfx90a,gfx90a,gfx90a + ,gfx908,gfx908,gfx908,gfx908,gfx908,gfx908 + ,,,,,, + FRAMEWORK SUPPORT,".. _framework-support-compatibility-matrix-past-60:",,,,, + :doc:`PyTorch `,"2.3, 2.2, 2.1, 2.0, 1.13","2.1, 2.0, 1.13","2.1, 2.0, 1.13","2.1, 2.0, 1.13","2.1, 2.0, 1.13","2.1, 2.0, 1.13" + :doc:`TensorFlow `,"2.16.1, 2.15.1, 2.14.1","2.15, 2.14, 2.13","2.15, 2.14, 2.13","2.15, 2.14, 2.13","2.14, 2.13, 2.12","2.14, 2.13, 2.12" + :doc:`JAX `,0.4.26,0.4.26,0.4.26,0.4.26,0.4.26,0.4.26 + `ONNX Runtime `_,1.17.3,1.17.3,1.17.3,1.17.3,1.14.1,1.14.1 + ,,,,,, + THIRD PARTY COMMS,".. _thirdpartycomms-support-compatibility-matrix-past-60:",,,,, + `UCC `_,>=1.2.0,>=1.2.0,>=1.2.0,>=1.2.0,>=1.2.0,>=1.2.0 + `UCX `_,>=1.15.0,>=1.14.1,>=1.14.1,>=1.14.1,>=1.14.1,>=1.14.1 + ,,,,,, + THIRD PARTY ALGORITHM,".. _thirdpartyalgorithm-support-compatibility-matrix-past-60:",,,,, + Thrust,2.2.0,2.1.0,2.1.0,2.1.0,2.0.1,2.0.1 + CUB,2.2.0,2.1.0,2.1.0,2.1.0,2.0.1,2.0.1 + ,,,,,, + ML & COMPUTER VISION,".. _mllibs-support-compatibility-matrix-past-60:",,,,, + :doc:`Composable Kernel `,1.1.0,1.1.0,1.1.0,1.1.0,1.1.0,1.1.0 + :doc:`MIGraphX `,2.10.0,2.9.0,2.9.0,2.9.0,2.8.0,2.8.0 + :doc:`MIOpen `,3.2.0,3.1.0,3.1.0,3.1.0,3.0.0,3.0.0 + :doc:`MIVisionX `,3.0.0,2.5.0,2.5.0,2.5.0,2.5.0,2.5.0 + :doc:`rocDecode `,0.6.0,0.6.0,0.5.0,0.5.0,N/A,N/A + :doc:`RPP `,1.8.0,1.5.0,1.5.0,1.5.0,1.4.0,1.4.0 + :doc:`rocPyDecode `,0.1.0,N/A,N/A,N/A,N/A,N/A + ,,,,,, + COMMUNICATION,".. _commlibs-support-compatibility-matrix-past-60:",,,,, + :doc:`RCCL `,2.20.5,2.18.6,2.18.6,2.18.6,2.18.3,2.18.3 + ,,,,,, + MATH LIBS,".. _mathlibs-support-compatibility-matrix-past-60:",,,,, + `half `_ ,1.12.0,1.12.0,1.12.0,1.12.0,1.12.0,1.12.0 + :doc:`hipBLAS `,2.2.0,2.1.0,2.1.0,2.1.0,2.0.0,2.0.0 + :doc:`hipBLASLt `,0.8.0,0.7.0,0.7.0,0.7.0,0.6.0,0.6.0 + :doc:`hipFFT `,1.0.14,1.0.14,1.0.14,1.0.14,1.0.13,1.0.13 + :doc:`hipFORT `,0.4.0,0.4.0,0.4.0,0.4.0,0.4.0,0.4.0 + :doc:`hipRAND `,2.11.0,2.10.16,2.10.16,2.10.16,2.10.16,2.10.16 + :doc:`hipSOLVER `,2.2.0,2.1.1,2.1.1,2.1.0,2.0.0,2.0.0 + :doc:`hipSPARSE `,3.1.1,3.0.1,3.0.1,3.0.1,3.0.0,3.0.0 + :doc:`hipSPARSELt `,0.2.1,0.2.0,0.1.0,0.1.0,0.1.0,0.1.0 + :doc:`rocALUTION `,3.2.0,3.1.1,3.1.1,3.1.1,3.0.3,3.0.3 + :doc:`rocBLAS `,4.2.0,4.1.2,4.1.0,4.1.0,4.0.0,4.0.0 + :doc:`rocFFT `,1.0.28,1.0.27,1.0.27,1.0.26,1.0.25,1.0.23 + :doc:`rocRAND `,3.1.0,3.0.1,3.0.1,3.0.1,3.0.0,2.10.17 + :doc:`rocSOLVER `,3.26.0,3.25.0,3.25.0,3.25.0,3.24.0,3.24.0 + :doc:`rocSPARSE `,3.2.0,3.1.2,3.1.2,3.1.2,3.0.2,3.0.2 + :doc:`rocWMMA `,1.5.0,1.4.0,1.4.0,1.4.0,1.3.0,1.3.0 + `Tensile `_,4.40.0,4.40.0,4.40.0,4.40.0,4.39.0,4.39.0 + ,,,,,, + PRIMITIVES,".. _primitivelibs-support-compatibility-matrix-past-60:",,,,, + :doc:`hipCUB `,3.2.0,3.1.0,3.1.0,3.1.0,3.0.0,3.0.0 + :doc:`hipTensor `,1.3.0,1.2.0,1.2.0,1.2.0,1.1.0,1.1.0 + :doc:`rocPRIM `,3.2.0,3.1.0,3.1.0,3.1.0,3.0.0,3.0.0 + :doc:`rocThrust `,3.0.1,3.0.1,3.0.1,3.0.1,3.0.0,3.0.0 + ,,,,,, + SUPPORT LIBS,,,,,, + `hipother `_,6.2.41133,6.1.40093,6.1.40092,6.1.40091,6.1.32831,6.1.32830 + `rocm-core `_,6.2.0,6.1.2,6.1.1,6.1.0,6.0.2,6.0.0 + `ROCT-Thunk-Interface `_,20240607.1.4246,20240125.5.08,20240125.5.08,20240125.3.30,20231016.2.245,20231016.2.245 + ,,,,,, + SYSTEM MGMT TOOLS,".. _tools-support-compatibility-matrix-past-60:",,,,, + :doc:`AMD SMI `,24.6.2,24.5.1,24.5.1,24.4.1,23.4.2,23.4.2 + :doc:`ROCm Data Center Tool `,1.0.0,0.3.0,0.3.0,0.3.0,0.3.0,0.3.0 + :doc:`rocminfo `,1.0.0,1.0.0,1.0.0,1.0.0,1.0.0,1.0.0 + :doc:`ROCm SMI `,7.3.0,7.2.0,7.0.0,7.0.0,6.0.2,6.0.0 + :doc:`ROCm Validation Suite `,rocm-6.2.0,rocm-6.1.2,rocm-6.1.1,rocm-6.1.0,rocm-6.0.2,rocm-6.0.0 + ,,,,,, + PERFORMANCE TOOLS,,,,,, + :doc:`Omniperf `,2.0.1,N/A,N/A,N/A,N/A,N/A + :doc:`Omnitrace `,1.11.2,N/A,N/A,N/A,N/A,N/A + :doc:`ROCm Bandwidth Test `,1.4.0,1.4.0,1.4.0,1.4.0,1.4.0,1.4.0 + :doc:`ROCProfiler `,2.0.60200,2.0.60102,2.0.60101,2.0.60100,2.0.60002,2.0.60000 + :doc:`ROCprofiler-SDK `,0.4.0,N/A,N/A,N/A,N/A,N/A + :doc:`ROCTracer `,4.1.60200,4.1.60102,4.1.60101,4.1.60100,4.1.60002,4.1.60000 + ,,,,,, + DEVELOPMENT TOOLS,,,,,, + :doc:`HIPIFY `,18.0.0.24232,17.0.0.24193,17.0.0.24154,17.0.0.24103,17.0.0.24012,17.0.0.23483 + :doc:`ROCm CMake `,0.13.0,0.12.0,0.12.0,0.12.0,0.11.0,0.11.0 + :doc:`ROCdbgapi `,0.76.0,0.71.0,0.71.0,0.71.0,0.71.0,0.71.0 + :doc:`ROCm Debugger (ROCgdb) `,14.2.0,14.1.0,14.1.0,14.1.0,13.2.0,13.2.0 + `rocprofiler-register `_,0.4.0,0.3.0,0.3.0,0.3.0,N/A,N/A + :doc:`ROCr Debug Agent `,2.0.3,2.0.3,2.0.3,2.0.3,2.0.3,2.0.3 + ,,,,,, + COMPILERS,".. _compilers-support-compatibility-matrix-past-60:",,,,, + `clang-ocl `_,N/A,0.5.0,0.5.0,0.5.0,0.5.0,0.5.0 + `Flang `_,18.0.0.24232,17.0.0.24193,17.0.0.24154,17.0.0.24103,17.0.0.24012,17.0.0.23483 + `llvm-project `_,18.0.0.24232,17.0.0.24193,17.0.0.24154,17.0.0.24103,17.0.0.24012,17.0.0.23483 + `OpenMP `_,18.0.0.24232,17.0.0.24193,17.0.0.24154,17.0.0.24103,17.0.0.24012,17.0.0.23483 + ,,,,,, + RUNTIMES,".. _runtime-support-compatibility-matrix-past-60:",,,,, + :doc:`HIP `,6.2.41133,6.1.40093,6.1.40092,6.1.40091,6.1.32831,6.1.32830 + `OpenCL Runtime `_,2.0.0,2.0.0,2.0.0,2.0.0,2.0.0,2.0.0 + :doc:`ROCR-Runtime `,1.13.0,1.13.0,1.13.0,1.13.0,1.12.0,1.12.0 From a084244ac067084508b76ca630532418825b2cf7 Mon Sep 17 00:00:00 2001 From: Jeffrey Novotny Date: Wed, 31 Jul 2024 14:36:26 -0400 Subject: [PATCH 16/21] Fix spelling linting failures in local repository (#121) --- .wordlist.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.wordlist.txt b/.wordlist.txt index bac9dfb4f..2cb9d1391 100644 --- a/.wordlist.txt +++ b/.wordlist.txt @@ -242,6 +242,7 @@ OAMs OCP OEM OFED +OMM OMP OMPI OMPT @@ -278,6 +279,7 @@ PyPi PyTorch Qcycles RAII +RAS RCCL RDC RDMA @@ -368,6 +370,7 @@ UC UCC UCX UIF +UMC USM UTCL UTIL @@ -429,6 +432,7 @@ bfloat bilinear bitsandbytes blit +bootloader boson bosons buildable @@ -592,6 +596,7 @@ pragma pre prebuilt precompiled +preconfigured prefetch prefetchable prefill From 647634a976926a42f54c428a4f379ebb1d4f858d Mon Sep 17 00:00:00 2001 From: randyh62 <42045079+randyh62@users.noreply.github.com> Date: Wed, 31 Jul 2024 13:27:28 -0700 Subject: [PATCH 17/21] Update ROCm component links (#116) * Update ROCm component links * link update * correct rocal * change ROCm Compilers link * update llvm-project reference for rocmcc * use llvm-project for Clang * reorder links to match image * fix link format * Update rocm-tools.md fix link syntax * add spell checking note * may to might * add compilers to tools * update what-is-rocm image * Young's comments * Leo's comments * tools, compiler, and runtimes * move hipify * Perter's comments --- docs/conceptual/using-gpu-sanitizer.md | 431 ------- docs/contribute/contributing.md | 5 + docs/data/rocm-software-stack-6_1_0.jpg | Bin 255443 -> 0 bytes docs/data/rocm-software-stack-6_2_0.jpg | Bin 0 -> 295164 bytes docs/reference/rocm-tools.md | 40 +- docs/reference/rocmcc.md | 1450 ----------------------- docs/sphinx/_toc.yml.in | 4 +- docs/what-is-rocm.rst | 50 +- 8 files changed, 76 insertions(+), 1904 deletions(-) delete mode 100644 docs/conceptual/using-gpu-sanitizer.md delete mode 100644 docs/data/rocm-software-stack-6_1_0.jpg create mode 100644 docs/data/rocm-software-stack-6_2_0.jpg delete mode 100644 docs/reference/rocmcc.md diff --git a/docs/conceptual/using-gpu-sanitizer.md b/docs/conceptual/using-gpu-sanitizer.md deleted file mode 100644 index 091ff2a12..000000000 --- a/docs/conceptual/using-gpu-sanitizer.md +++ /dev/null @@ -1,431 +0,0 @@ - - - - - - -# Using the AddressSanitizer on a GPU (beta release) - -The LLVM AddressSanitizer (ASan) provides a process that allows developers to detect runtime addressing errors in applications and libraries. The detection is achieved using a combination of compiler-added instrumentation and runtime techniques, including function interception and replacement. -Until now, the LLVM ASan process was only available for traditional purely CPU applications. However, ROCm has extended this mechanism to additionally allow the detection of some addressing errors on the GPU in heterogeneous applications. Ideally, developers should treat heterogeneous HIP and OpenMP applications exactly like pure CPU applications. However, this simplicity has not been achieved yet. -This document provides documentation on using ROCm ASan. - -For information about LLVM ASan, see the [LLVM documentation](https://clang.llvm.org/docs/AddressSanitizer.html). - -:::{note} -The beta release of LLVM ASan for ROCm is currently tested and validated on Ubuntu 20.04. -::: - -## Compiling for ASan - -The ASan process begins by compiling the application of interest with the ASan instrumentation. - -Recommendations for doing this are: - -* Compile as many application and dependent library sources as possible using an AMD-built clang-based compiler such as `amdclang++`. -* Add the following options to the existing compiler and linker options: - - * `-fsanitize=address` - enables instrumentation - - * `-shared-libsan` - use shared version of runtime - - * `-g` - add debug info for improved reporting - -* Explicitly use `xnack+` in the offload architecture option. For example, `--offload-arch=gfx90a:xnack+` - -Other architectures are allowed, but their device code will not be instrumented and a warning will be emitted. - -:::{tip} -It is not an error to compile some files without ASan instrumentation, but doing so reduces the ability of the process to detect addressing errors. However, if the main program "`a.out`" does not directly depend on the ASan runtime (`libclang_rt.asan-x86_64.so`) after the build completes (check by running `ldd` (List Dynamic Dependencies) or `readelf`), the application will immediately report an error at runtime as described in the next section. -::: - -:::{note} -When compiling OpenMP programs with ASan instrumentation, it is currently necessary to set the environment variable `LIBRARY_PATH` to `/opt/rocm-/lib/llvm/lib/asan:/opt/rocm-/lib/asan`. At runtime, it may be necessary to add `/opt/rocm-/lib/llvm/lib/asan` to `LD_LIBRARY_PATH`. -::: - -### About compilation time - -When `-fsanitize=address` is used, the LLVM compiler adds instrumentation code around every memory operation. This added code must be handled by all downstream components of the compiler toolchain and results in increased overall compilation time. This increase is especially evident in the AMDGPU device compiler and has in a few instances raised the compile time to an unacceptable level. - -There are a few options if the compile time becomes unacceptable: - -* Avoid instrumentation of the files which have the worst compile times. This will reduce the effectiveness of the ASan process. -* Add the option `-fsanitize-recover=address` to the compiles with the worst compile times. This option simplifies the added instrumentation resulting in faster compilation. See below for more information. -* Disable instrumentation on a per-function basis by adding `__attribute__`((no_sanitize("address"))) to functions found to be responsible for the large compile time. Again, this will reduce the effectiveness of the process. - -## Installing ROCm GPU ASan packages - -For a complete ROCm GPU Sanitizer installation, including packages, instrumented HSA and HIP runtimes, tools, and math libraries, use the following instruction, - -```bash - sudo apt-get install rocm-ml-sdk-asan - -``` - -## Using AMD-supplied ASan instrumented libraries - -ROCm releases have optional packages that contain additional ASan instrumented builds of the ROCm libraries (usually found in `/opt/rocm-/lib`). The instrumented libraries have identical names to the regular uninstrumented libraries, and are located in `/opt/rocm-/lib/asan`. -These additional libraries are built using the `amdclang++` and `hipcc` compilers, while some uninstrumented libraries are built with `g++`. The preexisting build options are used but, as described above, additional options are used: `-fsanitize=address`, `-shared-libsan` and `-g`. - -These additional libraries avoid additional developer effort to locate repositories, identify the correct branch, check out the correct tags, and other efforts needed to build the libraries from the source. And they extend the ability of the process to detect addressing errors into the ROCm libraries themselves. - -When adjusting an application build to add instrumentation, linking against these instrumented libraries is unnecessary. For example, any `-L` `/opt/rocm-/lib` compiler options need not be changed. However, the instrumented libraries should be used when the application is run. It is particularly important that the instrumented language runtimes, like `libamdhip64.so` and `librocm-core.so`, are used; otherwise, device invalid access detections may not be reported. - -## Running ASan instrumented applications - -### Preparing to run an instrumented application - -Here are a few recommendations to consider before running an ASan instrumented heterogeneous application. - -* Ensure the Linux kernel running on the system has Heterogeneous Memory Management (HMM) support. A kernel version of 5.6 or higher should be sufficient. -* Ensure XNACK is enabled - * For `gfx90a` (MI-2X0) or `gfx940` (MI-3X0) use environment `HSA_XNACK = 1`. - * For `gfx906` (MI-50) or `gfx908` (MI-100) use environment `HSA_XNACK = 1` but also ensure the amdgpu kernel module is loaded with module argument `noretry=0`. -This requirement is due to the fact that the XNACK setting for these GPUs is system-wide. - -* Ensure that the application will use the instrumented libraries when it runs. The output from the shell command `ldd ` can be used to see which libraries will be used. -If the instrumented libraries are not listed by `ldd`, the environment variable `LD_LIBRARY_PATH` may need to be adjusted, or in some cases an `RPATH` compiled into the application may need to be changed and the application recompiled. - -* Ensure that the application depends on the ASan runtime. This can be checked by running the command `readelf -d | grep NEEDED` and verifying that shared library: `libclang_rt.asan-x86_64.so` appears in the output. -If it does not appear, when executed the application will quickly output an ASan error that looks like: - -```bash -==3210==ASan runtime does not come first in initial library list; you should either link runtime to your application or manually preload it with LD_PRELOAD. -``` - -* Ensure that the application `llvm-symbolizer` can be executed, and that it is located in `/opt/rocm-/llvm/bin`. This executable is not strictly required, but if found is used to translate ("symbolize") a host-side instruction address into a more useful function name, file name, and line number (assuming the application has been built to include debug information). - -There is an environment variable, `ASAN_OPTIONS`, that can be used to adjust the runtime behavior of the ASan runtime itself. There are more than a hundred "flags" that can be adjusted (see an old list at [flags](https://github.com/google/sanitizers/wiki/AddressSanitizerFlags)) but the default settings are correct and should be used in most cases. It must be noted that these options only affect the host ASan runtime. The device runtime only currently supports the default settings for the few relevant options. - -There are three `ASAN_OPTION` flags of note. - -* `halt_on_error=0/1 default 1`. - - This tells the ASan runtime to halt the application immediately after detecting and reporting an addressing error. The default makes sense because the application has entered the realm of undefined behavior. If the developer wishes to have the application continue anyway, this option can be set to zero. However, the application and libraries should then be compiled with the additional option `-fsanitize-recover=address`. Note that the ROCm optional ASan instrumented libraries are not compiled with this option and if an error is detected within one of them, but halt_on_error is set to 0, more undefined behavior will occur. - -* `detect_leaks=0/1 default 1`. - - This option directs the ASan runtime to enable the [Leak Sanitizer](https://clang.llvm.org/docs/LeakSanitizer.html) (LSan). For heterogeneous applications, this default results in significant output from the leak sanitizer when the application exits due to allocations made by the language runtime which are not considered to be leaks. This output can be avoided by adding `detect_leaks=0` to the `ASAN_OPTIONS`, or alternatively by producing an LSan suppression file (syntax described [here](https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer)) and activating it with environment variable `LSAN_OPTIONS=suppressions=/path/to/suppression/file`. When using a suppression file, a suppression report is printed by default. The suppression report can be disabled by using the `LSAN_OPTIONS` flag `print_suppressions=0`. - -* `quarantine_size_mb=N default 256` - - This option defines the number of megabytes (MB) `N` of memory that the ASan runtime will hold after it is `freed` to detect use-after-free situations. This memory is unavailable for other purposes. The default of 256 MB may be too small to detect some use-after-free situations, especially given that the large size of many GPU memory allocations may push `freed` allocations out of quarantine before the attempted use. - - :::{note} - Setting the value of `quarantine_size_mb` larger may enable more problematic uses to be detected, but at the cost of reducing memory available for other purposes. - ::: - -## Runtime overhead - -Running an ASan instrumented application incurs -overheads which may result in unacceptably long runtimes -or failure to run at all. - -### Higher execution time - -ASan detection works by checking each address at runtime -before the address is actually accessed by a load, store, or atomic -instruction. -This checking involves an additional load to "shadow" memory which -records whether the address is "poisoned" or not, and additional logic -that decides whether to produce an detection report or not. - -This extra runtime work can cause the application to slow down by -a factor of three or more, depending on how many memory accesses are -executed. -For heterogeneous applications, the shadow memory must be accessible by all devices -and this can mean that shadow accesses from some devices may be more costly -than non-shadow accesses. - -### Higher memory use - -The address checking described above relies on the compiler to surround -each program variable with a red zone and on ASan -runtime to surround each runtime memory allocation with a red zone and -fill the shadow corresponding to each red zone with poison. -The added memory for the red zones is additional overhead on top -of the 13% overhead for the shadow memory itself. - -Applications which consume most one or more available memory pools when -run normally are likely to encounter allocation failures when run with -instrumentation. - -## Runtime reporting - -It is not the intention of this document to provide a detailed explanation of all the types of reports that can be output by the ASan runtime. Instead, the focus is on the differences between the standard reports for CPU issues, and reports for GPU issues. - -An invalid address detection report for the CPU always starts with - -```bash -====ERROR: AddressSanitizer: on address at pc bp sp of size at thread T0 -``` - -and continues with a stack trace for the access, a stack trace for the allocation and deallocation, if relevant, and a dump of the shadow near the . - -In contrast, an invalid address detection report for the GPU always starts with - -```bash -====ERROR: AddressSanitizer: on amdgpu device at pc of size in workgroup id (,,) -``` - -Above, `` is the integer device ID, and `(, , )` is the ID of the workgroup or block where the invalid address was detected. - -While the CPU report include a call stack for the thread attempting the invalid access, the GPU is currently to a call stack of size one, i.e. the (symbolized) of the invalid access, e.g. - -```bash -#0 in at /path/to/file.hip:: -``` - -This short call stack is followed by a GPU unique section that looks like - -```bash -Thread ids and accessed addresses: - : : ... -``` - -where each ` ` indicates the lane ID and the invalid memory address held by lane `j` of the wavefront attempting the invalid access. - -Additionally, reports for invalid GPU accesses to memory allocated by GPU code via `malloc` or new starting with, for example, - -```bash -==1234==ERROR: AddressSanitizer: heap-buffer-overflow on amdgpu device 0 at pc 0x7fa9f5c92dcc -``` - -or - -```bash -==5678==ERROR: AddressSanitizer: heap-use-after-free on amdgpu device 3 at pc 0x7f4c10062d74 -``` - -currently may include one or two surprising CPU side tracebacks mentioning :`hostcall`". This is due to how `malloc` and `free` are implemented for GPU code and these call stacks can be ignored. - -## Running ASan with `rocgdb` - -`rocgdb` can be used to further investigate ASan detected errors, with some preparation. - -Currently, the ASan runtime complains when starting `rocgdb` without preparation. - -```bash -$ rocgdb my_app -==1122==ASan` runtime does not come first in initial library list; you should either link runtime to your application or manually preload it with LD_PRELOAD. -``` - -This is solved by setting environment variable `LD_PRELOAD` to the path to the ASan runtime, whose path can be obtained using the command - -```bash -amdclang++ -print-file-name=libclang_rt.asan-x86_64.so -``` - -You should also set the environment variable `HIP_ENABLE_DEFERRED_LOADING=0` before debugging HIP applications. - -After starting `rocgdb` breakpoints can be set on the ASan runtime error reporting entry points of interest. For example, if an ASan error report includes - -```bash -WRITE of size 4 in workgroup id (10,0,0) -``` - -the `rocgdb` command needed to stop the program before the report is printed is - -```bash -(gdb) break __asan_report_store4 -``` - -Similarly, the appropriate command for a report including - -```bash -READ of size in workgroup ID (1,2,3) -``` - -is - -```bash -(gdb) break __asan_report_load -``` - -It is possible to set breakpoints on all ASan report functions using these commands: - -```bash -$ rocgdb -(gdb) start -(gdb) rbreak ^__asan_report -(gdb) c -``` - -## Using ASan with a short HIP application - -Consider the following simple and short demo of using the Address Sanitizer with a HIP application: - -```C++ - -#include -#include - -__global__ void -set1(int *p) -{ - int i = blockDim.x*blockIdx.x + threadIdx.x; - p[i] = 1; -} - -int -main(int argc, char **argv) -{ - int m = std::atoi(argv[1]); - int n1 = std::atoi(argv[2]); - int n2 = std::atoi(argv[3]); - int c = std::atoi(argv[4]); - int *dp; - hipMalloc(&dp, m*sizeof(int)); - hipLaunchKernelGGL(set1, dim3(n1), dim3(n2), 0, 0, dp); - int *hp = (int*)malloc(c * sizeof(int)); - hipMemcpy(hp, dp, m*sizeof(int), hipMemcpyDeviceToHost); - hipDeviceSynchronize(); - hipFree(dp); - free(hp); - std::puts("Done."); - return 0; -} -``` - -This application will attempt to access invalid addresses for certain command line arguments. In particular, if `m < n1 * n2` some device threads will attempt to access -unallocated device memory. - -Or, if `c < m`, the `hipMemcpy` function will copy past the end of the `malloc` allocated memory. - -**Note**: The `hipcc` compiler is used here for simplicity. - -Compiling without XNACK results in a warning. - -```bash -$ hipcc -g --offload-arch=gfx90a:xnack- -fsanitize=address -shared-libsan mini.hip -o mini -clang++: warning: ignoring` `-fsanitize=address' option for offload arch 'gfx90a:xnack-`, as it is not currently supported there. Use it with an offload arch containing 'xnack+' instead [-Woption-ignored]`. -``` - -The binary compiled above will run, but the GPU code will not be instrumented and the `m < n1 * n2` error will not be detected. Switching to `--offload-arch=gfx90a:xnack+` in the command above results in a warning-free compilation and an instrumented application. After setting `PATH`, `LD_LIBRARY_PATH` and `HSA_XNACK` as described earlier, a check of the binary with `ldd` yields the following, - -```bash -$ ldd mini - linux-vdso.so.1 (0x00007ffd1a5ae000) - libclang_rt.asan-x86_64.so => /opt/rocm-6.1.0-99999/llvm/lib/clang/17.0.0/lib/linux/libclang_rt.asan-x86_64.so (0x00007fb9c14b6000) - libamdhip64.so.5 => /opt/rocm-6.1.0-99999/lib/asan/libamdhip64.so.5 (0x00007fb9bedd3000) - libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fb9beba8000) - libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb9bea59000) - libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fb9bea3e000) - libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb9be84a000) - libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb9be844000) - libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb9be821000) - librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fb9be817000) - libamd_comgr.so.2 => /opt/rocm-6.1.0-99999/lib/asan/libamd_comgr.so.2 (0x00007fb9b4382000) - libhsa-runtime64.so.1 => /opt/rocm-6.1.0-99999/lib/asan/libhsa-runtime64.so.1 (0x00007fb9b3b00000) - libnuma.so.1 => /lib/x86_64-linux-gnu/libnuma.so.1 (0x00007fb9b3af3000) - /lib64/ld-linux-x86-64.so.2 (0x00007fb9c2027000) - libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fb9b3ad7000) - libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007fb9b3aa7000) - libelf.so.1 => /lib/x86_64-linux-gnu/libelf.so.1 (0x00007fb9b3a89000) - libdrm.so.2 => /opt/amdgpu/lib/x86_64-linux-gnu/libdrm.so.2 (0x00007fb9b3a70000) - libdrm_amdgpu.so.1 => /opt/amdgpu/lib/x86_64-linux-gnu/libdrm_amdgpu.so.1 (0x00007fb9b3a62000) - -``` - -This confirms that the address sanitizer runtime is linked in, and the ASan instrumented version of the runtime libraries are used. -Checking the `PATH` yields - -```bash -$ which llvm-symbolizer -/opt/rocm-6.1.0-99999/llvm/bin/llvm-symbolizer -``` - -Lastly, a check of the OS kernel version yields - -```bash -$ uname -rv -5.15.0-73-generic #80~20.04.1-Ubuntu SMP Wed May 17 14:58:14 UTC 2023 -``` - -which indicates that the required HMM support (kernel version > 5.6) is available. This completes the necessary setup. Running with `m = 100`, `n1 = 11`, `n2 = 10` and `c = 100` should produce -a report for an invalid access by the last 10 threads. - -```bash -================================================================= -==3141==ERROR: AddressSanitizer: heap-buffer-overflow on amdgpu device 0 at pc 0x7fb1410d2cc4 -WRITE of size 4 in workgroup id (10,0,0) - #0 0x7fb1410d2cc4 in set1(int*) at /home/dave/mini/mini.cpp:0:10 - -Thread ids and accessed addresses: -00 : 0x7fb14371d190 01 : 0x7fb14371d194 02 : 0x7fb14371d198 03 : 0x7fb14371d19c 04 : 0x7fb14371d1a0 05 : 0x7fb14371d1a4 06 : 0x7fb14371d1a8 07 : 0x7fb14371d1ac -08 : 0x7fb14371d1b0 09 : 0x7fb14371d1b4 - -0x7fb14371d190 is located 0 bytes after 400-byte region [0x7fb14371d000,0x7fb14371d190) -allocated by thread T0 here: - #0 0x7fb151c76828 in hsa_amd_memory_pool_allocate /work/dave/git/compute/external/llvm-project/compiler-rt/lib/asan/asan_interceptors.cpp:692:3 - #1 ... - - #12 0x7fb14fb99ec4 in hipMalloc /work/dave/git/compute/external/clr/hipamd/src/hip_memory.cpp:568:3 - #13 0x226630 in hipError_t hipMalloc(int**, unsigned long) /opt/rocm-6.1.0-99999/include/hip/hip_runtime_api.h:8367:12 - #14 0x226630 in main /home/dave/mini/mini.cpp:19:5 - #15 0x7fb14ef02082 in __libc_start_main /build/glibc-SzIz7B/glibc-2.31/csu/../csu/libc-start.c:308:16 - -Shadow bytes around the buggy address: - 0x7fb14371cf00: ... - -=>0x7fb14371d180: 00 00[fa]fa fa fa fa fa fa fa fa fa fa fa fa fa - 0x7fb14371d200: ... - -Shadow byte legend (one shadow byte represents 8 application bytes): - Addressable: 00 - Partially addressable: 01 02 03 04 05 06 07 - Heap left redzone: fa - ... -==3141==ABORTING -``` - -Running with `m = 100`, `n1 = 10`, `n2 = 10` and `c = 99` should produce a report for an invalid copy. - -```shell -================================================================= -==2817==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x514000150dcc at pc 0x7f5509551aca bp 0x7ffc90a7ae50 sp 0x7ffc90a7a610 -WRITE of size 400 at 0x514000150dcc thread T0 - #0 0x7f5509551ac9 in __asan_memcpy /work/dave/git/compute/external/llvm-project/compiler-rt/lib/asan/asan_interceptors_memintrinsics.cpp:61:3 - #1 ... - - #9 0x7f5507462a28 in hipMemcpy_common(void*, void const*, unsigned long, hipMemcpyKind, ihipStream_t*) /work/dave/git/compute/external/clr/hipamd/src/hip_memory.cpp:637:10 - #10 0x7f5507464205 in hipMemcpy /work/dave/git/compute/external/clr/hipamd/src/hip_memory.cpp:642:3 - #11 0x226844 in main /home/dave/mini/mini.cpp:22:5 - #12 0x7f55067c3082 in __libc_start_main /build/glibc-SzIz7B/glibc-2.31/csu/../csu/libc-start.c:308:16 - #13 0x22605d in _start (/home/dave/mini/mini+0x22605d) - -0x514000150dcc is located 0 bytes after 396-byte region [0x514000150c40,0x514000150dcc) -allocated by thread T0 here: - #0 0x7f5509553dcf in malloc /work/dave/git/compute/external/llvm-project/compiler-rt/lib/asan/asan_malloc_linux.cpp:69:3 - #1 0x226817 in main /home/dave/mini/mini.cpp:21:21 - #2 0x7f55067c3082 in __libc_start_main /build/glibc-SzIz7B/glibc-2.31/csu/../csu/libc-start.c:308:16 - -SUMMARY: AddressSanitizer: heap-buffer-overflow /work/dave/git/compute/external/llvm-project/compiler-rt/lib/asan/asan_interceptors_memintrinsics.cpp:61:3 in __asan_memcpy -Shadow bytes around the buggy address: - 0x514000150b00: ... - -=>0x514000150d80: 00 00 00 00 00 00 00 00 00[04]fa fa fa fa fa fa - 0x514000150e00: ... - -Shadow byte legend (one shadow byte represents 8 application bytes): - Addressable: 00 - Partially addressable: 01 02 03 04 05 06 07 - Heap left redzone: fa - ... -==2817==ABORTING -``` - -## Known issues with using GPU sanitizer - -* Red zones must have limited size. It is possible for an invalid access to completely miss a red zone and not be detected. - -* Lack of detection or false reports can be caused by the runtime not properly maintaining red zone shadows. - -* Lack of detection on the GPU might also be due to the implementation not instrumenting accesses to all GPU specific address spaces. For example, in the current implementation accesses to "private" or "stack" variables on the GPU are not instrumented, and accesses to HIP shared variables (also known as "local data store" or "LDS") are also not instrumented. - -* It can also be the case that a memory fault is reported for an invalid address even with the instrumentation. This is usually caused by the invalid address being so wild that its shadow address is outside any memory region, and the fault actually occurs on the access to the shadow address. It is also possible to hit a memory fault for the `NULL` pointer. While address 0 does have a shadow location, it is not poisoned by the runtime. - -* There is currently a bug which can result in memory faults being reported when running instrumented device code which makes use of `malloc`, `free`, `new`, or `delete`. - -* There is currently a bug which can result in undefined symbols being reported at compile time when instrumented device code makes use of `new` and `delete`. diff --git a/docs/contribute/contributing.md b/docs/contribute/contributing.md index 6fbcc2325..a92aa4005 100644 --- a/docs/contribute/contributing.md +++ b/docs/contribute/contributing.md @@ -56,6 +56,11 @@ To make edits to our documentation via PR, follow these steps: 6. Change directory into the `./docs` folder and make any documentation changes locally using your preferred code editor. Follow the guidelines listed on the [documentation structure](./doc-structure.md) page. + ```{note} + Spell checking is performed for pull requests by {doc}`ROCm Docs Core`. To ensure your PR passes spell checking you might need at add new words or acronyms to the `.wordlist.txt` file as described in {doc}`Spell Check`. + ``` + + 7. Optionally run a local test build of the documentation to ensure the content builds and looks as expected. In your terminal, run the following commands from within the `./docs` folder of your cloned repository: ```bash diff --git a/docs/data/rocm-software-stack-6_1_0.jpg b/docs/data/rocm-software-stack-6_1_0.jpg deleted file mode 100644 index 488264aa3a7abc44d5f5de8beb3fd4dffb2d6243..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 255443 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%0Dk{!SQa^uSWd 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 diff --git a/docs/data/rocm-software-stack-6_2_0.jpg b/docs/data/rocm-software-stack-6_2_0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8fe413e065e8b3aff68e06a09585a5e51f4a0a87 GIT binary patch literal 295164 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%0AgnC8#;erw_rfUiSE4 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