/*
 * Copyright 2014-2023 NVIDIA Corporation.  All rights reserved.
 *
 * NOTICE TO LICENSEE:
 *
 * This source code and/or documentation ("Licensed Deliverables") are
 * subject to NVIDIA intellectual property rights under U.S. and
 * international Copyright laws.
 *
 * These Licensed Deliverables contained herein is PROPRIETARY and
 * CONFIDENTIAL to NVIDIA and is being provided under the terms and
 * conditions of a form of NVIDIA software license agreement by and
 * between NVIDIA and Licensee ("License Agreement") or electronically
 * accepted by Licensee.  Notwithstanding any terms or conditions to
 * the contrary in the License Agreement, reproduction or disclosure
 * of the Licensed Deliverables to any third party without the express
 * written consent of NVIDIA is prohibited.
 *
 * NOTWITHSTANDING ANY TERMS OR CONDITIONS TO THE CONTRARY IN THE
 * LICENSE AGREEMENT, NVIDIA MAKES NO REPRESENTATION ABOUT THE
 * SUITABILITY OF THESE LICENSED DELIVERABLES FOR ANY PURPOSE.  IT IS
 * PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND.
 * NVIDIA DISCLAIMS ALL WARRANTIES WITH REGARD TO THESE LICENSED
 * DELIVERABLES, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY,
 * NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE.
 * NOTWITHSTANDING ANY TERMS OR CONDITIONS TO THE CONTRARY IN THE
 * LICENSE AGREEMENT, IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY
 * SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY
 * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
 * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
 * OF THESE LICENSED DELIVERABLES.
 *
 * U.S. Government End Users.  These Licensed Deliverables are a
 * "commercial item" as that term is defined at 48 C.F.R. 2.101 (OCT
 * 1995), consisting of "commercial computer software" and "commercial
 * computer software documentation" as such terms are used in 48
 * C.F.R. 12.212 (SEPT 1995) and is provided to the U.S. Government
 * only as a commercial end item.  Consistent with 48 C.F.R.12.212 and
 * 48 C.F.R. 227.7202-1 through 227.7202-4 (JUNE 1995), all
 * U.S. Government End Users acquire the Licensed Deliverables with
 * only those rights set forth herein.
 *
 * Any use of the Licensed Deliverables in individual and commercial
 * software must include, in the user documentation and internal
 * comments to the code, the above Disclaimer and U.S. Government End
 * Users Notice.
 */

/**
 * @file cudnn_cnn.h
 * @brief cuDNN CNN library - convolution, algorithm selection, and fused operations. Most APIs deprecated.
 *
 * @since cuDNN 9.0.0
 */

/*
 *  cudnn_cnn : cuDNN's basic definitions and CNN functions.
 */

#if !defined(CUDNN_CNN_H_)
#define CUDNN_CNN_H_

#pragma once
#include <stdint.h>

#include "cudnn_version.h"
#include "cudnn_ops.h"

/* These version numbers are autogenerated, do not edit manually. */
#define CUDNN_CNN_MAJOR 9
#define CUDNN_CNN_MINOR 24
#define CUDNN_CNN_PATCH 0

#if (CUDNN_CNN_MAJOR != CUDNN_MAJOR) || (CUDNN_CNN_MINOR != CUDNN_MINOR) || (CUDNN_CNN_PATCH != CUDNN_PATCHLEVEL)
#error Version mismatch in cuDNN CNN INFER!!!
#endif

#if defined(__cplusplus)
extern "C" {
#endif

/**
 * @brief Opaque descriptor for a convolution operation.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
typedef struct cudnnConvolutionStruct *cudnnConvolutionDescriptor_t CUDNN_DEPRECATED;

/**
 * @brief Performance results for forward convolution algorithm selection.
 *
 * Contains timing, memory usage, and determinism information for a given
 * forward convolution algorithm. Returned by algorithm search functions.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
typedef struct cudnnConvolutionFwdAlgoPerfStruct {
    cudnnConvolutionFwdAlgo_t algo;   /**< The forward convolution algorithm. */
    cudnnStatus_t status;             /**< Status returned when running this algorithm. */
    float time;                       /**< Execution time in milliseconds. */
    size_t memory;                    /**< Workspace memory required in bytes. */
    cudnnDeterminism_t determinism;   /**< Whether the algorithm is deterministic. */
    cudnnMathType_t mathType;         /**< Math type used by the algorithm. */
    int reserved[3];                  /**< Reserved for future use. */
} cudnnConvolutionFwdAlgoPerf_t CUDNN_DEPRECATED;

/**
 * @brief Create an instance of convolution descriptor.
 *
 * @param[out] convDesc Pointer to receive the newly created convolution descriptor.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
/* Create an instance of convolution descriptor */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnCreateConvolutionDescriptor(cudnnConvolutionDescriptor_t *convDesc);

/**
 * @brief Destroy an instance of convolution descriptor.
 *
 * @param[in] convDesc The convolution descriptor to destroy.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
/* Destroy an instance of convolution descriptor */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnDestroyConvolutionDescriptor(cudnnConvolutionDescriptor_t convDesc);

/**
 * @brief Set the math type for a convolution descriptor.
 *
 * @param[in,out] convDesc The convolution descriptor.
 * @param[in]     mathType The math type to set.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnSetConvolutionMathType(cudnnConvolutionDescriptor_t convDesc, cudnnMathType_t mathType);

/**
 * @brief Get the math type from a convolution descriptor.
 *
 * @param[in]  convDesc The convolution descriptor.
 * @param[out] mathType Pointer to receive the math type.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnGetConvolutionMathType(cudnnConvolutionDescriptor_t convDesc, cudnnMathType_t *mathType);

/**
 * @brief Set the group count for a convolution descriptor.
 *
 * @param[in,out] convDesc   The convolution descriptor.
 * @param[in]     groupCount The number of groups for grouped convolution.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnSetConvolutionGroupCount(cudnnConvolutionDescriptor_t convDesc, int groupCount);

/**
 * @brief Get the group count from a convolution descriptor.
 *
 * @param[in]  convDesc   The convolution descriptor.
 * @param[out] groupCount Pointer to receive the group count.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnGetConvolutionGroupCount(cudnnConvolutionDescriptor_t convDesc, int *groupCount);

/**
 * @brief Set the reorder type for a convolution descriptor.
 *
 * @param[in,out] convDesc    The convolution descriptor.
 * @param[in]     reorderType The reorder type to set.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnSetConvolutionReorderType(cudnnConvolutionDescriptor_t convDesc, cudnnReorderType_t reorderType);

/**
 * @brief Get the reorder type from a convolution descriptor.
 *
 * @param[in]  convDesc    The convolution descriptor.
 * @param[out] reorderType Pointer to receive the reorder type.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnGetConvolutionReorderType(cudnnConvolutionDescriptor_t convDesc, cudnnReorderType_t *reorderType);

/**
 * @brief Set a 2D convolution descriptor with padding, stride, dilation, mode, and compute type.
 *
 * @param[in,out] convDesc    The convolution descriptor to initialize.
 * @param[in]     pad_h       Zero-padding height.
 * @param[in]     pad_w       Zero-padding width.
 * @param[in]     u           Vertical filter stride.
 * @param[in]     v           Horizontal filter stride.
 * @param[in]     dilation_h  Filter dilation in the vertical dimension.
 * @param[in]     dilation_w  Filter dilation in the horizontal dimension.
 * @param[in]     mode        Convolution mode (cross-correlation or convolution).
 * @param[in]     computeType Data type for convolution computation.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnSetConvolution2dDescriptor(cudnnConvolutionDescriptor_t convDesc,
                                int pad_h,      /* zero-padding height */
                                int pad_w,      /* zero-padding width */
                                int u,          /* vertical filter stride */
                                int v,          /* horizontal filter stride */
                                int dilation_h, /* filter dilation in the vertical dimension */
                                int dilation_w, /* filter dilation in the horizontal dimension */
                                cudnnConvolutionMode_t mode,
                                cudnnDataType_t computeType);

