// Copyright © Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #pragma once #include #include #include namespace hipdnn_frontend::detail { // Builds a conv dgrad operation descriptor from ConvDgradAttributes. // Tensor descriptors are created/deduplicated via ensureAndSetTensorRef. inline Error createConvDgradOperation( const graph::ConvDgradAttributes& attributes, std::unordered_map& tensorDescs, std::vector& operations) { // Create operation descriptor ScopedHipdnnBackendDescriptor opDesc( HIPDNN_BACKEND_OPERATION_CONVOLUTION_BACKWARD_DATA_DESCRIPTOR); if(!opDesc.valid()) { return {ErrorCode::HIPDNN_BACKEND_ERROR, "Failed to create conv dgrad operation descriptor"}; } // Create tensor descriptors (if needed) and set them on the operation HIPDNN_CHECK_ERROR(ensureAndSetTensorRef(opDesc.get(), HIPDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_DY, attributes.get_dy(), tensorDescs, "conv dgrad DY")); HIPDNN_CHECK_ERROR(ensureAndSetTensorRef(opDesc.get(), HIPDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_W, attributes.get_w(), tensorDescs, "conv dgrad W")); HIPDNN_CHECK_ERROR(ensureAndSetTensorRef(opDesc.get(), HIPDNN_ATTR_OPERATION_CONVOLUTION_BWD_DATA_DX, attributes.get_dx(), tensorDescs, "conv dgrad DX")); // Pack shared convolution parameters HIPDNN_CHECK_ERROR(packConvolutionParams(opDesc.get(), attributes, "conv dgrad")); // 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, "convolutionbwd operation name")); } // Finalize operation descriptor HIPDNN_CHECK_ERROR(finalizeDescriptor(opDesc.get(), "conv dgrad operation descriptor")); operations.push_back(std::move(opDesc)); return {}; } } // namespace hipdnn_frontend::detail