// Copyright © Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #pragma once #include #include #include namespace hipdnn_frontend::detail { // Builds a conv fprop operation descriptor from ConvFpropAttributes. // Tensor descriptors are created/deduplicated via createOrFindTensorDesc. inline Error createConvFpropOperation( const graph::ConvFpropAttributes& attributes, std::unordered_map& tensorDescs, std::vector& operations) { // Create operation descriptor ScopedHipdnnBackendDescriptor opDesc(HIPDNN_BACKEND_OPERATION_CONVOLUTION_FORWARD_DESCRIPTOR); if(!opDesc.valid()) { return {ErrorCode::HIPDNN_BACKEND_ERROR, "Failed to create conv fprop operation descriptor"}; } // Create tensor descriptors (if needed) and set them on the operation HIPDNN_CHECK_ERROR(ensureAndSetTensorRef(opDesc.get(), HIPDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_X, attributes.get_x(), tensorDescs, "conv fprop X")); HIPDNN_CHECK_ERROR(ensureAndSetTensorRef(opDesc.get(), HIPDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_W, attributes.get_w(), tensorDescs, "conv fprop W")); HIPDNN_CHECK_ERROR(ensureAndSetTensorRef(opDesc.get(), HIPDNN_ATTR_OPERATION_CONVOLUTION_FORWARD_Y, attributes.get_y(), tensorDescs, "conv fprop Y")); // Pack shared convolution parameters HIPDNN_CHECK_ERROR(packConvolutionParams(opDesc.get(), attributes, "conv fprop")); // 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, "operation name")); } // Finalize operation descriptor HIPDNN_CHECK_ERROR(finalizeDescriptor(opDesc.get(), "conv fprop operation descriptor")); operations.push_back(std::move(opDesc)); return {}; } } // namespace hipdnn_frontend::detail