@@ -748,8 +748,7 @@ Error GenericDeviceTy::init(GenericPluginTy &Plugin) {
748748 if (ompt::Initialized) {
749749 bool ExpectedStatus = false ;
750750 if (OmptInitialized.compare_exchange_strong (ExpectedStatus, true ))
751- performOmptCallback (device_initialize, /* device_num=*/ DeviceId +
752- Plugin.getDeviceIdStartIndex (),
751+ performOmptCallback (device_initialize, Plugin.getUserId (DeviceId),
753752 /* type=*/ getComputeUnitKind ().c_str (),
754753 /* device=*/ reinterpret_cast <ompt_device_t *>(this ),
755754 /* lookup=*/ ompt::lookupCallbackByName,
@@ -847,9 +846,7 @@ Error GenericDeviceTy::deinit(GenericPluginTy &Plugin) {
847846 if (ompt::Initialized) {
848847 bool ExpectedStatus = true ;
849848 if (OmptInitialized.compare_exchange_strong (ExpectedStatus, false ))
850- performOmptCallback (device_finalize,
851- /* device_num=*/ DeviceId +
852- Plugin.getDeviceIdStartIndex ());
849+ performOmptCallback (device_finalize, Plugin.getUserId (DeviceId));
853850 }
854851#endif
855852
@@ -908,7 +905,7 @@ GenericDeviceTy::loadBinary(GenericPluginTy &Plugin,
908905 size_t Bytes =
909906 getPtrDiff (InputTgtImage->ImageEnd , InputTgtImage->ImageStart );
910907 performOmptCallback (
911- device_load, /* device_num= */ DeviceId + Plugin.getDeviceIdStartIndex ( ),
908+ device_load, Plugin.getUserId (DeviceId ),
912909 /* FileName=*/ nullptr , /* FileOffset=*/ 0 , /* VmaInFile=*/ nullptr ,
913910 /* ImgSize=*/ Bytes, /* HostAddr=*/ InputTgtImage->ImageStart ,
914911 /* DeviceAddr=*/ nullptr , /* FIXME: ModuleId */ 0 );
@@ -1492,11 +1489,14 @@ Error GenericDeviceTy::syncEvent(void *EventPtr) {
14921489bool GenericDeviceTy::useAutoZeroCopy () { return useAutoZeroCopyImpl (); }
14931490
14941491Error GenericPluginTy::init () {
1492+ if (Initialized)
1493+ return Plugin::success ();
1494+
14951495 auto NumDevicesOrErr = initImpl ();
14961496 if (!NumDevicesOrErr)
14971497 return NumDevicesOrErr.takeError ();
1498-
14991498 Initialized = true ;
1499+
15001500 NumDevices = *NumDevicesOrErr;
15011501 if (NumDevices == 0 )
15021502 return Plugin::success ();
@@ -1517,6 +1517,8 @@ Error GenericPluginTy::init() {
15171517}
15181518
15191519Error GenericPluginTy::deinit () {
1520+ assert (Initialized && " Plugin was not initialized!" );
1521+
15201522 // Deinitialize all active devices.
15211523 for (int32_t DeviceId = 0 ; DeviceId < NumDevices; ++DeviceId) {
15221524 if (Devices[DeviceId]) {
@@ -1537,7 +1539,11 @@ Error GenericPluginTy::deinit() {
15371539 delete RecordReplay;
15381540
15391541 // Perform last deinitializations on the plugin.
1540- return deinitImpl ();
1542+ if (Error Err = deinitImpl ())
1543+ return Err;
1544+ Initialized = false ;
1545+
1546+ return Plugin::success ();
15411547}
15421548
15431549Error GenericPluginTy::initDevice (int32_t DeviceId) {
@@ -1599,8 +1605,7 @@ Expected<bool> GenericPluginTy::checkBitcodeImage(StringRef Image) const {
15991605
16001606int32_t GenericPluginTy::is_initialized () const { return Initialized; }
16011607
1602- int32_t GenericPluginTy::is_valid_binary (__tgt_device_image *Image,
1603- bool Initialized) {
1608+ int32_t GenericPluginTy::is_plugin_compatible (__tgt_device_image *Image) {
16041609 StringRef Buffer (reinterpret_cast <const char *>(Image->ImageStart ),
16051610 target::getPtrDiff (Image->ImageEnd , Image->ImageStart ));
16061611
@@ -1618,11 +1623,43 @@ int32_t GenericPluginTy::is_valid_binary(__tgt_device_image *Image,
16181623 auto MatchOrErr = checkELFImage (Buffer);
16191624 if (Error Err = MatchOrErr.takeError ())
16201625 return HandleError (std::move (Err));
1621- if (!Initialized || !*MatchOrErr)
1622- return *MatchOrErr;
1626+ return *MatchOrErr;
1627+ }
1628+ case file_magic::bitcode: {
1629+ auto MatchOrErr = checkBitcodeImage (Buffer);
1630+ if (Error Err = MatchOrErr.takeError ())
1631+ return HandleError (std::move (Err));
1632+ return *MatchOrErr;
1633+ }
1634+ default :
1635+ return false ;
1636+ }
1637+ }
1638+
1639+ int32_t GenericPluginTy::is_device_compatible (int32_t DeviceId,
1640+ __tgt_device_image *Image) {
1641+ StringRef Buffer (reinterpret_cast <const char *>(Image->ImageStart ),
1642+ target::getPtrDiff (Image->ImageEnd , Image->ImageStart ));
1643+
1644+ auto HandleError = [&](Error Err) -> bool {
1645+ [[maybe_unused]] std::string ErrStr = toString (std::move (Err));
1646+ DP (" Failure to check validity of image %p: %s" , Image, ErrStr.c_str ());
1647+ return false ;
1648+ };
1649+ switch (identify_magic (Buffer)) {
1650+ case file_magic::elf:
1651+ case file_magic::elf_relocatable:
1652+ case file_magic::elf_executable:
1653+ case file_magic::elf_shared_object:
1654+ case file_magic::elf_core: {
1655+ auto MatchOrErr = checkELFImage (Buffer);
1656+ if (Error Err = MatchOrErr.takeError ())
1657+ return HandleError (std::move (Err));
1658+ if (!*MatchOrErr)
1659+ return false ;
16231660
16241661 // Perform plugin-dependent checks for the specific architecture if needed.
1625- auto CompatibleOrErr = isELFCompatible (Buffer);
1662+ auto CompatibleOrErr = isELFCompatible (DeviceId, Buffer);
16261663 if (Error Err = CompatibleOrErr.takeError ())
16271664 return HandleError (std::move (Err));
16281665 return *CompatibleOrErr;
@@ -1638,6 +1675,10 @@ int32_t GenericPluginTy::is_valid_binary(__tgt_device_image *Image,
16381675 }
16391676}
16401677
1678+ int32_t GenericPluginTy::is_device_initialized (int32_t DeviceId) const {
1679+ return isValidDeviceId (DeviceId) && Devices[DeviceId] != nullptr ;
1680+ }
1681+
16411682int32_t GenericPluginTy::init_device (int32_t DeviceId) {
16421683 auto Err = initDevice (DeviceId);
16431684 if (Err) {
@@ -1985,8 +2026,9 @@ int32_t GenericPluginTy::init_device_info(int32_t DeviceId,
19852026 return OFFLOAD_SUCCESS;
19862027}
19872028
1988- int32_t GenericPluginTy::set_device_offset (int32_t DeviceIdOffset) {
1989- setDeviceIdStartIndex (DeviceIdOffset);
2029+ int32_t GenericPluginTy::set_device_identifier (int32_t UserId,
2030+ int32_t DeviceId) {
2031+ UserDeviceIds[DeviceId] = UserId;
19902032
19912033 return OFFLOAD_SUCCESS;
19922034}
0 commit comments