/**
 * @brief Get the parameters of a 2D convolution descriptor.
 *
 * @param[in]  convDesc    The convolution descriptor to query.
 * @param[out] pad_h       Pointer to receive zero-padding height.
 * @param[out] pad_w       Pointer to receive zero-padding width.
 * @param[out] u           Pointer to receive vertical filter stride.
 * @param[out] v           Pointer to receive horizontal filter stride.
 * @param[out] dilation_h  Pointer to receive filter dilation in the vertical dimension.
 * @param[out] dilation_w  Pointer to receive filter dilation in the horizontal dimension.
 * @param[out] mode        Pointer to receive convolution mode.
 * @param[out] computeType Pointer to receive compute data type.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnGetConvolution2dDescriptor(const cudnnConvolutionDescriptor_t convDesc,
                                int *pad_h,      /* zero-padding height */
                                int *pad_w,      /* zero-padding width */
                                int *u,          /* vertical filter stride */
                                int *v,          /* horizontal filter stride */
                                int *dilation_h, /* filter dilation in the vertical dimension */
                                int *dilation_w, /* filter dilation in the horizontal dimension */
                                cudnnConvolutionMode_t *mode,
                                cudnnDataType_t *computeType);

/**
 * @brief Set an N-dimensional convolution descriptor.
 *
 * @param[in,out] convDesc      The convolution descriptor to initialize.
 * @param[in]     arrayLength   Number of dimensions (nbDims-2 size).
 * @param[in]     padA          Array of zero-padding values per dimension.
 * @param[in]     filterStrideA Array of filter strides per dimension.
 * @param[in]     dilationA     Array of dilation values per dimension.
 * @param[in]     mode          Convolution mode.
 * @param[in]     computeType   Data type for convolution computation.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnSetConvolutionNdDescriptor(cudnnConvolutionDescriptor_t convDesc,
                                int arrayLength, /* nbDims-2 size */
                                const int padA[],
                                const int filterStrideA[],
                                const int dilationA[],
                                cudnnConvolutionMode_t mode,
                                cudnnDataType_t computeType); /* convolution data type */

/**
 * @brief Get the parameters of an N-dimensional convolution descriptor.
 *
 * @param[in]  convDesc             The convolution descriptor to query.
 * @param[in]  arrayLengthRequested Maximum number of dimensions to retrieve.
 * @param[out] arrayLength          Pointer to receive the actual number of dimensions.
 * @param[out] padA                 Array to receive zero-padding values.
 * @param[out] strideA              Array to receive stride values.
 * @param[out] dilationA            Array to receive dilation values.
 * @param[out] mode                 Pointer to receive convolution mode.
 * @param[out] computeType          Pointer to receive compute data type.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
/* Helper function to return the dimensions of the output tensor given a convolution descriptor */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnGetConvolutionNdDescriptor(const cudnnConvolutionDescriptor_t convDesc,
                                int arrayLengthRequested,
                                int *arrayLength,
                                int padA[],
                                int strideA[],
                                int dilationA[],
                                cudnnConvolutionMode_t *mode,
                                cudnnDataType_t *computeType); /* convolution data type */

/**
 * @brief Compute the output dimensions of a 2D convolution.
 *
 * @param[in]  convDesc        The convolution descriptor.
 * @param[in]  inputTensorDesc Descriptor for the input tensor.
 * @param[in]  filterDesc      Descriptor for the filter.
 * @param[out] n               Pointer to receive the output batch size.
 * @param[out] c               Pointer to receive the output channels.
 * @param[out] h               Pointer to receive the output height.
 * @param[out] w               Pointer to receive the output width.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnGetConvolution2dForwardOutputDim(const cudnnConvolutionDescriptor_t convDesc,
                                      const cudnnTensorDescriptor_t inputTensorDesc,
                                      const cudnnFilterDescriptor_t filterDesc,
                                      int *n,
                                      int *c,
                                      int *h,
                                      int *w);

/**
 * @brief Compute the output dimensions of an N-dimensional convolution.
 *
 * @param[in]  convDesc         The convolution descriptor.
 * @param[in]  inputTensorDesc  Descriptor for the input tensor.
 * @param[in]  filterDesc       Descriptor for the filter.
 * @param[in]  nbDims           Number of dimensions.
 * @param[out] tensorOuputDimA  Array to receive the output dimensions.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
/* Helper function to return the dimensions of the output tensor given a convolution descriptor */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnGetConvolutionNdForwardOutputDim(const cudnnConvolutionDescriptor_t convDesc,
                                      const cudnnTensorDescriptor_t inputTensorDesc,
                                      const cudnnFilterDescriptor_t filterDesc,
                                      int nbDims,
                                      int tensorOuputDimA[]);

/**
 * @brief Get the maximum number of forward convolution algorithms available.
 *
 * @param[in]  handle The cuDNN handle.
 * @param[out] count  Pointer to receive the maximum algorithm count.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
/* helper function to provide the convolution forward algo that fit best the requirement */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnGetConvolutionForwardAlgorithmMaxCount(cudnnHandle_t handle, int *count);

/**
 * @brief Get forward convolution algorithm recommendations without executing them.
 *
 * Returns a list of algorithms sorted by expected performance. Does not
 * require a workspace or run actual convolutions.
 *
 * @param[in]  handle              The cuDNN handle.
 * @param[in]  srcDesc             Descriptor for the input tensor.
 * @param[in]  filterDesc          Descriptor for the filter.
 * @param[in]  convDesc            The convolution descriptor.
 * @param[in]  destDesc            Descriptor for the output tensor.
 * @param[in]  requestedAlgoCount  Maximum number of algorithms to return.
 * @param[out] returnedAlgoCount   Pointer to receive the actual number returned.
 * @param[out] perfResults         Array to receive the algorithm performance results.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnGetConvolutionForwardAlgorithm_v7(cudnnHandle_t handle,
                                       const cudnnTensorDescriptor_t srcDesc,
                                       const cudnnFilterDescriptor_t filterDesc,
                                       const cudnnConvolutionDescriptor_t convDesc,
                                       const cudnnTensorDescriptor_t destDesc,
                                       const int requestedAlgoCount,
                                       int *returnedAlgoCount,
                                       cudnnConvolutionFwdAlgoPerf_t *perfResults);

/**
 * @brief Find the best forward convolution algorithm by running benchmarks.
 *
 * Executes all applicable algorithms and returns performance results
 * sorted by execution time. Does not require user-allocated workspace.
 *
 * @param[in]  handle              The cuDNN handle.
 * @param[in]  xDesc               Descriptor for the input tensor.
 * @param[in]  wDesc               Descriptor for the filter.
 * @param[in]  convDesc            The convolution descriptor.
 * @param[in]  yDesc               Descriptor for the output tensor.
 * @param[in]  requestedAlgoCount  Maximum number of algorithms to test.
 * @param[out] returnedAlgoCount   Pointer to receive the actual number returned.
 * @param[out] perfResults         Array to receive the algorithm performance results.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnFindConvolutionForwardAlgorithm(cudnnHandle_t handle,
                                     const cudnnTensorDescriptor_t xDesc,
                                     const cudnnFilterDescriptor_t wDesc,
                                     const cudnnConvolutionDescriptor_t convDesc,
                                     const cudnnTensorDescriptor_t yDesc,
                                     const int requestedAlgoCount,
                                     int *returnedAlgoCount,
                                     cudnnConvolutionFwdAlgoPerf_t *perfResults);

/**
 * @brief Find the best forward convolution algorithm by running benchmarks with user-provided buffers.
 *
 * Similar to cudnnFindConvolutionForwardAlgorithm but uses caller-provided
 * data buffers and workspace.
 *
 * @param[in]  handle                The cuDNN handle.
 * @param[in]  xDesc                 Descriptor for the input tensor.
 * @param[in]  x                     Pointer to input data in device memory.
 * @param[in]  wDesc                 Descriptor for the filter.
 * @param[in]  w                     Pointer to filter data in device memory.
 * @param[in]  convDesc              The convolution descriptor.
 * @param[in]  yDesc                 Descriptor for the output tensor.
 * @param[out] y                     Pointer to output data in device memory.
 * @param[in]  requestedAlgoCount    Maximum number of algorithms to test.
 * @param[out] returnedAlgoCount     Pointer to receive the actual number returned.
 * @param[out] perfResults           Array to receive the algorithm performance results.
 * @param[in]  workSpace             Pointer to workspace in device memory.
 * @param[in]  workSpaceSizeInBytes  Size of the workspace in bytes.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnFindConvolutionForwardAlgorithmEx(cudnnHandle_t handle,
                                       const cudnnTensorDescriptor_t xDesc,
                                       const void *x,
                                       const cudnnFilterDescriptor_t wDesc,
                                       const void *w,
                                       const cudnnConvolutionDescriptor_t convDesc,
                                       const cudnnTensorDescriptor_t yDesc,
                                       void *y,
                                       const int requestedAlgoCount,
                                       int *returnedAlgoCount,
                                       cudnnConvolutionFwdAlgoPerf_t *perfResults,
                                       void *workSpace,
                                       size_t workSpaceSizeInBytes);

/**
 * @brief Perform the Im2Col transform for convolution.
 *
 * Rearranges image data into a column matrix suitable for matrix multiplication
 * based convolution.
 *
 * @param[in]  handle   The cuDNN handle.
 * @param[in]  xDesc    Descriptor for the input tensor.
 * @param[in]  x        Pointer to input data in device memory.
 * @param[in]  wDesc    Descriptor for the filter.
 * @param[in]  convDesc The convolution descriptor.
 * @param[out] colBuffer Pointer to the output column buffer in device memory.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnIm2Col(cudnnHandle_t handle,
            const cudnnTensorDescriptor_t xDesc,
            const void *x,
            const cudnnFilterDescriptor_t wDesc,
            const cudnnConvolutionDescriptor_t convDesc,
            void *colBuffer);

/**
 * @brief Reorder filter and bias data for optimized convolution execution.
 *
 * Rearranges filter and optionally bias data into a layout optimized for
 * the specified reorder type.
 *
 * @param[in]  handle              The cuDNN handle.
 * @param[in]  filterDesc          Descriptor for the filter.
 * @param[in]  reorderType         The reorder type to apply.
 * @param[in]  filterData          Pointer to source filter data in device memory.
 * @param[out] reorderedFilterData Pointer to destination filter data in device memory.
 * @param[in]  reorderBias         Non-zero to also reorder bias data.
 * @param[in]  biasData            Pointer to source bias data in device memory (may be NULL).
 * @param[out] reorderedBiasData   Pointer to destination bias data in device memory (may be NULL).
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnReorderFilterAndBias(cudnnHandle_t handle,
                          const cudnnFilterDescriptor_t filterDesc,
                          cudnnReorderType_t reorderType,
                          const void *filterData,
                          void *reorderedFilterData,
                          int reorderBias,
                          const void *biasData,
                          void *reorderedBiasData);

/**
 * @brief Get the minimum workspace size required for a forward convolution algorithm.
 *
 * @param[in]  handle       The cuDNN handle.
 * @param[in]  xDesc        Descriptor for the input tensor.
 * @param[in]  wDesc        Descriptor for the filter.
 * @param[in]  convDesc     The convolution descriptor.
 * @param[in]  yDesc        Descriptor for the output tensor.
 * @param[in]  algo         The forward convolution algorithm.
 * @param[out] sizeInBytes  Pointer to receive the required workspace size.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
/* Helper function to return the minimum size of the workspace to be passed to the convolution given an algo*/
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnGetConvolutionForwardWorkspaceSize(cudnnHandle_t handle,
                                        const cudnnTensorDescriptor_t xDesc,
                                        const cudnnFilterDescriptor_t wDesc,
                                        const cudnnConvolutionDescriptor_t convDesc,
                                        const cudnnTensorDescriptor_t yDesc,
                                        cudnnConvolutionFwdAlgo_t algo,
                                        size_t *sizeInBytes);

