Files
TheRock/rocm-libraries/projects/hipdnn/tests/test_plugins/TestKnobConstraintValidationPlugin.cpp
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

328 lines
13 KiB
C++

// Copyright © Advanced Micro Devices, Inc., or its affiliates.
// SPDX-License-Identifier: MIT
#include "TestPluginCommon.hpp"
#include "TestPluginEngineIdMap.hpp"
#include <hipdnn_flatbuffers_sdk/data_objects/knob_value_generated.h>
#include <hipdnn_flatbuffers_sdk/flatbuffer_utilities/EngineConfigWrapper.hpp>
#include <hipdnn_plugin_sdk/KnobFactory.hpp>
// NOLINTNEXTLINE
thread_local char
hipdnn_plugin_sdk::PluginLastErrorManager::s_lastError[HIPDNN_PLUGIN_ERROR_STRING_MAX_LENGTH]
= "";
class KnobConstraintValidationPlugin : public TestPluginBase
{
public:
const char* getPluginName() const override
{
return "test_KnobConstraintValidationPlugin";
}
const char* getPluginVersion() const override
{
return "1.0.0";
}
const char* getPluginApiVersion() const override
{
return apiVersionWithoutTweak();
}
int64_t getEngineId() const override
{
return hipdnn_tests::plugin_constants::engineId<KnobConstraintValidationPlugin>();
}
uint32_t getNumEngines() const override
{
return 1;
}
uint32_t getNumApplicableEngines() const override
{
return 1;
}
// Override enginePluginGetEngineDetails to return knobs
static hipdnnPluginStatus_t getEngineDetails(hipdnnEnginePluginHandle_t handle,
[[maybe_unused]] int64_t engineId,
const hipdnnPluginConstData_t* opGraph,
hipdnnPluginConstData_t* engineDetails)
{
LOG_API_ENTRY("handle=" << static_cast<void*>(handle)
<< ", opGraph=" << static_cast<const void*>(opGraph)
<< ", engineDetails=" << static_cast<void*>(engineDetails));
return hipdnn_plugin_sdk::tryCatch([&, apiName = __func__]() {
hipdnn_plugin_sdk::throwIfNull(handle);
hipdnn_plugin_sdk::throwIfNull(opGraph);
hipdnn_plugin_sdk::throwIfNull(engineDetails);
hipdnn_plugin_sdk::throwIfNull(getInstance());
if(!getInstance()->supportsEngineOperations())
{
throw hipdnn_plugin_sdk::HipdnnPluginException(
HIPDNN_PLUGIN_STATUS_INTERNAL_ERROR,
"No engines available - cannot get engine details");
}
flatbuffers::FlatBufferBuilder builder;
// Create knobs vector using KnobFactory
std::vector<flatbuffers::Offset<hipdnn_flatbuffers_sdk::data_objects::Knob>>
knobOffsets;
// Knob 1: Integer knob with min/max/step constraints
knobOffsets.push_back(hipdnn_plugin_sdk::KnobFactory::createIntKnob(
builder,
"constraint.int_knob",
"Integer knob for constraint validation testing",
50, // default value
0, // min
100, // max
5, // step
{})); // no explicit valid values
// Knob 2: Float knob with min/max constraints
knobOffsets.push_back(hipdnn_plugin_sdk::KnobFactory::createFloatKnob(
builder,
"constraint.float_knob",
"Float knob for constraint validation testing",
5.0f, // default value
0.0f, // min
10.0f)); // max
// Knob 3: String knob with valid_values constraint
knobOffsets.push_back(hipdnn_plugin_sdk::KnobFactory::createStringKnob(
builder,
"constraint.string_knob",
"String knob for constraint validation testing",
"beta", // default value
{"alpha", "beta", "gamma"})); // valid values
auto knobsVector = builder.CreateVector(knobOffsets);
auto newEngineDetails = hipdnn_flatbuffers_sdk::data_objects::CreateEngineDetails(
builder, getInstance()->getEngineId(), knobsVector);
builder.Finish(newEngineDetails);
auto serializedDetails = builder.Release();
TestPluginMallocBuffer tempBuffer(std::malloc(serializedDetails.size()));
hipdnn_plugin_sdk::throwIfNull(tempBuffer.get());
std::memcpy(tempBuffer.get(), serializedDetails.data(), serializedDetails.size());
engineDetails->ptr = tempBuffer.release();
engineDetails->size = serializedDetails.size();
LOG_API_SUCCESS(apiName, "engineDetails->ptr=" << engineDetails->ptr);
});
}
// Override createExecutionContext to validate knob types
static hipdnnPluginStatus_t
createExecutionContext(hipdnnEnginePluginHandle_t handle,
const hipdnnPluginConstData_t* engineConfig,
const hipdnnPluginConstData_t* opGraph,
hipdnnEnginePluginExecutionContext_t* executionContext)
{
LOG_API_ENTRY("handle=" << static_cast<void*>(handle)
<< ", engineConfig=" << static_cast<const void*>(engineConfig)
<< ", opGraph=" << static_cast<const void*>(opGraph)
<< ", executionContext=" << static_cast<void*>(executionContext));
return hipdnn_plugin_sdk::tryCatch([&]() {
hipdnn_plugin_sdk::throwIfNull(handle);
hipdnn_plugin_sdk::throwIfNull(engineConfig);
hipdnn_plugin_sdk::throwIfNull(opGraph);
hipdnn_plugin_sdk::throwIfNull(executionContext);
// Deserialize engineConfig to access knob settings
const hipdnn_flatbuffers_sdk::flatbuffer_utilities::EngineConfigWrapper configWrapper(
engineConfig->ptr, engineConfig->size);
// Validate knob types
for(const auto& knobSetting : configWrapper.knobSettingWrappers())
{
auto knobId = knobSetting->knobId();
auto valueType = knobSetting->valueType();
// Match against known knobs and validate type
if(knobId == "constraint.int_knob")
{
if(valueType != hipdnn_flatbuffers_sdk::data_objects::KnobValue::IntValue)
{
throw hipdnn_plugin_sdk::HipdnnPluginException(
HIPDNN_PLUGIN_STATUS_BAD_PARAM,
"Type mismatch for constraint.int_knob: expected IntValue");
}
}
else if(knobId == "constraint.float_knob")
{
if(valueType != hipdnn_flatbuffers_sdk::data_objects::KnobValue::FloatValue)
{
throw hipdnn_plugin_sdk::HipdnnPluginException(
HIPDNN_PLUGIN_STATUS_BAD_PARAM,
"Type mismatch for constraint.float_knob: expected FloatValue");
}
}
else if(knobId == "constraint.string_knob")
{
if(valueType != hipdnn_flatbuffers_sdk::data_objects::KnobValue::StringValue)
{
throw hipdnn_plugin_sdk::HipdnnPluginException(
HIPDNN_PLUGIN_STATUS_BAD_PARAM,
"Type mismatch for constraint.string_knob: expected StringValue");
}
}
// Unknown knobs are silently ignored, real plugins might log a warning but were not
// testing that
}
// Create execution context as normal using base class implementation
return TestPluginBase::enginePluginCreateExecutionContext(
handle, engineConfig, opGraph, executionContext);
});
}
};
// Initialize plugin instance on load
__attribute__((constructor)) static void initializePlugin()
{
TestPluginBase::setInstance(std::make_unique<KnobConstraintValidationPlugin>());
}
// Custom API registration that overrides enginePluginGetEngineDetails and createExecutionContext
extern "C" {
HIPDNN_TEST_PLUGIN_EXPORT hipdnnPluginStatus_t hipdnnPluginGetName(const char** name)
{
return TestPluginBase::pluginGetName(name);
}
HIPDNN_TEST_PLUGIN_EXPORT hipdnnPluginStatus_t hipdnnPluginGetVersion(const char** version)
{
return TestPluginBase::pluginGetVersion(version);
}
HIPDNN_TEST_PLUGIN_EXPORT hipdnnPluginStatus_t hipdnnPluginGetApiVersion(const char** version)
{
return TestPluginBase::pluginGetApiVersion(version);
}
HIPDNN_TEST_PLUGIN_EXPORT hipdnnPluginStatus_t hipdnnPluginGetType(hipdnnPluginType_t* type)
{
return TestPluginBase::pluginGetType(type);
}
HIPDNN_TEST_PLUGIN_EXPORT void hipdnnPluginGetLastErrorString(const char** errorStr)
{
TestPluginBase::pluginGetLastErrorString(errorStr);
}
HIPDNN_TEST_PLUGIN_EXPORT hipdnnPluginStatus_t
hipdnnPluginSetLoggingCallback(hipdnnCallback_t callback)
{
return TestPluginBase::pluginSetLoggingCallback(callback);
}
HIPDNN_TEST_PLUGIN_EXPORT hipdnnPluginStatus_t
hipdnnEnginePluginGetAllEngineIds(int64_t* engineIds, uint32_t maxEngines, uint32_t* numEngines)
{
return TestPluginBase::enginePluginGetAllEngineIds(engineIds, maxEngines, numEngines);
}
HIPDNN_TEST_PLUGIN_EXPORT hipdnnPluginStatus_t
hipdnnEnginePluginCreate(hipdnnEnginePluginHandle_t* handle)
{
return TestPluginBase::enginePluginCreate(handle);
}
HIPDNN_TEST_PLUGIN_EXPORT hipdnnPluginStatus_t
hipdnnEnginePluginDestroy(hipdnnEnginePluginHandle_t handle)
{
return TestPluginBase::enginePluginDestroy(handle);
}
HIPDNN_TEST_PLUGIN_EXPORT hipdnnPluginStatus_t
hipdnnEnginePluginSetStream(hipdnnEnginePluginHandle_t handle, hipStream_t stream)
{
return TestPluginBase::enginePluginSetStream(handle, stream);
}
HIPDNN_TEST_PLUGIN_EXPORT hipdnnPluginStatus_t
hipdnnEnginePluginGetApplicableEngineIds(hipdnnEnginePluginHandle_t handle,
const hipdnnPluginConstData_t* opGraph,
int64_t* engineIds,
uint32_t maxEngines,
uint32_t* numEngines)
{
return TestPluginBase::enginePluginGetApplicableEngineIds(
handle, opGraph, engineIds, maxEngines, numEngines);
}
// Override to use KnobConstraintValidationPlugin::getEngineDetails
HIPDNN_TEST_PLUGIN_EXPORT hipdnnPluginStatus_t
hipdnnEnginePluginGetEngineDetails(hipdnnEnginePluginHandle_t handle,
int64_t engineId,
const hipdnnPluginConstData_t* opGraph,
hipdnnPluginConstData_t* engineDetails)
{
return KnobConstraintValidationPlugin::getEngineDetails(
handle, engineId, opGraph, engineDetails);
}
HIPDNN_TEST_PLUGIN_EXPORT hipdnnPluginStatus_t hipdnnEnginePluginDestroyEngineDetails(
hipdnnEnginePluginHandle_t handle, hipdnnPluginConstData_t* engineDetails)
{
return TestPluginBase::enginePluginDestroyEngineDetails(handle, engineDetails);
}
HIPDNN_TEST_PLUGIN_EXPORT hipdnnPluginStatus_t
hipdnnEnginePluginGetWorkspaceSize(hipdnnEnginePluginHandle_t handle,
const hipdnnPluginConstData_t* engineConfig,
const hipdnnPluginConstData_t* opGraph,
size_t* workspaceSize)
{
return TestPluginBase::enginePluginGetWorkspaceSize(
handle, engineConfig, opGraph, workspaceSize);
}
HIPDNN_TEST_PLUGIN_EXPORT hipdnnPluginStatus_t
hipdnnEnginePluginGetWorkspaceSizeFromExecutionContext(
hipdnnEnginePluginHandle_t handle,
hipdnnEnginePluginExecutionContext_t executionContext,
size_t* workspaceSize)
{
return TestPluginBase::enginePluginGetWorkspaceSize(handle, executionContext, workspaceSize);
}
// Override to use KnobConstraintValidationPlugin::createExecutionContext
HIPDNN_TEST_PLUGIN_EXPORT hipdnnPluginStatus_t
hipdnnEnginePluginCreateExecutionContext(hipdnnEnginePluginHandle_t handle,
const hipdnnPluginConstData_t* engineConfig,
const hipdnnPluginConstData_t* opGraph,
hipdnnEnginePluginExecutionContext_t* executionContext)
{
return KnobConstraintValidationPlugin::createExecutionContext(
handle, engineConfig, opGraph, executionContext);
}
HIPDNN_TEST_PLUGIN_EXPORT hipdnnPluginStatus_t hipdnnEnginePluginDestroyExecutionContext(
hipdnnEnginePluginHandle_t handle, hipdnnEnginePluginExecutionContext_t executionContext)
{
return TestPluginBase::enginePluginDestroyExecutionContext(handle, executionContext);
}
HIPDNN_TEST_PLUGIN_EXPORT hipdnnPluginStatus_t
hipdnnEnginePluginExecuteOpGraph(hipdnnEnginePluginHandle_t handle,
hipdnnEnginePluginExecutionContext_t executionContext,
void* workspace,
const hipdnnPluginDeviceBuffer_t* deviceBuffers,
uint32_t numDeviceBuffers)
{
return TestPluginBase::enginePluginExecuteOpGraph(
handle, executionContext, workspace, deviceBuffers, numDeviceBuffers);
}
} // extern "C"