The tool was crashing on Windows with ROCm 7.1 due to two issues: misuse
of hipDeviceGet which should not be used (it worked before by accident
but was undefined behavior), and ABI incompatibility from
hipDeviceProp_t struct layout changes between HIP versions where the
gcnArchName offset changed from 396 to 1160 bytes.
The fix removes hipDeviceGet and queries properties directly by device
index. It defines separate struct layouts for R0600 (HIP 6.x+) and R0000
(legacy) to handle the different memory layouts correctly.
An automatic API fallback mechanism tries R0600, then R0000, then the
unversioned API until one succeeds, ensuring compatibility across
different HIP runtime versions. A new --hip-api-version option allows
manually selecting the API version when needed.
Additional improvements include enhanced error handling with
hipGetErrorString, verbose logging throughout the detection process, and
runtime version detection using hipRuntimeGetVersion when available. The
versioned API functions provide stable ABI across HIP versions.
Fixes: SWDEV-564272
To find the greatest versioned `amdhip64_n.dll`, We iterate through
`SearchPaths` and the files within each path.
The `if (!DLLNames.empty())` check will return true if the first
`SearchPath` contains a dll - this will result in the break statement
executing and all other SearchPaths being skipped, potentially missing
out on a greater versioned dll.
Removing the check and break allows for all `SearchPaths` to get checked
and `DLLNames` to cover the complete set of dlls presents.
Also, the current `compareVersions` function was not removing the .dll
portion of the VerStr resulting in incorrect comparisons between VtA and
VtB. Updated the function to handle the case - test ouput is as follows
(ignore SearchPath and DLLName logging).
```
offload-arch.exe
SearchPath: C:\Users\rocm\harry\llvm-project\build\Debug\bin
SearchPath: C:\Windows\system32
SearchPath: C:\Windows
SearchPath: C:\Windows\system32
SearchPath: C:\Windows
SearchPath: C:\Windows\System32\Wbem
SearchPath: C:\Windows\System32\WindowsPowerShell\v1.0\
SearchPath: C:\Windows\System32\OpenSSH\
SearchPath: C:\Program Files\Git\cmd
SearchPath: C:\Program Files\CMake\bin
SearchPath: C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\
SearchPath: C:\Users\rocm\harry\.venv\Lib\site-packages\_rocm_sdk_core\bin
SearchPath: C:\Users\rocm\AppData\Local\Microsoft\WindowsApps
SearchPath:
DLLName: C:/Windows/system32/amdhip64_6.dll
DLLName: C:/Windows/system32/amdhip64_7.dll
DLLName: C:/Windows/system32/amdhip64_6.dll
DLLName: C:/Windows/system32/amdhip64_7.dll
DLLName: C:/Users/rocm/harry/.venv/Lib/site-packages/_rocm_sdk_core/bin/amdhip64_7.dll
HIP Library Path: C:\Windows\system32\amdhip64_7.dll
gfx1151
Summary:
This tool tries to print the offloading architectures. If the user
doesn't have the HIP libraries or the CUDA libraries it will print and
error.
This isn't super helpful since we're just querying things. So, for
example, if we're on an AMD machine with no CUDA you'll get the AMD GPUs
and then an error message saying that CUDA wasn't found. This silences
the error just on failing to find the library unless verbose is on.
Summary:
These two tools do the same thing, we should unify them into a single
tool. We create symlinks for backward compatiblity and provide a way to
get the old vendor specific behavior with `--amdgpu-only` and
`--nvptx-only`.