/* Convolution functions: All of the form "output = alpha * Op(inputs) + beta * output" */

/**
 * @brief Execute a forward convolution.
 *
 * Computes: y = alpha * conv(x, w) + beta * y
 *
 * @param[in]     handle                The cuDNN handle.
 * @param[in]     alpha                 Pointer to scaling factor for the convolution result.
 * @param[in]     xDesc                 Descriptor for the input tensor.
 * @param[in]     x                     Pointer to input data in device memory.
 * @param[in]     wDesc                 Descriptor for the filter.
 * @param[in]     w                     Pointer to filter data in device memory.
 * @param[in]     convDesc              The convolution descriptor.
 * @param[in]     algo                  The forward convolution algorithm to use.
 * @param[in]     workSpace             Pointer to workspace in device memory.
 * @param[in]     workSpaceSizeInBytes  Size of the workspace in bytes.
 * @param[in]     beta                  Pointer to scaling factor for the prior output.
 * @param[in]     yDesc                 Descriptor for the output tensor.
 * @param[in,out] y                     Pointer to output data in device memory.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
/* Function to perform the forward pass for batch convolution */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnConvolutionForward(cudnnHandle_t handle,
                        const void *alpha,
                        const cudnnTensorDescriptor_t xDesc,
                        const void *x,
                        const cudnnFilterDescriptor_t wDesc,
                        const void *w,
                        const cudnnConvolutionDescriptor_t convDesc,
                        cudnnConvolutionFwdAlgo_t algo,
                        void *workSpace,
                        size_t workSpaceSizeInBytes,
                        const void *beta,
                        const cudnnTensorDescriptor_t yDesc,
                        void *y);

/**
 * @brief Execute a fused convolution with bias and activation.
 *
 * Computes: y = Act( alpha1 * conv(x) + alpha2 * z + bias )
 *
 * @param[in]     handle                The cuDNN handle.
 * @param[in]     alpha1                Pointer to scaling factor for the convolution result.
 * @param[in]     xDesc                 Descriptor for the input tensor.
 * @param[in]     x                     Pointer to input data in device memory.
 * @param[in]     wDesc                 Descriptor for the filter.
 * @param[in]     w                     Pointer to filter data in device memory.
 * @param[in]     convDesc              The convolution descriptor.
 * @param[in]     algo                  The forward convolution algorithm to use.
 * @param[in]     workSpace             Pointer to workspace in device memory.
 * @param[in]     workSpaceSizeInBytes  Size of the workspace in bytes.
 * @param[in]     alpha2                Pointer to scaling factor for the residual input z.
 * @param[in]     zDesc                 Descriptor for the residual input tensor.
 * @param[in]     z                     Pointer to residual data in device memory.
 * @param[in]     biasDesc              Descriptor for the bias tensor.
 * @param[in]     bias                  Pointer to bias data in device memory.
 * @param[in]     activationDesc        Descriptor for the activation operation.
 * @param[in]     yDesc                 Descriptor for the output tensor.
 * @param[in,out] y                     Pointer to output data in device memory.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
/* Fused conv/bias/activation operation : y = Act( alpha1 * conv(x) + alpha2 * z + bias ) */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnConvolutionBiasActivationForward(cudnnHandle_t handle,
                                      const void *alpha1,
                                      const cudnnTensorDescriptor_t xDesc,
                                      const void *x,
                                      const cudnnFilterDescriptor_t wDesc,
                                      const void *w,
                                      const cudnnConvolutionDescriptor_t convDesc,
                                      cudnnConvolutionFwdAlgo_t algo,
                                      void *workSpace,
                                      size_t workSpaceSizeInBytes,
                                      const void *alpha2,
                                      const cudnnTensorDescriptor_t zDesc,
                                      const void *z,
                                      const cudnnTensorDescriptor_t biasDesc,
                                      const void *bias,
                                      const cudnnActivationDescriptor_t activationDesc,
                                      const cudnnTensorDescriptor_t yDesc,
                                      void *y);

/* helper function to provide the convolution backward data algo that fit best the requirement */

/**
 * @brief Performance results for backward data convolution algorithm selection.
 *
 * Contains timing, memory usage, and determinism information for a given
 * backward data convolution algorithm. Returned by algorithm search functions.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
typedef struct cudnnConvolutionBwdDataAlgoPerfStruct {
    cudnnConvolutionBwdDataAlgo_t algo; /**< The backward data convolution algorithm. */
    cudnnStatus_t status;               /**< Status returned when running this algorithm. */
    float time;                         /**< Execution time in milliseconds. */
    size_t memory;                      /**< Workspace memory required in bytes. */
    cudnnDeterminism_t determinism;     /**< Whether the algorithm is deterministic. */
    cudnnMathType_t mathType;           /**< Math type used by the algorithm. */
    int reserved[3];                    /**< Reserved for future use. */
} cudnnConvolutionBwdDataAlgoPerf_t CUDNN_DEPRECATED;

