// Copyright © Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #include #include #include "MiopenReluPlanBuilder.hpp" #include "engines/plans/MiopenReluApplicabilityChecks.hpp" #include "engines/plans/MiopenReluPlan.hpp" namespace miopen_plugin { bool MiopenReluPlanBuilder::isApplicable( [[maybe_unused]] const HipdnnMiopenHandle& handle, const hipdnn_flatbuffers_sdk::flatbuffer_utilities::IGraph& opGraph) const { // Execute-time override shapes can diverge from the compile-time dims this // builder matched exactly; the plan bakes those dims into the MIOpen // descriptors it builds, so decline rather than risk a mismatch (RFC 0008 §4.6). if(opGraph.getGraph().is_override_shape_enabled()) { HIPDNN_PLUGIN_LOG_INFO("ReLU plan builder does not support override shapes"); return false; } return relu_applicability::isReluSupported(opGraph); } size_t MiopenReluPlanBuilder::getMaxWorkspaceSize( [[maybe_unused]] const HipdnnMiopenHandle& handle, [[maybe_unused]] const hipdnn_flatbuffers_sdk::flatbuffer_utilities::IGraph& opGraph, [[maybe_unused]] const HipdnnMiopenSettings& executionSettings) const { // ReLU operations do not require workspace memory. return 0u; } void MiopenReluPlanBuilder::initializeExecutionSettings( [[maybe_unused]] const HipdnnMiopenHandle& handle, [[maybe_unused]] const hipdnn_flatbuffers_sdk::flatbuffer_utilities::IGraph& opGraph, [[maybe_unused]] const hipdnn_flatbuffers_sdk::flatbuffer_utilities::IEngineConfig& engineConfig, [[maybe_unused]] HipdnnMiopenSettings& executionSettings) const { // No execution settings are needed for ReLU operations. } void MiopenReluPlanBuilder::buildPlan( [[maybe_unused]] const HipdnnMiopenHandle& handle, const hipdnn_flatbuffers_sdk::flatbuffer_utilities::IGraph& opGraph, [[maybe_unused]] const hipdnn_flatbuffers_sdk::flatbuffer_utilities::IEngineConfig& engineConfig, HipdnnMiopenContext& executionContext) const { // Preconditions are validated in isApplicable; no need to re-check here. const auto& nodeWrapper = opGraph.getNodeWrapper(0); const auto nodeName = nodeWrapper.name(); HIPDNN_PLUGIN_LOG_INFO("Building ReLU plan for node: " << nodeName); const auto& attrs = nodeWrapper.attributesAs(); auto plan = std::make_unique(attrs, opGraph.getTensorMap()); executionContext.setPlan(std::move(plan)); } std::vector MiopenReluPlanBuilder::getCustomKnobs( [[maybe_unused]] const HipdnnMiopenHandle& handle, [[maybe_unused]] const hipdnn_flatbuffers_sdk::flatbuffer_utilities::IGraph& opGraph) const { // ReLU operations do not expose any custom knobs. return {}; } } // namespace miopen_plugin