// Copyright © Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #pragma once #include #include #include #include #include #include #include #include #include #include namespace miopen_plugin { // --- Tensor Descriptor Value Object --- struct BatchnormTensorDescriptor { std::vector dims; std::vector strides; std::vector strideOrder; explicit BatchnormTensorDescriptor( const hipdnn_flatbuffers_sdk::data_objects::TensorAttributes* attr); size_t numDims() const { return dims.size(); } bool isPacked() const; }; // --- Validation Utilities --- namespace validators { void validateDimensionCount(size_t numDims); void validateConsistentDimensions(const std::vector& tensors); void validatePackedTensors(const std::vector& tensors); void validateSupportedLayout(const std::vector& strideOrder, size_t numDims); void validateConsistentLayouts(const std::vector& tensors); void validateDataTypeIsSupported( hipdnn_flatbuffers_sdk::data_objects::DataType dataType, const std::unordered_set& allowedTypes, const std::string& errorMessage); void validateConsistentDataTypes( const std::vector& tensorIds, const std::unordered_map& tensorMap, const std::unordered_set& allowedTypes, const std::string& typeErrorMessage, const std::string& consistencyErrorMessage); void validateFixedDataType( const std::vector& tensorIds, const std::unordered_map& tensorMap, hipdnn_flatbuffers_sdk::data_objects::DataType expectedType, const std::string& errorMessage); void validateConsistentShapes( const std::vector& tensorIds, const std::unordered_map& tensorMap, const std::vector& referenceShape, const std::string& errorMessage); void validateSpatialDimensions(const std::vector& ioDims); } // namespace validators // --- Component Validators --- void checkTensorLayoutsAndDimsSupported( const std::unordered_map& tensorMap); void checkTensorDataTypesSupported( const std::vector& ioTensorIds, const std::vector& affineTensorIds, const std::vector& statTensorIds, const std::vector& intermediateTensorIds, const std::unordered_map& tensorMap); void checkTensorShapesSupported( const std::vector& ioTensorIds, const std::vector& affineTensorIds, const std::vector& statTensorIds, const std::unordered_map& tensorMap, bool isTraining); // --- High-Level Configuration Validators --- void checkBatchnormInferenceTensorConfigSupported( const hipdnn_flatbuffers_sdk::data_objects::BatchnormInferenceAttributes& bnInfAttr, const std::unordered_map& tensorMap); void checkBatchnormInferenceVarianceExtTensorConfigSupported( const hipdnn_flatbuffers_sdk::data_objects::BatchnormInferenceAttributesVarianceExt& bnInfAttr, const std::unordered_map& tensorMap); void checkBatchnormInferenceVarianceExtActivationTensorConfigSupported( const hipdnn_flatbuffers_sdk::data_objects::BatchnormInferenceAttributesVarianceExt& bnInfAttr, const hipdnn_flatbuffers_sdk::data_objects::PointwiseAttributes& actAttr, const std::unordered_map& tensorMap); void checkBatchnormInferenceActivationTensorConfigSupported( const hipdnn_flatbuffers_sdk::data_objects::BatchnormInferenceAttributes& bnInfAttr, const hipdnn_flatbuffers_sdk::data_objects::PointwiseAttributes& actAttr, const std::unordered_map& tensorMap); void checkBatchnormFwdTrainingTensorConfigSupported( const hipdnn_flatbuffers_sdk::data_objects::BatchnormAttributes& bnAttr, const std::unordered_map& tensorMap); void checkBatchnormFwdTrainingActivationTensorConfigSupported( const hipdnn_flatbuffers_sdk::data_objects::BatchnormAttributes& bnAttr, const hipdnn_flatbuffers_sdk::data_objects::PointwiseAttributes& actAttr, const std::unordered_map& tensorMap); void checkBatchnormBackwardTensorConfigSupported( const hipdnn_flatbuffers_sdk::data_objects::BatchnormBackwardAttributes& bnBwdAttr, const std::unordered_map& tensorMap); void checkBatchnormInferenceActivationBackwardTensorConfigSupported( const hipdnn_flatbuffers_sdk::data_objects::BatchnormInferenceAttributes& bnInfAttr, const hipdnn_flatbuffers_sdk::data_objects::PointwiseAttributes& actAttr, const hipdnn_flatbuffers_sdk::data_objects::BatchnormBackwardAttributes& bnBwdAttr, const std::unordered_map& tensorMap); void checkBatchnormFwdActivationModeSupported( const hipdnn_flatbuffers_sdk::data_objects::PointwiseAttributes& activAttr); void checkBatchnormBwdActivationModeSupported( const hipdnn_flatbuffers_sdk::data_objects::PointwiseAttributes& activAttr); // --- Batchnorm Type Configuration --- // MIOpen v6.x requirements: // - IO tensors: same type (FLOAT, HALF, or BFLOAT16) // - Affine/Stat/Intermediate tensors: FLOAT only struct BnTensorTypes { hipdnn_flatbuffers_sdk::data_objects::DataType io; hipdnn_flatbuffers_sdk::data_objects::DataType affine; hipdnn_flatbuffers_sdk::data_objects::DataType stat; hipdnn_flatbuffers_sdk::data_objects::DataType intermediate; }; namespace bn_type_configs { using DT = hipdnn_flatbuffers_sdk::data_objects::DataType; inline constexpr BnTensorTypes ALL_FLOAT = {DT::FLOAT, DT::FLOAT, DT::FLOAT, DT::FLOAT}; inline constexpr BnTensorTypes HALF_IO = {DT::HALF, DT::FLOAT, DT::FLOAT, DT::FLOAT}; inline constexpr BnTensorTypes BFLOAT16_IO = {DT::BFLOAT16, DT::FLOAT, DT::FLOAT, DT::FLOAT}; inline constexpr std::array VALID = {ALL_FLOAT, HALF_IO, BFLOAT16_IO}; std::unordered_set getAllowedIoTypes(); std::unordered_set getAllowedAffineTypes(); std::unordered_set getAllowedStatTypes(); std::unordered_set getAllowedIntermediateTypes(); } // namespace bn_type_configs } // namespace miopen_plugin