/**
 * @brief Get the maximum number of backward data convolution algorithms available.
 *
 * @param[in]  handle The cuDNN handle.
 * @param[out] count  Pointer to receive the maximum algorithm count.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnGetConvolutionBackwardDataAlgorithmMaxCount(cudnnHandle_t handle, int *count);

/**
 * @brief Find the best backward data convolution algorithm by running benchmarks.
 *
 * @param[in]  handle              The cuDNN handle.
 * @param[in]  wDesc               Descriptor for the filter.
 * @param[in]  dyDesc              Descriptor for the gradient output tensor.
 * @param[in]  convDesc            The convolution descriptor.
 * @param[in]  dxDesc              Descriptor for the gradient input tensor.
 * @param[in]  requestedAlgoCount  Maximum number of algorithms to test.
 * @param[out] returnedAlgoCount   Pointer to receive the actual number returned.
 * @param[out] perfResults         Array to receive the algorithm performance results.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnFindConvolutionBackwardDataAlgorithm(cudnnHandle_t handle,
                                          const cudnnFilterDescriptor_t wDesc,
                                          const cudnnTensorDescriptor_t dyDesc,
                                          const cudnnConvolutionDescriptor_t convDesc,
                                          const cudnnTensorDescriptor_t dxDesc,
                                          const int requestedAlgoCount,
                                          int *returnedAlgoCount,
                                          cudnnConvolutionBwdDataAlgoPerf_t *perfResults);

/**
 * @brief Find the best backward data convolution algorithm with user-provided buffers.
 *
 * @param[in]  handle                The cuDNN handle.
 * @param[in]  wDesc                 Descriptor for the filter.
 * @param[in]  w                     Pointer to filter data in device memory.
 * @param[in]  dyDesc                Descriptor for the gradient output tensor.
 * @param[in]  dy                    Pointer to gradient output data in device memory.
 * @param[in]  convDesc              The convolution descriptor.
 * @param[in]  dxDesc                Descriptor for the gradient input tensor.
 * @param[out] dx                    Pointer to gradient input data in device memory.
 * @param[in]  requestedAlgoCount    Maximum number of algorithms to test.
 * @param[out] returnedAlgoCount     Pointer to receive the actual number returned.
 * @param[out] perfResults           Array to receive the algorithm performance results.
 * @param[in]  workSpace             Pointer to workspace in device memory.
 * @param[in]  workSpaceSizeInBytes  Size of the workspace in bytes.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnFindConvolutionBackwardDataAlgorithmEx(cudnnHandle_t handle,
                                            const cudnnFilterDescriptor_t wDesc,
                                            const void *w,
                                            const cudnnTensorDescriptor_t dyDesc,
                                            const void *dy,
                                            const cudnnConvolutionDescriptor_t convDesc,
                                            const cudnnTensorDescriptor_t dxDesc,
                                            void *dx,
                                            const int requestedAlgoCount,
                                            int *returnedAlgoCount,
                                            cudnnConvolutionBwdDataAlgoPerf_t *perfResults,
                                            void *workSpace,
                                            size_t workSpaceSizeInBytes);

/**
 * @brief Get backward data convolution algorithm recommendations without executing them.
 *
 * @param[in]  handle              The cuDNN handle.
 * @param[in]  filterDesc          Descriptor for the filter.
 * @param[in]  diffDesc            Descriptor for the gradient output tensor.
 * @param[in]  convDesc            The convolution descriptor.
 * @param[in]  gradDesc            Descriptor for the gradient input tensor.
 * @param[in]  requestedAlgoCount  Maximum number of algorithms to return.
 * @param[out] returnedAlgoCount   Pointer to receive the actual number returned.
 * @param[out] perfResults         Array to receive the algorithm performance results.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnGetConvolutionBackwardDataAlgorithm_v7(cudnnHandle_t handle,
                                            const cudnnFilterDescriptor_t filterDesc,
                                            const cudnnTensorDescriptor_t diffDesc,
                                            const cudnnConvolutionDescriptor_t convDesc,
                                            const cudnnTensorDescriptor_t gradDesc,
                                            const int requestedAlgoCount,
                                            int *returnedAlgoCount,
                                            cudnnConvolutionBwdDataAlgoPerf_t *perfResults);

/*
 *  convolution algorithm (which requires potentially some workspace)
 */

/**
 * @brief Get the minimum workspace size required for a backward data convolution algorithm.
 *
 * @param[in]  handle       The cuDNN handle.
 * @param[in]  wDesc        Descriptor for the filter.
 * @param[in]  dyDesc       Descriptor for the gradient output tensor.
 * @param[in]  convDesc     The convolution descriptor.
 * @param[in]  dxDesc       Descriptor for the gradient input tensor.
 * @param[in]  algo         The backward data convolution algorithm.
 * @param[out] sizeInBytes  Pointer to receive the required workspace size.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
/* Helper function to return the minimum size of the workspace to be passed to the convolution given an algo*/
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnGetConvolutionBackwardDataWorkspaceSize(cudnnHandle_t handle,
                                             const cudnnFilterDescriptor_t wDesc,
                                             const cudnnTensorDescriptor_t dyDesc,
                                             const cudnnConvolutionDescriptor_t convDesc,
                                             const cudnnTensorDescriptor_t dxDesc,
                                             cudnnConvolutionBwdDataAlgo_t algo,
                                             size_t *sizeInBytes);

/**
 * @brief Execute a backward data convolution (compute gradient with respect to input data).
 *
 * Computes: dx = alpha * dconv(w, dy) + beta * dx
 *
 * @param[in]     handle                The cuDNN handle.
 * @param[in]     alpha                 Pointer to scaling factor for the convolution result.
 * @param[in]     wDesc                 Descriptor for the filter.
 * @param[in]     w                     Pointer to filter data in device memory.
 * @param[in]     dyDesc                Descriptor for the gradient output tensor.
 * @param[in]     dy                    Pointer to gradient output data in device memory.
 * @param[in]     convDesc              The convolution descriptor.
 * @param[in]     algo                  The backward data convolution algorithm.
 * @param[in]     workSpace             Pointer to workspace in device memory.
 * @param[in]     workSpaceSizeInBytes  Size of the workspace in bytes.
 * @param[in]     beta                  Pointer to scaling factor for the prior gradient input.
 * @param[in]     dxDesc                Descriptor for the gradient input tensor.
 * @param[in,out] dx                    Pointer to gradient input data in device memory.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnConvolutionBackwardData(cudnnHandle_t handle,
                             const void *alpha,
                             const cudnnFilterDescriptor_t wDesc,
                             const void *w,
                             const cudnnTensorDescriptor_t dyDesc,
                             const void *dy,
                             const cudnnConvolutionDescriptor_t convDesc,
                             cudnnConvolutionBwdDataAlgo_t algo,
                             void *workSpace,
                             size_t workSpaceSizeInBytes,
                             const void *beta,
                             const cudnnTensorDescriptor_t dxDesc,
                             void *dx);

/**
 * @brief Calculate folding descriptors for backward data convolution (dgrad).
 *
 * Computes the folded descriptors needed for tensor transform operations
 * used in backward data gradient computation.
 *
 * @param[in]  handle                 The cuDNN handle.
 * @param[in]  filterDesc             Descriptor for the filter.
 * @param[in]  diffDesc               Descriptor for the gradient output tensor.
 * @param[in]  convDesc               The convolution descriptor.
 * @param[in]  gradDesc               Descriptor for the gradient input tensor.
 * @param[in]  transformFormat         The tensor format for the transform.
 * @param[out] foldedFilterDesc       Descriptor for the folded filter.
 * @param[out] paddedDiffDesc         Descriptor for the padded gradient output.
 * @param[out] foldedConvDesc         Descriptor for the folded convolution.
 * @param[out] foldedGradDesc         Descriptor for the folded gradient input.
 * @param[out] filterFoldTransDesc    Transform descriptor for filter folding.
 * @param[out] diffPadTransDesc       Transform descriptor for diff padding.
 * @param[out] gradFoldTransDesc      Transform descriptor for gradient folding.
 * @param[out] gradUnfoldTransDesc    Transform descriptor for gradient unfolding.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
/* Helper function to calculate folding descriptors for dgrad */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnGetFoldedConvBackwardDataDescriptors(const cudnnHandle_t handle,
                                          const cudnnFilterDescriptor_t filterDesc,
                                          const cudnnTensorDescriptor_t diffDesc,
                                          const cudnnConvolutionDescriptor_t convDesc,
                                          const cudnnTensorDescriptor_t gradDesc,
                                          const cudnnTensorFormat_t transformFormat,
                                          cudnnFilterDescriptor_t foldedFilterDesc,
                                          cudnnTensorDescriptor_t paddedDiffDesc,
                                          cudnnConvolutionDescriptor_t foldedConvDesc,
                                          cudnnTensorDescriptor_t foldedGradDesc,
                                          cudnnTensorTransformDescriptor_t filterFoldTransDesc,
                                          cudnnTensorTransformDescriptor_t diffPadTransDesc,
                                          cudnnTensorTransformDescriptor_t gradFoldTransDesc,
                                          cudnnTensorTransformDescriptor_t gradUnfoldTransDesc);

