CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
446 lines
16 KiB
ReStructuredText
446 lines
16 KiB
ReStructuredText
..
|
|
MIT License
|
|
|
|
Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved.
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
in the Software without restriction, including without limitation the rights
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included in all
|
|
copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
SOFTWARE.
|
|
|
|
.. contents::
|
|
|
|
.. START_OVERVIEW
|
|
|
|
libhip++:
|
|
=========
|
|
|
|
``libhip++`` (``libhipcxx``) provides fundamental, idiomatic C++ abstractions that aim to make the lives of HIP C++
|
|
developers easier. Libhipcxx is derived from libcudacxx and aims to support the same APIs on AMD GPUs.
|
|
|
|
Specifically, ``libhip++`` provides:
|
|
|
|
- C++ Standard Library features useable in both host and device code
|
|
- Extensions to C++ Standard Library features
|
|
- Fundamental, HIP-specific programming model abstractions
|
|
|
|
Disclaimer
|
|
----------
|
|
|
|
This README is derived from the original libcudacxx/CCCL project's documentation files.
|
|
More care is necessary to remove/modify parts that are only applicable to the original version.
|
|
|
|
C++ Standard Library Features
|
|
-----------------------------
|
|
|
|
If you are a C++ developer, then you know the C++ Standard Library (`sometimes referred to as “The
|
|
STL” <https://stackoverflow.com/questions/5205491/whats-the-difference-between-stl-and-c-standard-library>`_)
|
|
as what comes along with your compiler and provides things like ``std::string`` or ``std::vector`` or ``std::atomic``.
|
|
It provides the fundamental abstractions that C++ developers need to build high quality applications and libraries.
|
|
|
|
By default, these abstractions aren't available when writing HIP C++ device code because they don't have the necessary
|
|
``__host__ __device__`` decorators, and their implementation may not be suitable for using in and across host and device
|
|
code.
|
|
|
|
libhip++ aims to solve this problem by providing an opt-in, incremental, heterogeneous implementation of C++
|
|
Standard Library features:
|
|
|
|
1. **Opt-in**: It does not replace the Standard Library provided by your host compiler (aka anything in ``std::``)
|
|
2. **Incremental**: It does not provide a complete C++ Standard Library implementation
|
|
3. **Heterogeneous**: It works in both host and device code, as well as passing between host and device code.
|
|
|
|
If you know how to use things like the ``<atomic>`` or ``<type_traits>`` headers from the C++ Standard Library, then
|
|
you know how to use libhip++.
|
|
|
|
All you have to do is add ``cuda/std/`` to the start of your includes and ``cuda::`` before any uses of ``std::``:
|
|
|
|
.. code:: cuda
|
|
|
|
#include <cuda/std/atomic>
|
|
cuda::std::atomic<int> x;
|
|
|
|
..
|
|
.. note::
|
|
|
|
libhip++ does not provide its own documentation for Standard Library features. Instead, libhip++
|
|
:ref:`documents which Standard Library headers <libhipcxx-standard-api>` are made available, and defers documentation of
|
|
individual features within those headers to other sources like `cppreference <https://en.cppreference.com/w/>`_.
|
|
|
|
C++ Standard Library Extensions
|
|
-------------------------------
|
|
|
|
libhip++ provides HIP C++ developers with familiar Standard Library utilities to improve productivity and flatten the
|
|
learning curve of learning HIP. However, there are many aspects of writing high-performance HIP C++ code that cannot
|
|
be expressed through purely Standard conforming APIs. For these cases, libhip++ also provides *extensions* of Standard
|
|
Library utilities.
|
|
|
|
For example, libhip++ extends ``atomic<T>`` and other synchronization primitives with the notion of a “thread scope”
|
|
that controls the strength of the memory fence.
|
|
|
|
To use utilities that are extensions to Standard Library features, drop the ``std``:
|
|
|
|
.. code:: cuda
|
|
|
|
#include <cuda/atomic>
|
|
cuda::atomic<int, cuda::thread_scope_device> x;
|
|
|
|
..
|
|
See the :ref:`Extended API <libhipcxx-extended-api>` section for more information.
|
|
|
|
Fundamental HIP-specific Abstractions
|
|
--------------------------------------
|
|
|
|
Some abstractions that libhip++ provide have no equivalent in the C++ Standard Library, but are otherwise abstractions
|
|
fundamental to the HIP C++ programming model.
|
|
|
|
..
|
|
For example, :ref:`cuda::memcpy_async <libhipcxx-extended-api-asynchronous-operations-memcpy-async>` is a vital abstraction
|
|
for asynchronous data movement between global and shared memory.
|
|
This abstracts hardware features such as ``LDGSTS`` on
|
|
Ampere, and the Tensor Memory Accelerator (TMA) on Hopper.
|
|
See the :ref:`Extended API <libhipcxx-extended-api>` section for more information.
|
|
|
|
HIP-aliasing
|
|
-------------
|
|
|
|
Instead of using ``cuda::`` and ``cuda::std::`` it is also possible to use ``hip::`` and ``hip::std::``.
|
|
Both include variants (via ``hip`` or ``cuda``) can be used interchangeably.
|
|
|
|
Summary: ``std::``, ``cuda::``/ ``hip::`` and ``cuda::std::``/ ``hip::std::``
|
|
--------------------------------------------------
|
|
|
|
- ``std::`` / ``<*>``: This is your host compiler's Standard Library that works in ``__host__`` code only.
|
|
libhip++ does not replace or interfere with host compiler's Standard Library.
|
|
- ``cuda::std::`` / ``hip::std::`` / ``<cuda/std/*>`` / ``<hip/std/*>``: Conforming implementations of facilities from the Standard Library that work in
|
|
``__host__`` and ``__device__`` code.
|
|
- ``cuda::`` / ``hip::`` / ``<cuda/*>`` / ``<hip/*>``: Conforming extensions to the Standard Library that work in ``__host__`` and ``__device__`` code.
|
|
- ``cuda::device`` / ``hip::device`` / ``<cuda/device/*>`` / ``<hip/device/*>``: Conforming extensions to the Standard Library that work only in
|
|
``__device__`` code.
|
|
|
|
.. code:: cpp
|
|
|
|
// Standard C++, __host__ only.
|
|
#include <atomic>
|
|
std::atomic<int> x;
|
|
|
|
// HIP C++, __host__ __device__.
|
|
// Strictly conforming to the C++ Standard.
|
|
#include <cuda/std/atomic>
|
|
cuda::std::atomic<int> x;
|
|
|
|
// HIP C++, __host__ __device__.
|
|
// Conforming extensions to the C++ Standard.
|
|
#include <cuda/atomic>
|
|
cuda::atomic<int, cuda::thread_scope_block> x;
|
|
|
|
How to use libhipcxx in your CMake Project
|
|
------------------------------------------
|
|
|
|
Example `CMakeLists.txt`:
|
|
|
|
.. code-block:: cmake
|
|
|
|
#...
|
|
find_package(libhipcxx)
|
|
#...
|
|
target_link_libraries(<your_target> PRIVATE libhipcxx::libhipcxx)
|
|
|
|
Make sure to set `CMAKE_PREFIX_PATH` when running CMake for your project, in case you installed libhipcxx in a non-default installation directory.
|
|
|
|
Limitations/Unsupported Features/APIs
|
|
-------------------------------------
|
|
|
|
- Libhipcxx does not support CUDA backend/NVIDIA hardware.
|
|
- Libhipcxx does not support the Windows OS.
|
|
- `cuda::std::chrono::system_clock::now()` does not return a UNIX timestamp, host system clock and device system clock are not synchronized and they may run at different clock rates.
|
|
- The following APIs from [libcudacxx] are *NOT* supported in libhipcxx:
|
|
|
|
========================================= ====================== ========================================================================================
|
|
Group API Header Description
|
|
========================================= ====================== ========================================================================================
|
|
Synchronization Library `<cuda/std/latch>` Single-phase asynchronous thread-coordination mechanism
|
|
Synchronization Library `<cuda/std/barrier>` Multi-phase asynchronous thread-coordination mechanism
|
|
Synchronization Library `<cuda/std/semaphore>` Primitives for constraining concurrent access
|
|
Extended Synchronization Library `<cuda/latch>` System-wide `cuda::std::latch` single-phase asynchronous thread coordination mechanism.
|
|
Extended Synchronization Library `<cuda/barrier>` System-wide `cuda::std::barrier` multi-phase asynchronous thread coordination mechanism.
|
|
Extended Synchronization Library `<cuda/semaphore>` System-wide primitives for constraining concurrent access.
|
|
Extended Synchronization Library `<cuda/pipeline>` Coordination mechanisms to sequence asynchronous operations.
|
|
Extended Memory Access Properties Library `<cuda/annotated_ptr>` Memory access properties for pointers.
|
|
PTX API `<cuda/ptx>` The `cuda::ptx` namespace contains functions that map to Nvidia PTX instructions.
|
|
========================================= ====================== ========================================================================================
|
|
|
|
Licensing
|
|
---------
|
|
|
|
libhip++ is an open source project developed on `GitHub <https://github.com/ROCm/libhipcxx>`_. It is derived from `libcudacxx <https://github.com/nvidia/cccl>`_ and
|
|
`LLVM's libc++ <https://libcxx.llvm.org>`_. The original `libcudacxx <https://github.com/nvidia/cccl>`_ and `LLVM's libc++ <https://libcxx.llvm.org>`_ are distributed under the Apache License v2.0 with LLVM Exceptions. Any new files and modifications made to existing files by AMD are distributed under MIT.
|
|
|
|
Conformance
|
|
-----------
|
|
|
|
libhip++ aims to be a conforming implementation of the C++ Standard, `ISO/IEC IS 14882 <https://eel.is/c++draft>`_,
|
|
Clause 16 through 32.
|
|
|
|
ABI Evolution
|
|
-------------
|
|
|
|
libhip++ does not maintain long-term ABI stability. Promising long-term ABI stability would prevent us from fixing
|
|
mistakes and providing best in class performance. So, we make no such promises.
|
|
|
|
Every major release, the ABI will be broken. The life cycle of an ABI version is approximately one year.
|
|
Long-term support for an ABI version ends after approximately two years.
|
|
|
|
.. Please see the :ref:`versioning section <libhipcxx-releases-versioning>` for more details.
|
|
|
|
.. We recommend that you always recompile your code and dependencies with the latest NVIDIA SDKs and use the latest
|
|
.. NVIDIA C++ Standard Library ABI. `Live at head <https://www.youtube.com/watch?v=tISy7EJQPzI&t=1032s>`_.
|
|
|
|
.. END_OVERVIEW
|
|
|
|
.. START_REQUIREMENTS
|
|
|
|
Requirements
|
|
============
|
|
|
|
All requirements are applicable to the ``main`` branch on GitHub.
|
|
|
|
..
|
|
For details on specific releases, please see the
|
|
:ref:`changelog <libhipcxx-releases-changelog>`.
|
|
|
|
Usage Requirements
|
|
------------------
|
|
|
|
To use libhipcxx, you must meet the following
|
|
requirements.
|
|
|
|
System Software
|
|
~~~~~~~~~~~~~~~
|
|
|
|
Currently, libhipcxx is tested only for `ROCm <https://rocm.docs.amd.com/en/latest/>`_ 7.2.0.
|
|
|
|
C++ Dialects
|
|
~~~~~~~~~~~~
|
|
|
|
Libhipcxx supports the following C++ dialects:
|
|
|
|
- C++17
|
|
- C++20
|
|
|
|
At the moment, libhipcxx is only tested for C++17.
|
|
|
|
A number of features have been backported to earlier standards. Please
|
|
see the [API section] for more details.
|
|
|
|
hipcc Host Compilers
|
|
~~~~~~~~~~~~~~~~~~~~
|
|
|
|
When used with hipcc, Libhipcxx supports the
|
|
following host compilers:
|
|
|
|
- hipcc
|
|
|
|
Device Architectures
|
|
~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Libhipcxx supports the following AMD device architectures:
|
|
|
|
- gfx90a (MI210 + MI250)
|
|
- gfx942 (MI300)
|
|
- gfx950 (MI355)
|
|
|
|
|
|
RDNA architectures have only experimental support.
|
|
|
|
Host Architectures
|
|
~~~~~~~~~~~~~~~~~~
|
|
|
|
Libhipcxx supports the following host
|
|
architectures:
|
|
|
|
- x86-64.
|
|
|
|
Host Operating Systems
|
|
~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Libhipcxx supports the following host operating
|
|
systems:
|
|
|
|
- Linux.
|
|
|
|
Build and Test Requirements
|
|
---------------------------
|
|
|
|
To build and test libhip++ yourself, you will need the following in
|
|
addition to the usage requirements:
|
|
|
|
- `CMake <https://cmake.org>`_ >=3.12.
|
|
- `LLVM <https://github.com/llvm>`_ 18.1.8+.
|
|
|
|
- You do not have to build LLVM; we only need its CMake modules.
|
|
|
|
- `lit <https://pypi.org/project/lit/>`_, the LLVM Integrated Tester.
|
|
|
|
- We recommend installing lit 18.1.8 using Python's pip package manager.
|
|
- sccache
|
|
- ninja
|
|
|
|
.. END_REQUIREMENTS
|
|
|
|
.. START_GETTING
|
|
|
|
Getting libhip++
|
|
================
|
|
|
|
GitHub
|
|
------
|
|
|
|
libhip++ is an open source project developed on GitHub, which is where
|
|
you'll find the latest versions and the development branch. Our GitHub
|
|
repository is `github.com/ROCm/libhipcxx <https://github.com/ROCm/libhipcxx>`_.
|
|
|
|
.. END_GETTING
|
|
|
|
.. START_BUILDING
|
|
|
|
Build and Installation
|
|
======================
|
|
|
|
Since libhipcxx is a header-only library it is not necessary to build the library.
|
|
Only if the tests should be run, lit need to build and then run the test suites.
|
|
|
|
Prerequisites
|
|
-------------
|
|
|
|
It is assumed that the test dependencies have been installed (e.g., `pip3 install lit==18.1.8` for the lit dependency).
|
|
The following commands can be run from the root directory to configure libhipcxx, build it and run the unit tests:
|
|
|
|
Installation
|
|
------------
|
|
|
|
1. Create build directory
|
|
|
|
.. code-block:: bash
|
|
|
|
mkdir build && cd build
|
|
|
|
2. Run CMake to configure LIT testing (DCMAKE_INSTALL_PREFIX is optional)
|
|
|
|
.. code-block:: bash
|
|
|
|
cmake -GNinja -DCMAKE_INSTALL_PREFIX=<path to install directory> ..
|
|
|
|
3. Compile all headers that are part of the library
|
|
|
|
.. code-block:: bash
|
|
|
|
ninja
|
|
|
|
4. Install the headers locally:
|
|
|
|
.. code-block:: bash
|
|
|
|
ninja install
|
|
|
|
Usage with HIPRTC
|
|
-----------------
|
|
If you would like to build libhipcxx with HIPRTC support, you can modify step 2 as follows:
|
|
|
|
- Run CMake with HIPRTC support enabled:
|
|
|
|
.. code-block:: bash
|
|
|
|
cmake -DLIBHIPCXX_TEST_WITH_HIPRTC=ON -DCMAKE_INSTALL_PREFIX=<path-to-install-directory> ..
|
|
|
|
|
|
Optional: Creating Distribution Packages
|
|
----------------------------------------
|
|
|
|
Libhipcxx can be packaged using cpack:
|
|
|
|
1. Switch to the build directory
|
|
|
|
.. code-block:: bash
|
|
|
|
cd build
|
|
|
|
2. Run CPack to generate packaged archives of libhipcxx:
|
|
|
|
.. code-block:: bash
|
|
|
|
cpack .
|
|
|
|
.. note::
|
|
Per default, this will only generate TGZ, ZIP and DEB packages. You can generate other package formats, e.g., with:
|
|
|
|
.. code-block:: bash
|
|
|
|
cpack -G RPM .
|
|
|
|
Running the Tests
|
|
-----------------
|
|
|
|
To run the tests on host and device based on LIT, you can use:
|
|
|
|
.. code-block:: bash
|
|
|
|
ninja check-hipcxx
|
|
|
|
Alternatively, there is a helper script at ``utils/amd/linux/perform_tests.bash`` which can be used as follows:
|
|
|
|
1. Change directory to build directory:
|
|
|
|
.. code-block:: bash
|
|
|
|
cd build
|
|
|
|
2. Run the tests
|
|
|
|
.. code-block:: bash
|
|
|
|
bash ../utils/amd/linux/perform_tests.bash
|
|
|
|
Please note the following regarding test behavior:
|
|
|
|
- If you pass the ``LIBHIPCXX_TEST_WITH_HIPRTC`` option to CMake, the tests will run with HIPRTC support enabled.
|
|
- If you do not pass this option, the tests will run without HIPRTC support.
|
|
|
|
|
|
Using CI Scripts for Automated Testing
|
|
--------------------------------------
|
|
|
|
For automated testing in continuous integration environments or when you need a predefined testing workflow, it is recommended to use the CI scripts provided in the `ci` directory. These scripts can run tests with both HIP and HIPRTC configurations.
|
|
|
|
1. Change directory to ci directory:
|
|
|
|
.. code-block:: bash
|
|
|
|
cd ci
|
|
|
|
2. If you want to run tests without HIPRTC:
|
|
|
|
.. code-block:: bash
|
|
|
|
bash ./test_libhipcxx.sh
|
|
|
|
3. If you want to run tests with HIPRTC:
|
|
|
|
.. code-block:: bash
|
|
|
|
bash ./hiprtc_libhipcxx.sh
|
|
|
|
.. END_BUILDING
|