@@ -40,6 +40,8 @@ EXTERN void ompx_dump_mapping_tables() {
4040using namespace llvm ::omp::target::ompt;
4141#endif
4242
43+ using GenericDeviceTy = llvm::omp::target::plugin::GenericDeviceTy;
44+
4345void *targetAllocExplicit (size_t Size, int DeviceNum, int Kind,
4446 const char *Name);
4547void targetFreeExplicit (void *DevicePtr, int DeviceNum, int Kind,
@@ -68,6 +70,62 @@ EXTERN int omp_get_device_num(void) {
6870 return HostDevice;
6971}
7072
73+ static inline bool is_initial_device_uid (const char *DeviceUid) {
74+ return strcmp (DeviceUid, GenericPluginTy::getHostDeviceUid ()) == 0 ;
75+ }
76+
77+ EXTERN int omp_get_device_from_uid (const char *DeviceUid) {
78+ TIMESCOPE ();
79+ OMPT_IF_BUILT (ReturnAddressSetterRAII RA (__builtin_return_address (0 )));
80+
81+ if (!DeviceUid) {
82+ DP (" Call to omp_get_device_from_uid returning omp_invalid_device\n " );
83+ return omp_invalid_device;
84+ }
85+ if (is_initial_device_uid (DeviceUid)) {
86+ DP (" Call to omp_get_device_from_uid returning initial device number %d\n " ,
87+ omp_get_initial_device ());
88+ return omp_get_initial_device ();
89+ }
90+
91+ int DeviceNum = omp_invalid_device;
92+
93+ auto ExclusiveDevicesAccessor = PM->getExclusiveDevicesAccessor ();
94+ for (const DeviceTy &Device : PM->devices (ExclusiveDevicesAccessor)) {
95+ const char *Uid = Device.RTL ->getDevice (Device.RTLDeviceID ).getDeviceUid ();
96+ if (Uid && strcmp (DeviceUid, Uid) == 0 ) {
97+ DeviceNum = Device.DeviceID ;
98+ break ;
99+ }
100+ }
101+
102+ DP (" Call to omp_get_device_from_uid returning %d\n " , DeviceNum);
103+ return DeviceNum;
104+ }
105+
106+ EXTERN const char *omp_get_uid_from_device (int DeviceNum) {
107+ TIMESCOPE ();
108+ OMPT_IF_BUILT (ReturnAddressSetterRAII RA (__builtin_return_address (0 )));
109+
110+ if (DeviceNum == omp_invalid_device) {
111+ DP (" Call to omp_get_uid_from_device returning nullptr\n " );
112+ return nullptr ;
113+ }
114+ if (DeviceNum == omp_get_initial_device ()) {
115+ DP (" Call to omp_get_uid_from_device returning initial device UID\n " );
116+ return GenericPluginTy::getHostDeviceUid ();
117+ }
118+
119+ auto DeviceOrErr = PM->getDevice (DeviceNum);
120+ if (!DeviceOrErr)
121+ FATAL_MESSAGE (DeviceNum, " %s" , toString (DeviceOrErr.takeError ()).c_str ());
122+
123+ const char *Uid =
124+ DeviceOrErr->RTL ->getDevice (DeviceOrErr->RTLDeviceID ).getDeviceUid ();
125+ DP (" Call to omp_get_uid_from_device returning %s\n " , Uid);
126+ return Uid;
127+ }
128+
71129EXTERN int omp_get_initial_device (void ) {
72130 TIMESCOPE ();
73131 OMPT_IF_BUILT (ReturnAddressSetterRAII RA (__builtin_return_address (0 )));
0 commit comments