Skip to content

Commit 0984d76

Browse files
committed
resolve feedbacks
1 parent 3875cc9 commit 0984d76

File tree

8 files changed

+48
-22
lines changed

8 files changed

+48
-22
lines changed

include/onnxruntime/core/session/environment.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ class Environment {
146146
return execution_devices_;
147147
}
148148

149-
/// Get hardware device incompatibility reasons for a specific EP.
149+
/// Get hardware device incompatibility details for a specific EP.
150150
/// @param ep_name The name of the execution provider to check.
151151
/// @param hw The hardware device to check for incompatibility.
152152
/// @param details Output: Incompatibility details including reasons for incompatibility if any.

include/onnxruntime/core/session/onnxruntime_c_api.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,7 @@ typedef enum OrtDeviceEpIncompatibilityReason {
518518
OrtDeviceEpIncompatibility_DRIVER_INCOMPATIBLE = 1 << 0,
519519
OrtDeviceEpIncompatibility_DEVICE_INCOMPATIBLE = 1 << 1,
520520
OrtDeviceEpIncompatibility_MISSING_DEPENDENCY = 1 << 2,
521-
OrtDeviceEpIncompatibility_UNKNOWN = 1 << 30
521+
OrtDeviceEpIncompatibility_UNKNOWN = 1 << 31
522522
} OrtDeviceEpIncompatibilityReason;
523523

524524
/** \brief Delegate to allow providing custom OrtEpDevice selection logic

include/onnxruntime/core/session/onnxruntime_ep_c_api.h

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1308,13 +1308,14 @@ struct OrtEpApi {
13081308
*/
13091309
ORT_API2_STATUS(KernelInfo_GetEp, _In_ const OrtKernelInfo* info, _Outptr_ const OrtEp** ep);
13101310

