// Copyright © Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #pragma once #include #include #include #include #include #include #include #include namespace hipdnn_frontend::detail { inline Error populateBaseVariantPackDescriptor(ScopedHipdnnBackendDescriptor& variantPackDesc, const std::unordered_map& variantPack, void* workspace) { std::vector variantPackKeys; std::vector variantPackValues; variantPackKeys.reserve(variantPack.size()); variantPackValues.reserve(variantPack.size()); for(const auto& [key, value] : variantPack) { variantPackKeys.push_back(key); variantPackValues.push_back(value); } HIPDNN_RETURN_ON_BACKEND_FAILURE( hipdnnBackend()->backendSetAttribute(variantPackDesc.get(), HIPDNN_ATTR_VARIANT_PACK_DATA_POINTERS, HIPDNN_TYPE_VOID_PTR, static_cast(variantPackValues.size()), static_cast(variantPackValues.data())), "failed to set the variant pack data pointers."); HIPDNN_RETURN_ON_BACKEND_FAILURE( hipdnnBackend()->backendSetAttribute(variantPackDesc.get(), HIPDNN_ATTR_VARIANT_PACK_UNIQUE_IDS, HIPDNN_TYPE_INT64, static_cast(variantPackKeys.size()), variantPackKeys.data()), "failed to set the variant pack unique ids."); HIPDNN_RETURN_ON_BACKEND_FAILURE( hipdnnBackend()->backendSetAttribute(variantPackDesc.get(), HIPDNN_ATTR_VARIANT_PACK_WORKSPACE, HIPDNN_TYPE_VOID_PTR, 1, static_cast(&workspace)), "failed to set the variant pack workspace."); return {}; } inline Error populateOverrideVariantPackDescriptor(ScopedHipdnnBackendDescriptor& variantPackDesc, const std::vector& overrideUids, const std::vector>& overrideShapes, const std::vector>& overrideStrides) { std::vector overrideLengths; overrideLengths.reserve(overrideUids.size()); size_t totalElements = 0; for(const auto& shape : overrideShapes) { totalElements += shape.size(); overrideLengths.push_back(static_cast(shape.size())); } std::vector flatShapes; std::vector flatStrides; flatShapes.reserve(totalElements); flatStrides.reserve(totalElements); for(size_t i = 0; i < overrideUids.size(); ++i) { flatShapes.insert(flatShapes.end(), overrideShapes[i].begin(), overrideShapes[i].end()); flatStrides.insert(flatStrides.end(), overrideStrides[i].begin(), overrideStrides[i].end()); } HIPDNN_RETURN_ON_BACKEND_FAILURE( hipdnnBackend()->backendSetAttribute(variantPackDesc.get(), HIPDNN_ATTR_VARIANT_PACK_OVERRIDE_UNIQUE_IDS_EXT, HIPDNN_TYPE_INT64, static_cast(overrideUids.size()), static_cast(overrideUids.data())), "failed to set HIPDNN_ATTR_VARIANT_PACK_OVERRIDE_UNIQUE_IDS_EXT."); HIPDNN_RETURN_ON_BACKEND_FAILURE( hipdnnBackend()->backendSetAttribute(variantPackDesc.get(), HIPDNN_ATTR_VARIANT_PACK_OVERRIDE_LENGTHS_EXT, HIPDNN_TYPE_INT64, static_cast(overrideLengths.size()), static_cast(overrideLengths.data())), "failed to set HIPDNN_ATTR_VARIANT_PACK_OVERRIDE_LENGTHS_EXT."); HIPDNN_RETURN_ON_BACKEND_FAILURE( hipdnnBackend()->backendSetAttribute(variantPackDesc.get(), HIPDNN_ATTR_VARIANT_PACK_OVERRIDE_SHAPES_EXT, HIPDNN_TYPE_INT64, static_cast(flatShapes.size()), static_cast(flatShapes.data())), "failed to set HIPDNN_ATTR_VARIANT_PACK_OVERRIDE_SHAPES_EXT."); HIPDNN_RETURN_ON_BACKEND_FAILURE( hipdnnBackend()->backendSetAttribute(variantPackDesc.get(), HIPDNN_ATTR_VARIANT_PACK_OVERRIDE_STRIDES_EXT, HIPDNN_TYPE_INT64, static_cast(flatStrides.size()), static_cast(flatStrides.data())), "failed to set HIPDNN_ATTR_VARIANT_PACK_OVERRIDE_STRIDES_EXT."); return {}; } } // namespace hipdnn_frontend::detail