diff options
| author | Robert Imschweiler <robert.imschweiler@amd.com> | 2025-11-04 20:15:47 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-04 20:15:47 +0100 |
| commit | dc94f2cbadfd192fe3d43bd00fd5a1d0ead5ab8d (patch) | |
| tree | 6d9d687a21b2d1e14b0c16779e4ba6001ea9064f /offload/plugins-nextgen/cuda | |
| parent | 92a1eb37122fa24e3045fbabdea2bf87127cace5 (diff) | |
[Offload] Add device UID (#164391)
Introduced in OpenMP 6.0, the device UID shall be a unique identifier of
a device on a given system. (Not necessarily a UUID.) Since it is not
guaranteed that the (U)UIDs defined by the device vendor libraries, such
as HSA, do not overlap with those of other vendors, the device UIDs in
offload are always combined with the offload plugin name. In case the
vendor library does not specify any device UID for a given device, we
fall back to the offload-internal device ID.
The device UID can be retrieved using the `llvm-offload-device-info`
tool.
Diffstat (limited to 'offload/plugins-nextgen/cuda')
| -rw-r--r-- | offload/plugins-nextgen/cuda/dynamic_cuda/cuda.cpp | 1 | ||||
| -rw-r--r-- | offload/plugins-nextgen/cuda/dynamic_cuda/cuda.h | 4 | ||||
| -rw-r--r-- | offload/plugins-nextgen/cuda/src/rtl.cpp | 7 |
3 files changed, 12 insertions, 0 deletions
diff --git a/offload/plugins-nextgen/cuda/dynamic_cuda/cuda.cpp b/offload/plugins-nextgen/cuda/dynamic_cuda/cuda.cpp index f5b2d074a47e..e7a1ca38b3c1 100644 --- a/offload/plugins-nextgen/cuda/dynamic_cuda/cuda.cpp +++ b/offload/plugins-nextgen/cuda/dynamic_cuda/cuda.cpp @@ -35,6 +35,7 @@ DLWRAP(cuFuncSetAttribute, 3) // Device info DLWRAP(cuDeviceGetName, 3) +DLWRAP(cuDeviceGetUuid, 2) DLWRAP(cuDeviceTotalMem, 2) DLWRAP(cuDriverGetVersion, 1) diff --git a/offload/plugins-nextgen/cuda/dynamic_cuda/cuda.h b/offload/plugins-nextgen/cuda/dynamic_cuda/cuda.h index dec4e33508c6..a470d6df1079 100644 --- a/offload/plugins-nextgen/cuda/dynamic_cuda/cuda.h +++ b/offload/plugins-nextgen/cuda/dynamic_cuda/cuda.h @@ -33,6 +33,9 @@ typedef struct CUfunc_st *CUfunction; typedef void (*CUhostFn)(void *userData); typedef struct CUstream_st *CUstream; typedef struct CUevent_st *CUevent; +typedef struct CUuuid_st { + char bytes[16]; +} CUuuid; #define CU_DEVICE_INVALID ((CUdevice)(-2)) @@ -301,6 +304,7 @@ CUresult cuFuncSetAttribute(CUfunction, CUfunction_attribute, int); // Device info CUresult cuDeviceGetName(char *, int, CUdevice); +CUresult cuDeviceGetUuid(CUuuid *, CUdevice); CUresult cuDeviceTotalMem(size_t *, CUdevice); CUresult cuDriverGetVersion(int *); diff --git a/offload/plugins-nextgen/cuda/src/rtl.cpp b/offload/plugins-nextgen/cuda/src/rtl.cpp index db94f7f2dd99..a9adcc397fb7 100644 --- a/offload/plugins-nextgen/cuda/src/rtl.cpp +++ b/offload/plugins-nextgen/cuda/src/rtl.cpp @@ -25,6 +25,7 @@ #include "PluginInterface.h" #include "Utils/ELF.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/BinaryFormat/ELF.h" #include "llvm/Frontend/OpenMP/OMPConstants.h" #include "llvm/Frontend/OpenMP/OMPGridValues.h" @@ -293,6 +294,12 @@ struct CUDADeviceTy : public GenericDeviceTy { if (auto Err = Plugin::check(Res, "error in cuDeviceGet: %s")) return Err; + CUuuid UUID = {0}; + Res = cuDeviceGetUuid(&UUID, Device); + if (auto Err = Plugin::check(Res, "error in cuDeviceGetUuid: %s")) + return Err; + setDeviceUidFromVendorUid(toHex(UUID.bytes, true)); + // Query the current flags of the primary context and set its flags if // it is inactive. unsigned int FormerPrimaryCtxFlags = 0; |