/* cudnnFusedOps... */

/**
 * @brief Opaque descriptor for fused operations constant parameter pack.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
struct cudnnFusedOpsConstParamStruct;

/**
 * @brief Handle to a fused operations constant parameter pack.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
typedef struct cudnnFusedOpsConstParamStruct *cudnnFusedOpsConstParamPack_t CUDNN_DEPRECATED;

/**
 * @brief Opaque descriptor for fused operations variant parameter pack.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
struct cudnnFusedOpsVariantParamStruct;

/**
 * @brief Handle to a fused operations variant parameter pack.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
typedef struct cudnnFusedOpsVariantParamStruct *cudnnFusedOpsVariantParamPack_t CUDNN_DEPRECATED;

/**
 * @brief Opaque descriptor for a fused operations execution plan.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
struct cudnnFusedOpsPlanStruct;

/**
 * @brief Handle to a fused operations execution plan.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
typedef struct cudnnFusedOpsPlanStruct *cudnnFusedOpsPlan_t CUDNN_DEPRECATED;

/**
 * @brief Enumeration of fused operation sequences.
 *
 * Specifies which sequence of operations to fuse together for optimized execution.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
typedef enum {
    /* each op in [ ] can be disabled by passing NULL ptr */
    /* [per channel scale], [per channel bias], [activation], convolution, [generate BN stats] */
    CUDNN_FUSED_SCALE_BIAS_ACTIVATION_CONV_BNSTATS = 0, /**< Fused scale, bias, activation, convolution, and optional BN stats generation. */
    /* [per channel scale], [per channel bias], [activation], convolutionBackwardWeights */
    CUDNN_FUSED_SCALE_BIAS_ACTIVATION_WGRAD = 1,        /**< Fused scale, bias, activation, and backward weight convolution. */
    /* utility for BN training in BN-conv fusion */
    /* computes the equivalent scale and bias from ySum ySqSum and learned scale, bias */
    /* optionally update running stats and generate saved stats */
    CUDNN_FUSED_BN_FINALIZE_STATISTICS_TRAINING = 2,    /**< Finalize batch normalization statistics for training. */
    /* utility for BN inference in BN-conv fusion */
    /* computes the equivalent scale and bias from learned running stats and learned scale, bias */
    CUDNN_FUSED_BN_FINALIZE_STATISTICS_INFERENCE = 3,   /**< Finalize batch normalization statistics for inference. */
    /* reserved for future use: convolution, [per channel scale], [per channel bias], [residual add], [activation] */
    CUDNN_FUSED_CONV_SCALE_BIAS_ADD_ACTIVATION = 4,     /**< Fused convolution, scale, bias, residual add, and activation. */
    /* reserved for future use: [per channel scale], [per channel bias], [residual add],  activation, bitmask */
    CUDNN_FUSED_SCALE_BIAS_ADD_ACTIVATION_GEN_BITMASK = 5, /**< Fused scale, bias, residual add, activation, and bitmask generation. */
    /* reserved for future use */
    CUDNN_FUSED_DACTIVATION_FORK_DBATCHNORM = 6,        /**< Fused backward activation fork and backward batch normalization. */
} cudnnFusedOps_t CUDNN_DEPRECATED;