1311-
/** \brief Initialize an OrtDeviceEpIncompatibilityDetails instance.
1311+
/** \brief Set the details of an OrtDeviceEpIncompatibilityDetails instance.
13121312
*
1313-
* Used by execution provider factories to initialize incompatibility details in their
1314-
* GetHardwareDeviceIncompatibilityDetails implementation. ORT creates the object and passes it
1315-
* to the EP, which uses this function to set the incompatibility information.
1313+
* Used by execution provider factories to set incompatibility details in their
1314+
* GetHardwareDeviceIncompatibilityDetails implementation. ORT creates and initializes the object
1315+
* before passing it to the EP, so calling this function is optional. The EP uses this function
1316+
* to set incompatibility information when the device is not compatible.
13161317
*
1317-
* \param[in,out] details The OrtDeviceEpIncompatibilityDetails instance to initialize.
1318+
* \param[in,out] details The OrtDeviceEpIncompatibilityDetails instance to update.
13181319
* \param[in] reasons_bitmask Bitmask of OrtDeviceEpIncompatibilityReason values. (0 = no incompatibility).
13191320
* \param[in] error_code Optional EP-specific error code (0 = no error).
13201321
* \param[in] notes Optional human-readable notes. Can be null.
@@ -1323,7 +1324,7 @@ struct OrtEpApi {
13231324
*
13241325
* \since Version 1.24.
13251326
*/
1326-
ORT_API2_STATUS(DeviceEpIncompatibilityDetails_Initialize, _Inout_ OrtDeviceEpIncompatibilityDetails* details,
1327+
ORT_API2_STATUS(DeviceEpIncompatibilityDetails_SetDetails, _Inout_ OrtDeviceEpIncompatibilityDetails* details,
13271328
_In_ uint32_t reasons_bitmask,
13281329
_In_ int32_t error_code,
13291330
_In_opt_z_ const char* notes);
@@ -2014,14 +2015,14 @@ struct OrtEpFactory {
20142015
*
20152016
* This function allows an execution provider to check if a specific hardware device is compatible
20162017
* with the execution provider. The EP can set specific incompatibility reasons via the
2017-
* OrtDeviceEpIncompatibilityDetails parameter using OrtEpApi::DeviceEpIncompatibilityDetails_Initialize.
2018+
* OrtDeviceEpIncompatibilityDetails parameter using OrtEpApi::DeviceEpIncompatibilityDetails_SetDetails.
20182019
*
20192020
* \param[in] this_ptr The OrtEpFactory instance.
20202021
* \param[in] hw The hardware device to check for incompatibility.
2021-
* \param[in,out] details Pre-allocated incompatibility details object created by ORT.
2022-
* The EP should initialize this using OrtEpApi::DeviceEpIncompatibilityDetails_Initialize
2023-
* to set any incompatibility information. If the device is compatible, the EP can
2024-
* leave the object uninitialized (it defaults to no incompatibility).
2022+
* \param[in,out] details Pre-allocated incompatibility details object created and initialized by ORT.
2023+
* The EP can use OrtEpApi::DeviceEpIncompatibilityDetails_SetDetails to set
2024+
* incompatibility information. If the device is compatible, the EP can
2025+
* leave the object unchanged (it defaults to no incompatibility).
20252026
*
20262027
* \note Implementation of this function is optional.
20272028
* If not implemented, ORT will assume the device is compatible with this EP.

onnxruntime/core/session/environment.cc

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -668,10 +668,6 @@ Status Environment::GetHardwareDeviceEpIncompatibilityDetails(
668668

669669
// ORT creates the details object with default values (compatible)
670670
details = std::make_unique<OrtDeviceEpIncompatibilityDetails>();
671-
details->reasons_bitmask = 0;
672-
details->error_code = 0;
673-
details->notes = "";
674-
675671
// If the factory implements GetHardwareDeviceIncompatibilityDetails, let it initialize the details
676672
if (matched_factory->GetHardwareDeviceIncompatibilityDetails != nullptr) {
677673
OrtStatusPtr status = matched_factory->GetHardwareDeviceIncompatibilityDetails(matched_factory, hw, details.get());

onnxruntime/core/session/onnxruntime_c_api.cc

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4410,9 +4410,14 @@ ORT_API_STATUS_IMPL(OrtApis::GetHardwareDevices, _In_ const OrtEnv* env,
44104410

44114411
const auto& device_vector = env->GetEnvironment().GetSortedOrtHardwareDevices();
44124412
size_t available_devices = device_vector.size();
4413-
size_t copy_count = std::min(num_devices, available_devices);
44144413

4415-
for (size_t i = 0; i < copy_count; ++i) {
4414+
if (num_devices < available_devices) {
4415+
return OrtApis::CreateStatus(ORT_INVALID_ARGUMENT,
4416+
"num_devices is less than the number of available hardware devices. "
4417+
"Use GetNumHardwareDevices() to get the required array size.");
4418+
}
4419+
4420+
for (size_t i = 0; i < available_devices; ++i) {
44164421
devices[i] = device_vector[i];
44174422
}
44184423

onnxruntime/core/session/plugin_ep/ep_api.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -656,7 +656,7 @@ ORT_API_STATUS_IMPL(KernelInfo_GetEp, _In_ const OrtKernelInfo* info, _Outptr_ c
656656
API_IMPL_END
657657
}
658658

659-
ORT_API_STATUS_IMPL(DeviceEpIncompatibilityDetails_Initialize, _Inout_ OrtDeviceEpIncompatibilityDetails* details,
659+
ORT_API_STATUS_IMPL(DeviceEpIncompatibilityDetails_SetDetails, _Inout_ OrtDeviceEpIncompatibilityDetails* details,
660660
_In_ uint32_t reasons_bitmask,
661661
_In_ int32_t error_code,
662662
_In_opt_z_ const char* notes) {
@@ -840,7 +840,7 @@ static constexpr OrtEpApi ort_ep_api = {
840840
&OrtExecutionProviderApi::EpGraphSupportInfo_LookUpKernel,
841841
&OrtExecutionProviderApi::SharedPrePackedWeightCache_StoreWeightData,
842842
&OrtExecutionProviderApi::KernelInfo_GetEp,
843-
&OrtExecutionProviderApi::DeviceEpIncompatibilityDetails_Initialize,
843+
&OrtExecutionProviderApi::DeviceEpIncompatibilityDetails_SetDetails,
844844
&OrtExecutionProviderApi::CreateIfKernel,
845845
&OrtExecutionProviderApi::CreateLoopKernel,
846846
&OrtExecutionProviderApi::CreateScanKernel,

onnxruntime/test/autoep/library/example_plugin_ep/ep_factory.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ OrtStatus* ORT_API_CALL ExampleEpFactory::GetHardwareDeviceIncompatibilityDetail
325325
if (device_type != OrtHardwareDeviceType_CPU) {
326326
// Report that the device type is not supported
327327
uint32_t reasons = OrtDeviceEpIncompatibility_DEVICE_INCOMPATIBLE;
328-
return factory.ep_api.DeviceEpIncompatibilityDetails_Initialize(
328+
return factory.ep_api.DeviceEpIncompatibilityDetails_SetDetails(
329329
details,
330330
reasons,
331331
static_cast<int32_t>(device_type), // Use device type as the error code for testing

onnxruntime/test/framework/hardware_device_compatibility_test.cc

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,30 @@ TEST(GetHardwareDevicesCapiTest, GetHardwareDevices_InvalidArguments_NullDevices
313313
api->ReleaseEnv(env);
314314
}
315315

316+
TEST(GetHardwareDevicesCapiTest, GetHardwareDevices_InvalidArguments_ArrayTooSmall) {
317+
const OrtApi* api = OrtGetApiBase()->GetApi(ORT_API_VERSION);
318+
ASSERT_NE(api, nullptr);
319+
320+
OrtEnv* env = nullptr;
321+
EXPECT_EQ(nullptr, api->CreateEnv(ORT_LOGGING_LEVEL_WARNING, "HwDevicesTest", &env));
322+
EXPECT_NE(env, nullptr);
323+
324+
// Get number of devices first
325+
size_t num_devices = 0;
326+
ASSERT_ORTSTATUS_OK(api->GetNumHardwareDevices(env, &num_devices));
327+
ASSERT_GT(num_devices, 0u);
328+
329+
// Try to get devices with an undersized array (pass a valid pointer but claim size is 0)
330+
std::vector<const OrtHardwareDevice*> devices(1); // Allocate at least 1 element to avoid nullptr
331+
OrtStatus* st = api->GetHardwareDevices(env, devices.data(), 0); // But claim size is 0
332+
ASSERT_NE(st, nullptr);
333+
EXPECT_EQ(api->GetErrorCode(st), ORT_INVALID_ARGUMENT);
334+
EXPECT_THAT(api->GetErrorMessage(st), testing::HasSubstr("num_devices is less than"));
335+
api->ReleaseStatus(st);
336+
337+
api->ReleaseEnv(env);
338+
}
339+
316340
TEST(GetHardwareDevicesCapiTest, ReturnsDevices) {
317341
const OrtApi* api = OrtGetApiBase()->GetApi(ORT_API_VERSION);
318342
ASSERT_NE(api, nullptr);

0 commit comments

Comments
 (0)