// Copyright © Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #pragma once #include #include #include namespace hipdnn_frontend::detail { // Builds a conv wgrad operation descriptor from ConvWgradAttributes. // Tensor descriptors are created/deduplicated via ensureAndSetTensorRef. inline Error createConvWgradOperation( const graph::ConvWgradAttributes& attributes, std::unordered_map& tensorDescs, std::vector& operations) { // Create operation descriptor ScopedHipdnnBackendDescriptor opDesc( HIPDNN_BACKEND_OPERATION_CONVOLUTION_BACKWARD_FILTER_DESCRIPTOR); if(!opDesc.valid()) { return {ErrorCode::HIPDNN_BACKEND_ERROR, "Failed to create conv wgrad operation descriptor"}; } // Create tensor descriptors (if needed) and set them on the operation HIPDNN_CHECK_ERROR(ensureAndSetTensorRef(opDesc.get(), HIPDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_X, attributes.get_x(), tensorDescs, "conv wgrad X")); HIPDNN_CHECK_ERROR(ensureAndSetTensorRef(opDesc.get(), HIPDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_DY, attributes.get_dy(), tensorDescs, "conv wgrad DY")); HIPDNN_CHECK_ERROR(ensureAndSetTensorRef(opDesc.get(), HIPDNN_ATTR_OPERATION_CONVOLUTION_BWD_FILTER_DW, attributes.get_dw(), tensorDescs, "conv wgrad DW")); // Pack shared convolution parameters HIPDNN_CHECK_ERROR(packConvolutionParams(opDesc.get(), attributes, "conv wgrad")); // Set operation name if provided auto& opName = attributes.get_name(); if(!opName.empty()) { HIPDNN_CHECK_ERROR(setDescriptorAttrString( opDesc.get(), HIPDNN_ATTR_OPERATION_NAME_EXT, opName, "convolutionwrw operation name")); } // Finalize operation descriptor HIPDNN_CHECK_ERROR(finalizeDescriptor(opDesc.get(), "conv wgrad operation descriptor")); operations.push_back(std::move(opDesc)); return {}; } } // namespace hipdnn_frontend::detail