/**
 * @brief Labels for constant parameters in a fused operations parameter pack.
 *
 * Used to identify which constant parameter to set or get in a
 * cudnnFusedOpsConstParamPack_t.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
typedef enum {
    /* set XDESC: pass previously initialized cudnnTensorDescriptor_t */
    /* get XDESC: pass previously created cudnnTensorDescriptor_t */
    CUDNN_PARAM_XDESC = 0,                       /**< Input tensor descriptor (X). */
    /* set/get XDATA_PLACEHOLDER: pass cudnnFusedOpsPointerPlaceHolder_t* */
    CUDNN_PARAM_XDATA_PLACEHOLDER = 1,            /**< Placeholder for input data pointer alignment (X). */
    /* set/get BN_MODE: pass cudnnBatchNormMode_t* */
    CUDNN_PARAM_BN_MODE = 2,                      /**< Batch normalization mode. */
    /* set CUDNN_PARAM_BN_EQSCALEBIAS_DESC: pass previously initialized cudnnTensorDescriptor_t */
    /* get CUDNN_PARAM_BN_EQSCALEBIAS_DESC: pass previously created cudnnTensorDescriptor_t */
    CUDNN_PARAM_BN_EQSCALEBIAS_DESC = 3,          /**< Equivalent scale/bias descriptor for BN fusion. */
    /* set/get BN_EQSCALE_PLACEHOLDER: pass cudnnFusedOpsPointerPlaceHolder_t* */
    CUDNN_PARAM_BN_EQSCALE_PLACEHOLDER = 4,       /**< Placeholder for BN equivalent scale pointer alignment. */
    /* set/get BN_EQBIAS_PLACEHOLDER: pass cudnnFusedOpsPointerPlaceHolder_t* */
    CUDNN_PARAM_BN_EQBIAS_PLACEHOLDER = 5,        /**< Placeholder for BN equivalent bias pointer alignment. */
    /* set ACTIVATION_DESC: pass previously initialized cudnnActivationDescriptor_t */
    /* get ACTIVATION_DESC: pass previously created cudnnActivationDescriptor_t */
    CUDNN_PARAM_ACTIVATION_DESC = 6,              /**< Activation descriptor. */
    /* set CONV_DESC: pass previously initialized cudnnConvolutionDescriptor_t */
    /* get CONV_DESC: pass previously created cudnnConvolutionDescriptor_t */
    CUDNN_PARAM_CONV_DESC = 7,                    /**< Convolution descriptor. */
    /* set WDESC: pass previously initialized cudnnFilterDescriptor_t */
    /* get WDESC: pass previously created cudnnFilterDescriptor_t */
    CUDNN_PARAM_WDESC = 8,                        /**< Filter descriptor (W). */
    /* set/get WDATA_PLACEHOLDER: pass cudnnFusedOpsPointerPlaceHolder_t* */
    CUDNN_PARAM_WDATA_PLACEHOLDER = 9,            /**< Placeholder for filter data pointer alignment (W). */
    /* set DWDESC: pass previously initialized cudnnFilterDescriptor_t */
    /* get DWDESC: pass previously created cudnnFilterDescriptor_t */
    CUDNN_PARAM_DWDESC = 10,                      /**< Filter gradient descriptor (dW). */
    /* set/get DWDATA_PLACEHOLDER: pass cudnnFusedOpsPointerPlaceHolder_t* */
    CUDNN_PARAM_DWDATA_PLACEHOLDER = 11,          /**< Placeholder for filter gradient data pointer alignment (dW). */
    /* set YDESC: pass previously initialized cudnnTensorDescriptor_t */
    /* get YDESC: pass previously created cudnnTensorDescriptor_t */
    CUDNN_PARAM_YDESC = 12,                       /**< Output tensor descriptor (Y). */
    /* set/get YDATA_PLACEHOLDER: pass cudnnFusedOpsPointerPlaceHolder_t* */
    CUDNN_PARAM_YDATA_PLACEHOLDER = 13,           /**< Placeholder for output data pointer alignment (Y). */
    /* set DYDESC: pass previously initialized cudnnTensorDescriptor_t */
    /* get DYDESC: pass previously created cudnnTensorDescriptor_t */
    CUDNN_PARAM_DYDESC = 14,                      /**< Output gradient tensor descriptor (dY). */
    /* set/get DYDATA_PLACEHOLDER: pass cudnnFusedOpsPointerPlaceHolder_t* */
    CUDNN_PARAM_DYDATA_PLACEHOLDER = 15,          /**< Placeholder for output gradient data pointer alignment (dY). */
    /* set YSTATS_DESC: pass previously initialized cudnnTensorDescriptor_t */
    /* get YSTATS_DESC: pass previously created cudnnTensorDescriptor_t */
    CUDNN_PARAM_YSTATS_DESC = 16,                 /**< Output statistics tensor descriptor. */
    /* set/get YSUM_PLACEHOLDER: pass cudnnFusedOpsPointerPlaceHolder_t* */
    CUDNN_PARAM_YSUM_PLACEHOLDER = 17,            /**< Placeholder for Y sum pointer alignment. */
    /* set/get YSQSUM_PLACEHOLDER: pass cudnnFusedOpsPointerPlaceHolder_t* */
    CUDNN_PARAM_YSQSUM_PLACEHOLDER = 18,          /**< Placeholder for Y squared sum pointer alignment. */
    /* set CUDNN_PARAM_BN_SCALEBIAS_MEANVAR_DESC: pass previously initialized cudnnTensorDescriptor_t */
    /* get CUDNN_PARAM_BN_SCALEBIAS_MEANVAR_DESC: pass previously created cudnnTensorDescriptor_t */
    CUDNN_PARAM_BN_SCALEBIAS_MEANVAR_DESC = 19,   /**< BN scale/bias/mean/variance tensor descriptor. */
    /* set/get CUDNN_PARAM_BN_SCALE_PLACEHOLDER: pass cudnnFusedOpsPointerPlaceHolder_t* */
    CUDNN_PARAM_BN_SCALE_PLACEHOLDER = 20,        /**< Placeholder for BN scale pointer alignment. */
    /* set/get CUDNN_PARAM_BN_BIAS_PLACEHOLDER: pass cudnnFusedOpsPointerPlaceHolder_t* */
    CUDNN_PARAM_BN_BIAS_PLACEHOLDER = 21,         /**< Placeholder for BN bias pointer alignment. */
    /* set/get CUDNN_PARAM_BN_SAVED_MEAN_PLACEHOLDER: pass cudnnFusedOpsPointerPlaceHolder_t* */
    CUDNN_PARAM_BN_SAVED_MEAN_PLACEHOLDER = 22,   /**< Placeholder for BN saved mean pointer alignment. */
    /* set/get CUDNN_PARAM_BN_SAVED_INVSTD_PLACEHOLDER: pass cudnnFusedOpsPointerPlaceHolder_t* */
    CUDNN_PARAM_BN_SAVED_INVSTD_PLACEHOLDER = 23,  /**< Placeholder for BN saved inverse standard deviation pointer alignment. */
    /* set/get CUDNN_PARAM_BN_RUNNING_MEAN_PLACEHOLDER: pass cudnnFusedOpsPointerPlaceHolder_t* */
    CUDNN_PARAM_BN_RUNNING_MEAN_PLACEHOLDER = 24,  /**< Placeholder for BN running mean pointer alignment. */
    /* set/get CUDNN_PARAM_BN_RUNNING_VAR_PLACEHOLDER: pass cudnnFusedOpsPointerPlaceHolder_t* */
    CUDNN_PARAM_BN_RUNNING_VAR_PLACEHOLDER = 25,   /**< Placeholder for BN running variance pointer alignment. */

    /* set ZDESC: pass previously initialized cudnnTensorDescriptor_t */
    /* get ZDESC: pass previously created cudnnTensorDescriptor_t */
    CUDNN_PARAM_ZDESC = 26,                       /**< Residual input tensor descriptor (Z). */
    /* set/get ZDATA_PLACEHOLDER: pass cudnnFusedOpsPointerPlaceHolder_t* */
    CUDNN_PARAM_ZDATA_PLACEHOLDER = 27,           /**< Placeholder for residual input data pointer alignment (Z). */
    /* set BN_Z_EQSCALEBIAS_DESC: pass previously initialized cudnnTensorDescriptor_t */
    /* get BN_Z_EQSCALEBIAS_DESC: pass previously created cudnnTensorDescriptor_t */
    CUDNN_PARAM_BN_Z_EQSCALEBIAS_DESC = 28,       /**< BN equivalent scale/bias descriptor for Z branch. */
    /* set/get BN_Z_EQSCALE_PLACEHOLDER: pass cudnnFusedOpsPointerPlaceHolder_t* */
    CUDNN_PARAM_BN_Z_EQSCALE_PLACEHOLDER = 29,    /**< Placeholder for BN Z-branch equivalent scale pointer alignment. */
    /* set/get BN_Z_EQBIAS_PLACEHOLDER: pass cudnnFusedOpsPointerPlaceHolder_t* */
    CUDNN_PARAM_BN_Z_EQBIAS_PLACEHOLDER = 30,     /**< Placeholder for BN Z-branch equivalent bias pointer alignment. */

    /* set ACTIVATION_BITMASK_DESC: pass previously initialized cudnnTensorDescriptor_t */
    /* get ACTIVATION_BITMASK_DESC: pass previously created cudnnTensorDescriptor_t */
    CUDNN_PARAM_ACTIVATION_BITMASK_DESC = 31,      /**< Activation bitmask tensor descriptor. */
    /* set/get ACTIVATION_BITMASK_PLACEHOLDER: pass cudnnFusedOpsPointerPlaceHolder_t* */
    CUDNN_PARAM_ACTIVATION_BITMASK_PLACEHOLDER = 32, /**< Placeholder for activation bitmask pointer alignment. */

    /* set DXDESC: pass previously initialized cudnnTensorDescriptor_t */
    /* get DXDESC: pass previously created cudnnTensorDescriptor_t */
    CUDNN_PARAM_DXDESC = 33,                      /**< Input gradient tensor descriptor (dX). */
    /* set/get DXDATA_PLACEHOLDER: pass cudnnFusedOpsPointerPlaceHolder_t* */
    CUDNN_PARAM_DXDATA_PLACEHOLDER = 34,           /**< Placeholder for input gradient data pointer alignment (dX). */
    /* set DZDESC: pass previously initialized cudnnTensorDescriptor_t */
    /* get DZDESC: pass previously created cudnnTensorDescriptor_t */
    CUDNN_PARAM_DZDESC = 35,                      /**< Residual input gradient tensor descriptor (dZ). */
    /* set/get DZDATA_PLACEHOLDER: pass cudnnFusedOpsPointerPlaceHolder_t* */
    CUDNN_PARAM_DZDATA_PLACEHOLDER = 36,           /**< Placeholder for residual input gradient data pointer alignment (dZ). */
    /* set/get CUDNN_PARAM_BN_DSCALE_PLACEHOLDER: pass cudnnFusedOpsPointerPlaceHolder_t* */
    CUDNN_PARAM_BN_DSCALE_PLACEHOLDER = 37,        /**< Placeholder for BN scale gradient pointer alignment. */
    /* set/get CUDNN_PARAM_BN_DBIAS_PLACEHOLDER: pass cudnnFusedOpsPointerPlaceHolder_t* */
    CUDNN_PARAM_BN_DBIAS_PLACEHOLDER = 38,         /**< Placeholder for BN bias gradient pointer alignment. */
} cudnnFusedOpsConstParamLabel_t CUDNN_DEPRECATED;

/**
 * @brief Pointer alignment modes for fused operations.
 *
 * Specifies the alignment guarantee of pointers passed to fused operations,
 * allowing the runtime to select optimized code paths.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
typedef enum {
    CUDNN_PTR_NULL         = 0, /**< Null pointer (parameter disabled). */
    CUDNN_PTR_ELEM_ALIGNED = 1, /**< Pointer is element-aligned. */
    CUDNN_PTR_16B_ALIGNED  = 2, /**< Pointer is 16-byte aligned. */
} cudnnFusedOpsPointerPlaceHolder_t CUDNN_DEPRECATED;

