Repository navigation
feat(hipblas): add the generated Fortran binding in bindings/fortran/hipblas - #12370
Draft
amontoison wants to merge 8 commits into
Draft
amontoison wants to merge 8 commits into
amontoison wants to merge 8 commits into
Conversation
amontoison
force-pushed
the
users/amontoison/hipblas-fortran-bindings
branch
from
September 21, 2026 15:40
0f51aca to
1affc44
Compare
✅ All Checks Passed — Ready for Review
📖 Need help? See the Policy FAQ for details on every check and how to fix failures. |
|
🎉 All checks passed! This PR is ready for review. |
This was referenced Sep 24, 2026
amontoison
force-pushed
the
users/amontoison/hipblas-fortran-bindings
branch
from
September 24, 2026 16:49
1affc44 to
cbe1821
Compare
amontoison
added a commit
to amontoison/rocm-cmake
that referenced
this pull request
Sep 24, 2026
…gets
A library that ships generated Fortran bindings installs them as their own
config package, <package>-fortran-config.cmake, so that the binding can be built
and installed independently of the C library -- which is the supported path for
anyone whose Fortran compiler is not the one ROCm ships the bindings for.
For find_package(<package>) to then expose <ns>::<package>_fortran, the C
package has to pick that file up as a sibling. rocm_export_targets already has
an INCLUDE argument, and it is not usable for this, for two independent reasons:
- it emits a bare include(), so the file must always exist, whereas a Fortran
binding is present only when BUILD_FORTRAN_BINDINGS was on and a Fortran
compiler was available; and
- it emits it BEFORE the targets file, so the Fortran config would run before
the imported C targets exist, and the Fortran interface library could not
link against them.
So emit a separate include, after the targets and marked OPTIONAL. It is a no-op
for every package that ships no such file, which is all of them today, and it
lets a Fortran binding installed after the C library be found at
find_package(<package>) time and ignored when absent.
Guarded against the case where a caller already passed the same file through
INCLUDE, so it is not included twice.
rocm_write_package_template_function joins ARGN with spaces into NAME(...), so
the trailing OPTIONAL keyword passes through verbatim; no new emission path is
needed. Verified, the emitted line is
include("@PACKAGE_CONFIG_PACKAGE_INSTALL_DIR@/rocblas-fortran-config.cmake" OPTIONAL)
using the same @PACKAGE_...@ substitution the targets include already relies on,
and include(... OPTIONAL) on a missing file is confirmed to be a clean no-op.
Needed by the RFC0014 Fortran bindings rollout in rocm-libraries and
rocm-systems (ROCm/rocm-libraries#12370, #12505, #12506, #12514, #12533).
amontoison
force-pushed
the
users/amontoison/hipblas-fortran-bindings
branch
3 times, most recently
from
September 25, 2026 02:04
02b3d7f to
e601d68
Compare
This was referenced Sep 25, 2026
amontoison
force-pushed
the
users/amontoison/hipblas-fortran-bindings
branch
from
September 28, 2026 03:47
e601d68 to
63ed4d6
Compare
amontoison
force-pushed
the
users/amontoison/hipblas-fortran-bindings
branch
2 times, most recently
from
September 28, 2026 19:42
48eea04 to
b0dffaa
Compare
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## develop #12370 +/- ##
========================================
Coverage 75.95% 75.95%
========================================
Files 2880 2880
Lines 479025 479025
Branches 71958 71958
========================================
Hits 363828 363828
Misses 90338 90338
Partials 24859 24859
*This pull request uses carry forward flags. Click here to find out more. 🚀 New features to boost your workflow:
|
amontoison
force-pushed
the
users/amontoison/hipblas-fortran-bindings
branch
2 times, most recently
from
October 4, 2026 03:45
e491e5b to
08c9e40
Compare
amontoison
force-pushed
the
users/amontoison/hipblas-fortran-bindings
branch
from
October 5, 2026 05:12
08c9e40 to
8a970ae
Compare
Add fortran/hipblas.F90, the hipblas module generated from the C headers by the rocm-fortran generator under RFC0019 (ROCm/TheRock#8122). It is committed next to the headers, is not edited by hand, and .gitattributes marks it linguist-generated.
amontoison
force-pushed
the
users/amontoison/hipblas-fortran-bindings
branch
2 times, most recently
from
October 22, 2026 15:30
23daf28 to
81e7888
Compare
…ted one
Build fortran/hipblas.F90 as roc::hipblas_fortran from fortran/, a CMake
project of its own that the root adds. BUILD_FORTRAN_BINDINGS (default
${UNIX}, OFF on the CUDA backend) and FORTRAN_ARRAY_INTERFACES (default
assumed-shape) control it; the existing BUILD_FORTRAN_CLIENTS is forced
OFF when no binding is built. HIPBLAS_BUILD_FORTRAN_* override both per
library. The .mod and the archive install per compiler under
<includedir>/fortran/<compiler> and <libdir>/fortran/<compiler>, beside
a hipblas-fortran config package.
Remove library/src/hipblas_module.f90. Its hipblas_enums module is
folded into hipblas, so use hipblas_enums becomes use hipblas, and
hipblasCreate and the getters take their output by reference. The
clients shims and samples use the generated module; a client-only
hip_datatypes_stub.F90 stands in for the HIP binding until
ROCm/rocm-systems#11923 lands. There is no fortran/test suite.
Refs: ROCm/TheRock#8122 (RFC0019)
amontoison
force-pushed
the
users/amontoison/hipblas-fortran-bindings
branch
from
October 22, 2026 18:13
81e7888 to
0940a13
Compare
The hipBLAS Fortran binding consumes hipBLAS's public API and builds standalone against an installed hipBLAS, so it moves out of the library into bindings/fortran/hipblas, the tree every monorepo and TheRock use for the Fortran bindings (RFC0015). Nothing is wired into the library build any more: the library is back to its state on develop. Its hand-written Fortran module stays for now: its deprecation and removal, with the Fortran clients that use it, follow in separate pull requests. - bindings/fortran/hipblas reads hipBLAS's version from projects/hipblas - the binding has its own .gitattributes and CHANGELOG.md - CODEOWNERS: /bindings/fortran/hipblas/, same owners - repos-config.json: register bindings/fortran/hipblas so CI detects changes
…tests - regenerate bindings/fortran/hipblas with rocm-fortran-generator 9c8b3e4 - commit its metadata in bindings/fortran/hipblas/metadata/, where the generator reads it from a checkout - add the binding's tests in test/, under BUILD_FORTRAN_CLIENTS, ported from hipFORT's hipBLAS tests: the library's own clients still test the hand-written module while it is deprecated, so they did not test the binding - drop hip_datatypes_stub.F90, a stand-in for the HIP module that the library's clients used and nothing builds any more
Install the test executables in bin/, and a CTestTestfile.cmake in bin/hipblas-fortran/ with the same tests and properties as the build tree, so that ctest --test-dir runs them from an install, as TheRock's test jobs do for the libraries.
The binding is built against an installed hipBLAS and is never added to the library's build, so drop what only served that: the per-library BUILD_FORTRAN_* overrides, the PARENT_SCOPE results, the ROCM_HAVE_FORTRAN shortcut, the gating on the library's client and test options, and the comments about the root. Find the Fortran compiler through the cmake/ROCmFortranCompiler.cmake shared by all the bindings, and require CMake 3.19. The binding targets the ROCm backend only, so BUILD_FORTRAN_BINDINGS no longer defaults to OFF on the CUDA backend.
…-fortran The package files went to lib/cmake/hipblas, the C library's directory, with a forwarder in lib/cmake/hipblas-fortran. rocRAND and hipRAND install their own legacy <lib>-fortran-config.cmake there, so the files overlapped. Install the config, targets and version files directly where find_package(<package>) looks, as the HIP and ROCTx bindings do, and drop the forwarder.
…ut recursion rocm-cmake's generated hipblas-config.cmake is to include lib/cmake/hipblas-fortran/hipblas-fortran-config.cmake after its targets (ROCm/rocm-cmake#303). Skip find_dependency(hipblas) when hipblas is the package being found, not only when roc::hipblas is already imported, so that include never re-enters hipblas-config.cmake.
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implements RFC0015, Fortran Bindings Split (update) for hipBLAS:
bindings/fortran/hipblas/is a standalone CMake project that builds the generated Fortran binding against an installed hipBLAS. The library is untouched: no option, noadd_subdirectory, no change toprojects/hipblas/.What lands
bindings/fortran/hipblas/hipblas.F90(163 733 lines, generated with ROCm/rocm-fortran-generator 9c8b3e4 from the hipBLAS headers, markedlinguist-generated): one modulehipblaswith thebind(C)interfaces, the enum constants, thehipblasCheckhelper and array overloads for the routines the generator supports.metadata/hipblas.toml: the generator metadata it was generated with.test/: 209 CTest tests, 126.f03tests of the C interfaces and 83.f08tests of the array overloads (registered as<name>_f2008). They also install: the executables inbin/, and aCTestTestfile.cmakewith the same tests and properties inbin/hipblas-fortran/, forctest --test-dir.CMakeLists.txt, thehipblas-fortranconfig template,cmake/ROCmFortranCompiler.cmake(the same in every binding: ROCm'samdflangis preferred over the first compiler onPATHunlessCMAKE_Fortran_COMPILERorFCis set),cmake/toolchains/and the binding'sCHANGELOG.md..github/CODEOWNERS:/bindings/fortran/hipblas/ @ROCm/rocm-fortran-maintainers @ROCm/hipblas-reviewers..github/repos-config.json: abindings/fortranentry, so CI detects changes to the binding. Each binding PR appends its entry at the end of the list, so all but the first to merge need a trivial rebase.A consumer uses
find_package(hipblas-fortran)and linksroc::hipblas_fortran. The archive and.modfiles install per compiler underlib/fortran/<compiler>/andinclude/fortran/<compiler>/;HIPBLAS_FORTRAN_COMPILER_DIRnames that directory. The archive has one section per procedure, so a program linked with-Wl,--gc-sectionskeeps only the wrappers it calls.Options
BUILD_FORTRAN_BINDINGS${UNIX}BUILD_FORTRAN_CLIENTSONtest/; off underBUILD_ADDRESS_SANITIZERFORTRAN_ARRAY_INTERFACESassumed-shapenone/assumed-shape/assumed-rankarray overloadsIn TheRock
ROCm/TheRock#9446 builds
bindings/fortran/hipblasas thehipblas-fortransubproject against the hipBLAS it built, with-DBUILD_FORTRAN_BINDINGS=ON -DBUILD_FORTRAN_CLIENTS=${THEROCK_BUILD_TESTING}, ships it in theblas-fortranartifact and runs the installed tests in itshipblas-fortranGPU test job.Follow-ups
This binding replaces the hand-written
library/src/hipblas_module.f90, which stays for now. Deprecating it, then removing it and moving the library's Fortran clients to this binding, come in separate pull requests.Build and test
From the repository root, with
$PREFIXthe install prefix:$HIP_FORTRAN_PREFIXholds the HIP Fortran binding (hip-fortran) built with the same compiler; without it the tests are skipped.Verification
Standalone against ROCm 10.1 with amdflang on one GPU: 209 tests, 209 pass.
JIRA ID: ROCM-31390