/**
 * @brief Labels for variant (per-execution) parameters in a fused operations parameter pack.
 *
 * Used to identify which variant parameter to set or get in a
 * cudnnFusedOpsVariantParamPack_t. These include device memory pointers
 * and scalar host-side values.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
typedef enum {
    /* set: pass void* pointing to dev memory */
    /* get: pass void** pointing to host memory */
    CUDNN_PTR_XDATA              = 0,   /**< Pointer to input data (X) in device memory. */
    CUDNN_PTR_BN_EQSCALE         = 1,   /**< Pointer to BN equivalent scale in device memory. */
    CUDNN_PTR_BN_EQBIAS          = 2,   /**< Pointer to BN equivalent bias in device memory. */
    CUDNN_PTR_WDATA              = 3,   /**< Pointer to filter data (W) in device memory. */
    CUDNN_PTR_DWDATA             = 4,   /**< Pointer to filter gradient data (dW) in device memory. */
    CUDNN_PTR_YDATA              = 5,   /**< Pointer to output data (Y) in device memory. */
    CUDNN_PTR_DYDATA             = 6,   /**< Pointer to output gradient data (dY) in device memory. */
    CUDNN_PTR_YSUM               = 7,   /**< Pointer to Y sum accumulator in device memory. */
    CUDNN_PTR_YSQSUM             = 8,   /**< Pointer to Y squared sum accumulator in device memory. */
    CUDNN_PTR_WORKSPACE          = 9,   /**< Pointer to workspace in device memory. */
    CUDNN_PTR_BN_SCALE           = 10,  /**< Pointer to BN scale in device memory. */
    CUDNN_PTR_BN_BIAS            = 11,  /**< Pointer to BN bias in device memory. */
    CUDNN_PTR_BN_SAVED_MEAN      = 12,  /**< Pointer to BN saved mean in device memory. */
    CUDNN_PTR_BN_SAVED_INVSTD    = 13,  /**< Pointer to BN saved inverse standard deviation in device memory. */
    CUDNN_PTR_BN_RUNNING_MEAN    = 14,  /**< Pointer to BN running mean in device memory. */
    CUDNN_PTR_BN_RUNNING_VAR     = 15,  /**< Pointer to BN running variance in device memory. */
    CUDNN_PTR_ZDATA              = 16,  /**< Pointer to residual input data (Z) in device memory. */
    CUDNN_PTR_BN_Z_EQSCALE       = 17,  /**< Pointer to BN Z-branch equivalent scale in device memory. */
    CUDNN_PTR_BN_Z_EQBIAS        = 18,  /**< Pointer to BN Z-branch equivalent bias in device memory. */
    CUDNN_PTR_ACTIVATION_BITMASK = 19,  /**< Pointer to activation bitmask in device memory. */
    CUDNN_PTR_DXDATA             = 20,  /**< Pointer to input gradient data (dX) in device memory. */
    CUDNN_PTR_DZDATA             = 21,  /**< Pointer to residual input gradient data (dZ) in device memory. */
    CUDNN_PTR_BN_DSCALE          = 22,  /**< Pointer to BN scale gradient in device memory. */
    CUDNN_PTR_BN_DBIAS           = 23,  /**< Pointer to BN bias gradient in device memory. */

    /* set/get: pass size_t* pointing to host memory */
    CUDNN_SCALAR_SIZE_T_WORKSPACE_SIZE_IN_BYTES = 100, /**< Workspace size in bytes (host, size_t). */
    /* set/get: pass int64_t* pointing to host memory */
    CUDNN_SCALAR_INT64_T_BN_ACCUMULATION_COUNT = 101,  /**< BN accumulation count (host, int64_t). */
    /* set/get: pass double* pointing to host memory */
    CUDNN_SCALAR_DOUBLE_BN_EXP_AVG_FACTOR = 102,      /**< BN exponential average factor (host, double). */
    /* set/get: pass double* pointing to host memory */
    CUDNN_SCALAR_DOUBLE_BN_EPSILON = 103,              /**< BN epsilon value (host, double). */
} cudnnFusedOpsVariantParamLabel_t CUDNN_DEPRECATED;

/**
 * @brief Check the version of the cuDNN CNN library.
 *
 * Verifies that the CNN sub-library version matches the core cuDNN version.
 *
 * @return cudnnStatus_t indicating success or version mismatch.
 *
 * @since cuDNN 9.0.0
 */
cudnnStatus_t CUDNNWINAPI
cudnnCnnVersionCheck(void);

/* helper function to provide the convolution backward filter algo that fit best the requirement */

/**
 * @brief Performance results for backward filter convolution algorithm selection.
 *
 * Contains timing, memory usage, and determinism information for a given
 * backward filter convolution algorithm. Returned by algorithm search functions.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
typedef struct cudnnConvolutionBwdFilterAlgoPerfStruct {
    cudnnConvolutionBwdFilterAlgo_t algo; /**< The backward filter convolution algorithm. */
    cudnnStatus_t status;                 /**< Status returned when running this algorithm. */
    float time;                           /**< Execution time in milliseconds. */
    size_t memory;                        /**< Workspace memory required in bytes. */
    cudnnDeterminism_t determinism;       /**< Whether the algorithm is deterministic. */
    cudnnMathType_t mathType;             /**< Math type used by the algorithm. */
    int reserved[3];                      /**< Reserved for future use. */
} cudnnConvolutionBwdFilterAlgoPerf_t CUDNN_DEPRECATED;

/**
 * @brief Get the maximum number of backward filter convolution algorithms available.
 *
 * @param[in]  handle The cuDNN handle.
 * @param[out] count  Pointer to receive the maximum algorithm count.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnGetConvolutionBackwardFilterAlgorithmMaxCount(cudnnHandle_t handle, int *count);

/**
 * @brief Find the best backward filter convolution algorithm by running benchmarks.
 *
 * @param[in]  handle              The cuDNN handle.
 * @param[in]  xDesc               Descriptor for the input tensor.
 * @param[in]  dyDesc              Descriptor for the gradient output tensor.
 * @param[in]  convDesc            The convolution descriptor.
 * @param[in]  dwDesc              Descriptor for the filter gradient.
 * @param[in]  requestedAlgoCount  Maximum number of algorithms to test.
 * @param[out] returnedAlgoCount   Pointer to receive the actual number returned.
 * @param[out] perfResults         Array to receive the algorithm performance results.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnFindConvolutionBackwardFilterAlgorithm(cudnnHandle_t handle,
                                            const cudnnTensorDescriptor_t xDesc,
                                            const cudnnTensorDescriptor_t dyDesc,
                                            const cudnnConvolutionDescriptor_t convDesc,
                                            const cudnnFilterDescriptor_t dwDesc,
                                            const int requestedAlgoCount,
                                            int *returnedAlgoCount,
                                            cudnnConvolutionBwdFilterAlgoPerf_t *perfResults);

/**
 * @brief Find the best backward filter convolution algorithm with user-provided buffers.
 *
 * @param[in]  handle                The cuDNN handle.
 * @param[in]  xDesc                 Descriptor for the input tensor.
 * @param[in]  x                     Pointer to input data in device memory.
 * @param[in]  dyDesc                Descriptor for the gradient output tensor.
 * @param[in]  y                     Pointer to gradient output data in device memory.
 * @param[in]  convDesc              The convolution descriptor.
 * @param[in]  dwDesc                Descriptor for the filter gradient.
 * @param[out] dw                    Pointer to filter gradient data in device memory.
 * @param[in]  requestedAlgoCount    Maximum number of algorithms to test.
 * @param[out] returnedAlgoCount     Pointer to receive the actual number returned.
 * @param[out] perfResults           Array to receive the algorithm performance results.
 * @param[in]  workSpace             Pointer to workspace in device memory.
 * @param[in]  workSpaceSizeInBytes  Size of the workspace in bytes.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnFindConvolutionBackwardFilterAlgorithmEx(cudnnHandle_t handle,
                                              const cudnnTensorDescriptor_t xDesc,
                                              const void *x,
                                              const cudnnTensorDescriptor_t dyDesc,
                                              const void *y,
                                              const cudnnConvolutionDescriptor_t convDesc,
                                              const cudnnFilterDescriptor_t dwDesc,
                                              void *dw,
                                              const int requestedAlgoCount,
                                              int *returnedAlgoCount,
                                              cudnnConvolutionBwdFilterAlgoPerf_t *perfResults,
                                              void *workSpace,
                                              size_t workSpaceSizeInBytes);

/**
 * @brief Get backward filter convolution algorithm recommendations without executing them.
 *
 * @param[in]  handle              The cuDNN handle.
 * @param[in]  srcDesc             Descriptor for the input tensor.
 * @param[in]  diffDesc            Descriptor for the gradient output tensor.
 * @param[in]  convDesc            The convolution descriptor.
 * @param[in]  gradDesc            Descriptor for the filter gradient.
 * @param[in]  requestedAlgoCount  Maximum number of algorithms to return.
 * @param[out] returnedAlgoCount   Pointer to receive the actual number returned.
 * @param[out] perfResults         Array to receive the algorithm performance results.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnGetConvolutionBackwardFilterAlgorithm_v7(cudnnHandle_t handle,
                                              const cudnnTensorDescriptor_t srcDesc,
                                              const cudnnTensorDescriptor_t diffDesc,
                                              const cudnnConvolutionDescriptor_t convDesc,
                                              const cudnnFilterDescriptor_t gradDesc,
                                              const int requestedAlgoCount,
                                              int *returnedAlgoCount,
                                              cudnnConvolutionBwdFilterAlgoPerf_t *perfResults);

/*
 *  convolution algorithm (which requires potentially some workspace)
 */

/**
 * @brief Get the minimum workspace size required for a backward filter convolution algorithm.
 *
 * @param[in]  handle       The cuDNN handle.
 * @param[in]  xDesc        Descriptor for the input tensor.
 * @param[in]  dyDesc       Descriptor for the gradient output tensor.
 * @param[in]  convDesc     The convolution descriptor.
 * @param[in]  gradDesc     Descriptor for the filter gradient.
 * @param[in]  algo         The backward filter convolution algorithm.
 * @param[out] sizeInBytes  Pointer to receive the required workspace size.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
/* Helper function to return the minimum size of the workspace to be passed to the convolution given an algo*/
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnGetConvolutionBackwardFilterWorkspaceSize(cudnnHandle_t handle,
                                               const cudnnTensorDescriptor_t xDesc,
                                               const cudnnTensorDescriptor_t dyDesc,
                                               const cudnnConvolutionDescriptor_t convDesc,
                                               const cudnnFilterDescriptor_t gradDesc,
                                               cudnnConvolutionBwdFilterAlgo_t algo,
                                               size_t *sizeInBytes);

/**
 * @brief Execute a backward filter convolution (compute gradient with respect to filter weights).
 *
 * Computes: dw = alpha * dconv(x, dy) + beta * dw
 *
 * @param[in]     handle                The cuDNN handle.
 * @param[in]     alpha                 Pointer to scaling factor for the convolution result.
 * @param[in]     xDesc                 Descriptor for the input tensor.
 * @param[in]     x                     Pointer to input data in device memory.
 * @param[in]     dyDesc                Descriptor for the gradient output tensor.
 * @param[in]     dy                    Pointer to gradient output data in device memory.
 * @param[in]     convDesc              The convolution descriptor.
 * @param[in]     algo                  The backward filter convolution algorithm.
 * @param[in]     workSpace             Pointer to workspace in device memory.
 * @param[in]     workSpaceSizeInBytes  Size of the workspace in bytes.
 * @param[in]     beta                  Pointer to scaling factor for the prior filter gradient.
 * @param[in]     dwDesc                Descriptor for the filter gradient.
 * @param[in,out] dw                    Pointer to filter gradient data in device memory.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnConvolutionBackwardFilter(cudnnHandle_t handle,
                               const void *alpha,
                               const cudnnTensorDescriptor_t xDesc,
                               const void *x,
                               const cudnnTensorDescriptor_t dyDesc,
                               const void *dy,
                               const cudnnConvolutionDescriptor_t convDesc,
                               cudnnConvolutionBwdFilterAlgo_t algo,
                               void *workSpace,
                               size_t workSpaceSizeInBytes,
                               const void *beta,
                               const cudnnFilterDescriptor_t dwDesc,
                               void *dw);

/**
 * @brief Compute the bias gradient for batch convolution.
 *
 * Computes: db = alpha * sum(dy) + beta * db, where the sum is over spatial dimensions and batch.
 *
 * @param[in]     handle The cuDNN handle.
 * @param[in]     alpha  Pointer to scaling factor for the bias gradient result.
 * @param[in]     dyDesc Descriptor for the gradient output tensor.
 * @param[in]     dy     Pointer to gradient output data in device memory.
 * @param[in]     beta   Pointer to scaling factor for the prior bias gradient.
 * @param[in]     dbDesc Descriptor for the bias gradient tensor.
 * @param[in,out] db     Pointer to bias gradient data in device memory.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
/* Function to compute the bias gradient for batch convolution */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnConvolutionBackwardBias(cudnnHandle_t handle,
                             const void *alpha,
                             const cudnnTensorDescriptor_t dyDesc,
                             const void *dy,
                             const void *beta,
                             const cudnnTensorDescriptor_t dbDesc,
                             void *db);

/**
 * @brief Create a fused operations constant parameter pack.
 *
 * @param[out] constPack Pointer to receive the newly created constant parameter pack.
 * @param[in]  ops       The fused operation type.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnCreateFusedOpsConstParamPack(cudnnFusedOpsConstParamPack_t *constPack, cudnnFusedOps_t ops);

/**
 * @brief Destroy a fused operations constant parameter pack.
 *
 * @param[in] constPack The constant parameter pack to destroy.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnDestroyFusedOpsConstParamPack(cudnnFusedOpsConstParamPack_t constPack);

/**
 * @brief Set an attribute on a fused operations constant parameter pack.
 *
 * @param[in,out] constPack  The constant parameter pack.
 * @param[in]     paramLabel The label identifying which parameter to set.
 * @param[in]     param      Pointer to the parameter value.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnSetFusedOpsConstParamPackAttribute(cudnnFusedOpsConstParamPack_t constPack,
                                        cudnnFusedOpsConstParamLabel_t paramLabel,
                                        const void *param);

/**
 * @brief Get an attribute from a fused operations constant parameter pack.
 *
 * @param[in]  constPack  The constant parameter pack.
 * @param[in]  paramLabel The label identifying which parameter to get.
 * @param[out] param      Pointer to receive the parameter value.
 * @param[out] isNULL     Pointer to receive whether the parameter is NULL.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnGetFusedOpsConstParamPackAttribute(const cudnnFusedOpsConstParamPack_t constPack,
                                        cudnnFusedOpsConstParamLabel_t paramLabel,
                                        void *param,
                                        int *isNULL);

/**
 * @brief Create a fused operations variant parameter pack.
 *
 * @param[out] varPack Pointer to receive the newly created variant parameter pack.
 * @param[in]  ops     The fused operation type.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnCreateFusedOpsVariantParamPack(cudnnFusedOpsVariantParamPack_t *varPack, cudnnFusedOps_t ops);

/**
 * @brief Destroy a fused operations variant parameter pack.
 *
 * @param[in] varPack The variant parameter pack to destroy.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnDestroyFusedOpsVariantParamPack(cudnnFusedOpsVariantParamPack_t varPack);

/**
 * @brief Set an attribute on a fused operations variant parameter pack.
 *
 * @param[in,out] varPack    The variant parameter pack.
 * @param[in]     paramLabel The label identifying which parameter to set.
 * @param[in]     ptr        Pointer to the parameter value.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnSetFusedOpsVariantParamPackAttribute(cudnnFusedOpsVariantParamPack_t varPack,
                                          cudnnFusedOpsVariantParamLabel_t paramLabel,
                                          void *ptr);

/**
 * @brief Get an attribute from a fused operations variant parameter pack.
 *
 * @param[in]  varPack    The variant parameter pack.
 * @param[in]  paramLabel The label identifying which parameter to get.
 * @param[out] ptr        Pointer to receive the parameter value.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnGetFusedOpsVariantParamPackAttribute(const cudnnFusedOpsVariantParamPack_t varPack,
                                          cudnnFusedOpsVariantParamLabel_t paramLabel,
                                          void *ptr);

/**
 * @brief Create a fused operations execution plan.
 *
 * @param[out] plan Pointer to receive the newly created fused operations plan.
 * @param[in]  ops  The fused operation type.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnCreateFusedOpsPlan(cudnnFusedOpsPlan_t *plan, cudnnFusedOps_t ops);

/**
 * @brief Destroy a fused operations execution plan.
 *
 * @param[in] plan The fused operations plan to destroy.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnDestroyFusedOpsPlan(cudnnFusedOpsPlan_t plan);

/**
 * @brief Build a fused operations execution plan from constant parameters.
 *
 * Compiles the plan and returns the required workspace size.
 *
 * @param[in]     handle               The cuDNN handle.
 * @param[in,out] plan                 The fused operations plan to build.
 * @param[in]     constPack            The constant parameter pack with descriptors.
 * @param[out]    workspaceSizeInBytes Pointer to receive the required workspace size.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnMakeFusedOpsPlan(cudnnHandle_t handle,
                      cudnnFusedOpsPlan_t plan,
                      const cudnnFusedOpsConstParamPack_t constPack,
                      size_t *workspaceSizeInBytes);

/**
 * @brief Execute a fused operations plan.
 *
 * @param[in] handle  The cuDNN handle.
 * @param[in] plan    The fused operations plan to execute.
 * @param[in] varPack The variant parameter pack with data pointers and scalar values.
 * @return cudnnStatus_t indicating success or failure.
 *
 * @deprecated Since cuDNN 9.0.0. Use graph API instead.
 * @since cuDNN 9.0.0
 */
CUDNN_DEPRECATED cudnnStatus_t CUDNNWINAPI
cudnnFusedOpsExecute(cudnnHandle_t handle, const cudnnFusedOpsPlan_t plan, cudnnFusedOpsVariantParamPack_t varPack);

#if defined(__cplusplus)
}
#endif

#endif /* CUDNN_CNN_H_ */
