pythoncupycudnnuv

Error: cupy_backends.cuda.libs.cudnn.CuDNNError: cuDNN Error: CUDNN_STATUS_NOT_SUPPORTED


I am trying to run CuDNN via CuPy but is experiencing the above mentioned error. How do I resolve this error? I have tried to check that all my args and kwargs are correct but still could not figure a way to overcome this issue.

Nvidia GPU used has a compute capability of 3.0 and the linux os is installed with it highest compatible CUDA toolkit version of 11.4. To use this cuda-11.4, python version not higher than version 3.10 has to be used.

How I set up this cupy_cuda114 project and run the python file:

$ uv init cupy_cuda114_py310 --python 3.10
Initialized project `cupy-cuda114-py310` at `/home/user/cupy_cuda114_py310`
$ cd cupy_cuda114_py310/
$ uv run python --version
Using CPython 3.10.16
Creating virtual environment at: .venv
Python 3.10.16
$ uv add cupy-cuda114
Resolved 4 packages in 397ms
Installed 3 packages in 46ms
 + cupy-cuda114==10.6.0
 + fastrlock==0.8.3
 + numpy==1.24.4
$ uv run python -m cupyx.tools.install_library --cuda 11.4 --library cudnn
$ echo $CUDA_PATH 
/usr/local/cuda-11.4
$ sudo cp ~/.cupy/cuda_lib/11.4/cudnn/8.4.0/include/cudnn.h $CUDA_PATH/include
$ sudo cp ~/.cupy/cuda_lib/11.4/cudnn/8.4.0/lib/libcudnn.so* $CUDA_PATH/lib64
$ uv run python cudnn_hello_world.py

cudnn_hello_world.py:

import cupy as cp
import cupy.cuda.cudnn as cudnn

print(dir(cudnn))
print(cp.__version__)
print(cp.cuda.runtime.runtimeGetVersion())
print(cp.cuda.cudnn.getVersion())


def conv2d_cupy_cuda_cudnn(input2d: cp.ndarray, kernel2d: cp.ndarray, bias: cp.ndarray,
                           pad: int = 1, stride: int =1):
    # Ensure input is a 2D array
    if input2d.ndim != 2 or kernel2d.ndim != 2 or bias.ndim != 1:
        raise ValueError("input2d, kernel2d, and bias must be 2D, 2D, and 1D respectively.")

    # Reshape input and kernel to match cuDNN's 4D tensor format
    input_tensor = input2d[cp.newaxis, cp.newaxis, :, :]
    filter_tensor = kernel2d[cp.newaxis, cp.newaxis, :, :]
    bias_tensor = bias

    # Initialize cuDNN
    handle = cudnn.create()

    # Define the input and filter tensor descriptors
    print(f"{cudnn.createTensorDescriptor.__doc__=}")
    print(f"{cudnn.createFilterDescriptor.__doc__=}")
    input_desc = cudnn.createTensorDescriptor()
    filter_desc = cudnn.createFilterDescriptor()
    output_desc = cudnn.createTensorDescriptor()
    n, c, h, w = input_tensor.shape
    k, _, kh, kw = filter_tensor.shape
    print(f"{n=}, {c=}, {h=}, {w=}")
    print(f"{k=}, {kh=}, {kw=}")
    print(f"{cudnn.setTensor4dDescriptor.__doc__=}")
    cudnn.setTensor4dDescriptor(
        input_desc,
        cudnn.CUDNN_TENSOR_NCHW,
        cudnn.CUDNN_DATA_FLOAT,
        n, c, h, w
    )
    print(f"{cudnn.setFilter4dDescriptor_v4.__doc__=}")
    cudnn.setFilter4dDescriptor_v4(
        filter_desc,
        cudnn.CUDNN_DATA_FLOAT,
        cudnn.CUDNN_TENSOR_NCHW,
        k, c, kh, kw
    )
    print(f"{cudnn.CUDNN_TENSOR_NCHW.__doc__=}")
    print(f"{cudnn.CUDNN_DATA_FLOAT.__doc__=}")

    # Define the convolution descriptor
    conv_desc = cudnn.createConvolutionDescriptor()
    print(f"{cudnn.setConvolution2dDescriptor_v4.__doc__=}")
    print(f"{cudnn.CUDNN_CONVOLUTION.__doc__=}")
    cudnn.setConvolution2dDescriptor_v4(
        conv_desc,
        pad_h=pad,
        pad_w=pad,
        u=stride,
        v=stride,
        dilation_h=1,
        dilation_w=1,
        mode=cudnn.CUDNN_CONVOLUTION
        # compute_type=cudnn.CUDNN_DATA_FLOAT,
    )

    # Calculate output dimensions
    print(f"{cudnn.getConvolution2dForwardOutputDim.__doc__=}")
    n, c, h, w = cudnn.getConvolution2dForwardOutputDim(
        conv_desc,
        input_desc,
        filter_desc,)
    print(f"{n=}, {c=}, {h=}, {w=}")
    output_tensor = cp.empty((n, c, h, w), dtype=cp.float32)

    # Set the output tensor descriptor
    cudnn.setTensor4dDescriptor(
        output_desc,
        cudnn.CUDNN_TENSOR_NCHW,
        cudnn.CUDNN_DATA_FLOAT,
        n, c, h, w
    )

    return output_tensor[0, 0, :, :]


input2d = cp.array(
    [
        [0.0, 1.0, 2.0, 3.0],
        [4.0, 5.0, 0.0, 7.0],
        [4.0, 0.0, 6.0, 7.0],
        [0.0, 1.0, 2.0, 3.0],
    ],
    dtype=cp.float32,
)
kernel2d = cp.array(
    [[-3.0, -2.0, 1.0], [0.0, 1.0, 2.0], [-3.0, 0.0, 1.0]], dtype=cp.float32
)
bias = cp.array([2.0], dtype=cp.float32)
pad = 1
stride = 1

# 2D Convolution with padding
print(f"{conv2d_cupy_cuda_cudnn.__name__}")
cudnn_output2d = conv2d_cupy_cuda_cudnn(input2d, kernel2d, bias, pad, stride)
print(f"{cudnn_output2d}, shape is {cudnn_output2d.shape}")

Output:

['CTCLoss', 'CUDNN_16BIT_INDICES', 'CUDNN_32BIT_INDICES', 'CUDNN_64BIT_INDICES', 'CUDNN_8BIT_INDICES', 'CUDNN_ACTIVATION_CLIPPED_RELU', 'CUDNN_ACTIVATION_ELU', 'CUDNN_ACTIVATION_IDENTITY', 'CUDNN_ACTIVATION_RELU', 'CUDNN_ACTIVATION_SIGMOID', 'CUDNN_ACTIVATION_TANH', 'CUDNN_ADD_FEATURE_MAP', 'CUDNN_ADD_FULL_TENSOR', 'CUDNN_ADD_IMAGE', 'CUDNN_ADD_SAME_C', 'CUDNN_ADD_SAME_CHW', 'CUDNN_ADD_SAME_HW', 'CUDNN_BATCHNORM_OPS_BN', 'CUDNN_BATCHNORM_OPS_BN_ACTIVATION', 'CUDNN_BATCHNORM_OPS_BN_ADD_ACTIVATION', 'CUDNN_BATCHNORM_PER_ACTIVATION', 'CUDNN_BATCHNORM_SPATIAL', 'CUDNN_BATCHNORM_SPATIAL_PERSISTENT', 'CUDNN_BIDIRECTIONAL', 'CUDNN_BN_MIN_EPSILON', 'CUDNN_CONVOLUTION', 'CUDNN_CONVOLUTION_BWD_DATA_ALGO_0', 'CUDNN_CONVOLUTION_BWD_DATA_ALGO_1', 'CUDNN_CONVOLUTION_BWD_DATA_ALGO_FFT', 'CUDNN_CONVOLUTION_BWD_DATA_ALGO_FFT_TILING', 'CUDNN_CONVOLUTION_BWD_DATA_ALGO_WINOGRAD', 'CUDNN_CONVOLUTION_BWD_DATA_ALGO_WINOGRAD_NONFUSED', 'CUDNN_CONVOLUTION_BWD_DATA_NO_WORKSPACE', 'CUDNN_CONVOLUTION_BWD_DATA_PREFER_FASTEST', 'CUDNN_CONVOLUTION_BWD_DATA_SPECIFY_WORKSPACE_LIMIT', 'CUDNN_CONVOLUTION_BWD_FILTER_ALGO_0', 'CUDNN_CONVOLUTION_BWD_FILTER_ALGO_1', 'CUDNN_CONVOLUTION_BWD_FILTER_ALGO_3', 'CUDNN_CONVOLUTION_BWD_FILTER_ALGO_FFT', 'CUDNN_CONVOLUTION_BWD_FILTER_ALGO_WINOGRAD', 'CUDNN_CONVOLUTION_BWD_FILTER_ALGO_WINOGRAD_NONFUSED', 'CUDNN_CONVOLUTION_BWD_FILTER_NO_WORKSPACE', 'CUDNN_CONVOLUTION_BWD_FILTER_PREFER_FASTEST', 'CUDNN_CONVOLUTION_BWD_FILTER_SPECIFY_WORKSPACE_LIMIT', 'CUDNN_CONVOLUTION_FWD_ALGO_DIRECT', 'CUDNN_CONVOLUTION_FWD_ALGO_FFT', 'CUDNN_CONVOLUTION_FWD_ALGO_FFT_TILING', 'CUDNN_CONVOLUTION_FWD_ALGO_GEMM', 'CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_GEMM', 'CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM', 'CUDNN_CONVOLUTION_FWD_ALGO_WINOGRAD', 'CUDNN_CONVOLUTION_FWD_ALGO_WINOGRAD_NONFUSED', 'CUDNN_CONVOLUTION_FWD_NO_WORKSPACE', 'CUDNN_CONVOLUTION_FWD_PREFER_FASTEST', 'CUDNN_CONVOLUTION_FWD_SPECIFY_WORKSPACE_LIMIT', 'CUDNN_CROSS_CORRELATION', 'CUDNN_CTC_LOSS_ALGO_DETERMINISTIC', 'CUDNN_CTC_LOSS_ALGO_NON_DETERMINISTIC', 'CUDNN_DATA_DOUBLE', 'CUDNN_DATA_FLOAT', 'CUDNN_DATA_HALF', 'CUDNN_DEFAULT_MATH', 'CUDNN_DETERMINISTIC', 'CUDNN_DIVNORM_PRECOMPUTED_MEANS', 'CUDNN_ERRQUERY_BLOCKING', 'CUDNN_ERRQUERY_NONBLOCKING', 'CUDNN_ERRQUERY_RAWCODE', 'CUDNN_FUSED_BN_FINALIZE_STATISTICS_INFERENCE', 'CUDNN_FUSED_BN_FINALIZE_STATISTICS_TRAINING', 'CUDNN_FUSED_CONV_SCALE_BIAS_ADD_ACTIVATION', 'CUDNN_FUSED_DACTIVATION_FORK_DBATCHNORM', 'CUDNN_FUSED_SCALE_BIAS_ACTIVATION_CONV_BNSTATS', 'CUDNN_FUSED_SCALE_BIAS_ACTIVATION_WGRAD', 'CUDNN_FUSED_SCALE_BIAS_ADD_ACTIVATION_GEN_BITMASK', 'CUDNN_GRU', 'CUDNN_LINEAR_INPUT', 'CUDNN_LRN_CROSS_CHANNEL_DIM1', 'CUDNN_LSTM', 'CUDNN_NON_DETERMINISTIC', 'CUDNN_NOT_PROPAGATE_NAN', 'CUDNN_OP_TENSOR_ADD', 'CUDNN_OP_TENSOR_MAX', 'CUDNN_OP_TENSOR_MIN', 'CUDNN_OP_TENSOR_MUL', 'CUDNN_OP_TENSOR_NOT', 'CUDNN_OP_TENSOR_SQRT', 'CUDNN_PARAM_ACTIVATION_BITMASK_DESC', 'CUDNN_PARAM_ACTIVATION_BITMASK_PLACEHOLDER', 'CUDNN_PARAM_ACTIVATION_DESC', 'CUDNN_PARAM_BN_BIAS_PLACEHOLDER', 'CUDNN_PARAM_BN_DBIAS_PLACEHOLDER', 'CUDNN_PARAM_BN_DSCALE_PLACEHOLDER', 'CUDNN_PARAM_BN_EQBIAS_PLACEHOLDER', 'CUDNN_PARAM_BN_EQSCALEBIAS_DESC', 'CUDNN_PARAM_BN_EQSCALE_PLACEHOLDER', 'CUDNN_PARAM_BN_MODE', 'CUDNN_PARAM_BN_RUNNING_MEAN_PLACEHOLDER', 'CUDNN_PARAM_BN_RUNNING_VAR_PLACEHOLDER', 'CUDNN_PARAM_BN_SAVED_INVSTD_PLACEHOLDER', 'CUDNN_PARAM_BN_SAVED_MEAN_PLACEHOLDER', 'CUDNN_PARAM_BN_SCALEBIAS_MEANVAR_DESC', 'CUDNN_PARAM_BN_SCALE_PLACEHOLDER', 'CUDNN_PARAM_BN_Z_EQBIAS_PLACEHOLDER', 'CUDNN_PARAM_BN_Z_EQSCALEBIAS_DESC', 'CUDNN_PARAM_BN_Z_EQSCALE_PLACEHOLDER', 'CUDNN_PARAM_CONV_DESC', 'CUDNN_PARAM_DWDATA_PLACEHOLDER', 'CUDNN_PARAM_DWDESC', 'CUDNN_PARAM_DXDATA_PLACEHOLDER', 'CUDNN_PARAM_DXDESC', 'CUDNN_PARAM_DYDATA_PLACEHOLDER', 'CUDNN_PARAM_DYDESC', 'CUDNN_PARAM_DZDATA_PLACEHOLDER', 'CUDNN_PARAM_DZDESC', 'CUDNN_PARAM_WDATA_PLACEHOLDER', 'CUDNN_PARAM_WDESC', 'CUDNN_PARAM_XDATA_PLACEHOLDER', 'CUDNN_PARAM_XDESC', 'CUDNN_PARAM_YDATA_PLACEHOLDER', 'CUDNN_PARAM_YDESC', 'CUDNN_PARAM_YSQSUM_PLACEHOLDER', 'CUDNN_PARAM_YSTATS_DESC', 'CUDNN_PARAM_YSUM_PLACEHOLDER', 'CUDNN_PARAM_ZDATA_PLACEHOLDER', 'CUDNN_PARAM_ZDESC', 'CUDNN_POOLING_AVERAGE_COUNT_EXCLUDE_PADDING', 'CUDNN_POOLING_AVERAGE_COUNT_INCLUDE_PADDING', 'CUDNN_POOLING_MAX', 'CUDNN_POOLING_MAX_DETERMINISTIC', 'CUDNN_PROPAGATE_NAN', 'CUDNN_PTR_16B_ALIGNED', 'CUDNN_PTR_ACTIVATION_BITMASK', 'CUDNN_PTR_BN_BIAS', 'CUDNN_PTR_BN_DBIAS', 'CUDNN_PTR_BN_DSCALE', 'CUDNN_PTR_BN_EQBIAS', 'CUDNN_PTR_BN_EQSCALE', 'CUDNN_PTR_BN_RUNNING_MEAN', 'CUDNN_PTR_BN_RUNNING_VAR', 'CUDNN_PTR_BN_SAVED_INVSTD', 'CUDNN_PTR_BN_SAVED_MEAN', 'CUDNN_PTR_BN_SCALE', 'CUDNN_PTR_BN_Z_EQBIAS', 'CUDNN_PTR_BN_Z_EQSCALE', 'CUDNN_PTR_DWDATA', 'CUDNN_PTR_DXDATA', 'CUDNN_PTR_DYDATA', 'CUDNN_PTR_DZDATA', 'CUDNN_PTR_ELEM_ALIGNED', 'CUDNN_PTR_NULL', 'CUDNN_PTR_WDATA', 'CUDNN_PTR_WORKSPACE', 'CUDNN_PTR_XDATA', 'CUDNN_PTR_YDATA', 'CUDNN_PTR_YSQSUM', 'CUDNN_PTR_YSUM', 'CUDNN_PTR_ZDATA', 'CUDNN_REDUCE_TENSOR_ADD', 'CUDNN_REDUCE_TENSOR_AMAX', 'CUDNN_REDUCE_TENSOR_AVG', 'CUDNN_REDUCE_TENSOR_FLATTENED_INDICES', 'CUDNN_REDUCE_TENSOR_MAX', 'CUDNN_REDUCE_TENSOR_MIN', 'CUDNN_REDUCE_TENSOR_MUL', 'CUDNN_REDUCE_TENSOR_MUL_NO_ZEROS', 'CUDNN_REDUCE_TENSOR_NORM1', 'CUDNN_REDUCE_TENSOR_NORM2', 'CUDNN_REDUCE_TENSOR_NO_INDICES', 'CUDNN_RNN_ALGO_PERSIST_DYNAMIC', 'CUDNN_RNN_ALGO_PERSIST_STATIC', 'CUDNN_RNN_ALGO_STANDARD', 'CUDNN_RNN_DATA_LAYOUT_BATCH_MAJOR_UNPACKED', 'CUDNN_RNN_DATA_LAYOUT_SEQ_MAJOR_PACKED', 'CUDNN_RNN_DATA_LAYOUT_SEQ_MAJOR_UNPACKED', 'CUDNN_RNN_PADDED_IO_DISABLED', 'CUDNN_RNN_PADDED_IO_ENABLED', 'CUDNN_RNN_RELU', 'CUDNN_RNN_TANH', 'CUDNN_SAMPLER_BILINEAR', 'CUDNN_SCALAR_DOUBLE_BN_EPSILON', 'CUDNN_SCALAR_DOUBLE_BN_EXP_AVG_FACTOR', 'CUDNN_SCALAR_INT64_T_BN_ACCUMULATION_COUNT', 'CUDNN_SCALAR_SIZE_T_WORKSPACE_SIZE_IN_BYTES', 'CUDNN_SKIP_INPUT', 'CUDNN_SOFTMAX_ACCURATE', 'CUDNN_SOFTMAX_FAST', 'CUDNN_SOFTMAX_LOG', 'CUDNN_SOFTMAX_MODE_CHANNEL', 'CUDNN_SOFTMAX_MODE_INSTANCE', 'CUDNN_STATUS_RUNTIME_FP_OVERFLOW', 'CUDNN_STATUS_RUNTIME_IN_PROGRESS', 'CUDNN_STATUS_RUNTIME_PREREQUISITE_MISSING', 'CUDNN_STATUS_SUCCESS', 'CUDNN_TENSOR_NCHW', 'CUDNN_TENSOR_NHWC', 'CUDNN_TENSOR_OP_MATH', 'CUDNN_UNIDIRECTIONAL', 'CuDNNAlgoPerf', 'CuDNNError', 'RNNBackwardData', 'RNNBackwardDataEx', 'RNNBackwardWeights', 'RNNBackwardWeightsEx', 'RNNForwardInference', 'RNNForwardInferenceEx', 'RNNForwardTraining', 'RNNForwardTrainingEx', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_environment', 'activationBackward_v4', 'activationForward_v4', 'addTensor_v3', 'available', 'batchNormalizationBackward', 'batchNormalizationBackwardEx', 'batchNormalizationForwardInference', 'batchNormalizationForwardTraining', 'batchNormalizationForwardTrainingEx', 'check_status', 'convolutionBackwardBias', 'convolutionBackwardData_v3', 'convolutionBackwardFilter_v3', 'convolutionForward', 'create', 'createActivationDescriptor', 'createCTCLossDescriptor', 'createConvolutionDescriptor', 'createDropoutDescriptor', 'createFilterDescriptor', 'createFusedOpsConstParamPack', 'createFusedOpsPlan', 'createFusedOpsVariantParamPack', 'createOpTensorDescriptor', 'createPersistentRNNPlan', 'createPoolingDescriptor', 'createRNNDataDescriptor', 'createRNNDescriptor', 'createReduceTensorDescriptor', 'createSpatialTransformerDescriptor', 'createTensorDescriptor', 'deriveBNTensorDescriptor', 'destroy', 'destroyActivationDescriptor', 'destroyCTCLossDescriptor', 'destroyConvolutionDescriptor', 'destroyDropoutDescriptor', 'destroyFilterDescriptor', 'destroyFusedOpsConstParamPack', 'destroyFusedOpsPlan', 'destroyFusedOpsVariantParamPack', 'destroyOpTensorDescriptor', 'destroyPersistentRNNPlan', 'destroyPoolingDescriptor', 'destroyRNNDataDescriptor', 'destroyRNNDescriptor', 'destroyReduceTensorDescriptor', 'destroySpatialTransformerDescriptor', 'destroyTensorDescriptor', 'dropoutBackward', 'dropoutForward', 'dropoutGetStatesSize', 'findConvolutionBackwardDataAlgorithm', 'findConvolutionBackwardDataAlgorithmEx', 'findConvolutionBackwardDataAlgorithmEx_v7', 'findConvolutionBackwardFilterAlgorithm', 'findConvolutionBackwardFilterAlgorithmEx', 'findConvolutionBackwardFilterAlgorithmEx_v7', 'findConvolutionForwardAlgorithm', 'findConvolutionForwardAlgorithmEx', 'findConvolutionForwardAlgorithmEx_v7', 'fusedOpsExecute', 'getBatchNormalizationBackwardExWorkspaceSize', 'getBatchNormalizationForwardTrainingExWorkspaceSize', 'getBatchNormalizationTrainingExReserveSpaceSize', 'getCTCLossDescriptor', 'getCTCLossWorkspaceSize', 'getConvolutionBackwardDataAlgorithm_v6', 'getConvolutionBackwardDataAlgorithm_v7', 'getConvolutionBackwardDataWorkspaceSize', 'getConvolutionBackwardFilterAlgorithm_v6', 'getConvolutionBackwardFilterAlgorithm_v7', 'getConvolutionBackwardFilterWorkspaceSize', 'getConvolutionForwardAlgorithm_v6', 'getConvolutionForwardAlgorithm_v7', 'getConvolutionForwardWorkspaceSize', 'getConvolutionGroupCount', 'getConvolutionMathType', 'getDropoutReserveSpaceSize', 'getFilterNdDescriptor', 'getFusedOpsConstParamPackAttribute', 'getFusedOpsVariantParamPackAttribute', 'getOpTensorDescriptor', 'getRNNDataDescriptor', 'getRNNLinLayerBiasParams', 'getRNNLinLayerMatrixParams', 'getRNNPaddingMode', 'getRNNParamsSize', 'getRNNTrainingReserveSize', 'getRNNWorkspaceSize', 'getReduceTensorDescriptor', 'getReductionIndicesSize', 'getReductionWorkspaceSize', 'getStream', 'getTensor4dDescriptor', 'getVersion', 'get_build_version', 'makeFusedOpsPlan', 'opTensor', 'poolingBackward', 'poolingForward', 'queryRuntimeError', 'reduceTensor', 'scaleTensor', 'setActivationDescriptor', 'setCTCLossDescriptor', 'setConvolution2dDescriptor_v4', 'setConvolution2dDescriptor_v5', 'setConvolutionGroupCount', 'setConvolutionMathType', 'setConvolutionNdDescriptor_v3', 'setDropoutDescriptor', 'setFilter4dDescriptor_v4', 'setFilterNdDescriptor_v4', 'setFusedOpsConstParamPackAttribute', 'setFusedOpsVariantParamPackAttribute', 'setOpTensorDescriptor', 'setPersistentRNNPlan', 'setPooling2dDescriptor_v4', 'setPoolingNdDescriptor_v4', 'setRNNDataDescriptor', 'setRNNDescriptor_v5', 'setRNNDescriptor_v6', 'setRNNPaddingMode', 'setReduceTensorDescriptor', 'setSpatialTransformerDescriptor', 'setStream', 'setTensor', 'setTensor4dDescriptor', 'setTensor4dDescriptorEx', 'setTensorNdDescriptor', 'softmaxBackward', 'softmaxForward', 'spatialTfGridGeneratorBackward', 'spatialTfGridGeneratorForward', 'spatialTfSamplerBackward', 'spatialTfSamplerForward']
10.6.0
11040
8400
conv2d_cupy_cuda_cudnn
cudnn.createTensorDescriptor.__doc__='createTensorDescriptor() -> size_t'
cudnn.createFilterDescriptor.__doc__='createFilterDescriptor() -> size_t'
n=1, c=1, h=4, w=4
k=1, kh=3, kw=3
cudnn.setTensor4dDescriptor.__doc__='setTensor4dDescriptor(size_t tensorDesc, int format, int dataType, int n, int c, int h, int w)'
cudnn.setFilter4dDescriptor_v4.__doc__='setFilter4dDescriptor_v4(size_t filterDesc, int dataType, int format, int k, int c, int h, int w)'
cudnn.CUDNN_TENSOR_NCHW.__doc__="int([x]) -> integer\nint(x, base=10) -> integer\n\nConvert a number or string to an integer, or return 0 if no arguments\nare given.  If x is a number, return x.__int__().  For floating point\nnumbers, this truncates towards zero.\n\nIf x is not a number or if base is given, then x must be a string,\nbytes, or bytearray instance representing an integer literal in the\ngiven base.  The literal can be preceded by '+' or '-' and be surrounded\nby whitespace.  The base defaults to 10.  Valid bases are 0 and 2-36.\nBase 0 means to interpret the base from the string as an integer literal.\n>>> int('0b100', base=0)\n4"
cudnn.CUDNN_DATA_FLOAT.__doc__="int([x]) -> integer\nint(x, base=10) -> integer\n\nConvert a number or string to an integer, or return 0 if no arguments\nare given.  If x is a number, return x.__int__().  For floating point\nnumbers, this truncates towards zero.\n\nIf x is not a number or if base is given, then x must be a string,\nbytes, or bytearray instance representing an integer literal in the\ngiven base.  The literal can be preceded by '+' or '-' and be surrounded\nby whitespace.  The base defaults to 10.  Valid bases are 0 and 2-36.\nBase 0 means to interpret the base from the string as an integer literal.\n>>> int('0b100', base=0)\n4"
cudnn.setConvolution2dDescriptor_v4.__doc__='setConvolution2dDescriptor_v4(size_t convDesc, int pad_h, int pad_w, int u, int v, int dilation_h, int dilation_w, int mode)'
cudnn.CUDNN_CONVOLUTION.__doc__="int([x]) -> integer\nint(x, base=10) -> integer\n\nConvert a number or string to an integer, or return 0 if no arguments\nare given.  If x is a number, return x.__int__().  For floating point\nnumbers, this truncates towards zero.\n\nIf x is not a number or if base is given, then x must be a string,\nbytes, or bytearray instance representing an integer literal in the\ngiven base.  The literal can be preceded by '+' or '-' and be surrounded\nby whitespace.  The base defaults to 10.  Valid bases are 0 and 2-36.\nBase 0 means to interpret the base from the string as an integer literal.\n>>> int('0b100', base=0)\n4"
Traceback (most recent call last):
  File "/home/usr/cudnn_hello_world.py", line 152, in <module>
    cudnn_output2d = conv2d_cupy_cuda_cudnn(input2d, kernel2d, bias, pad, stride)
  File "/home/usr/cudnn_hello_world.py", line 55, in conv2d_cupy_cuda_cudnn
    cudnn.setConvolution2dDescriptor_v4(
  File "cupy_backends/cuda/libs/cudnn.pyx", line 1141, in cupy_backends.cuda.libs.cudnn.setConvolution2dDescriptor_v4
  File "cupy_backends/cuda/libs/cudnn.pyx", line 1147, in cupy_backends.cuda.libs.cudnn.setConvolution2dDescriptor_v4
  File "cupy_backends/cuda/libs/cudnn.pyx", line 785, in cupy_backends.cuda.libs.cudnn.check_status
cupy_backends.cuda.libs.cudnn.CuDNNError: cuDNN Error: CUDNN_STATUS_NOT_SUPPORTED

I have also created a cudnn_debug.log file and then reran the python script:

$ export CUDNN_LOGDEST_DBG=cudnn_debug.log
$ export CUDNN_LOGINFO_DBG=1
$ uv run python cudnn_hello_world.py

The log msgs are :

I! CuDNN (v8400) function cudnnGetVersion() called:
i! Time: 2025-04-17T15:49:42.409117 (0d+0h+0m+0s since start)
i! Process=556373; Thread=556373; GPU=NULL; Handle=NULL; StreamId=NULL.


I! CuDNN (v8400) function cudnnCreate() called:
i!     handle: location=host; addr=0x7ffce7708b78;
i! Time: 2025-04-17T15:49:42.640970 (0d+0h+0m+0s since start)
i! Process=556373; Thread=556373; GPU=NULL; Handle=NULL; StreamId=NULL.


I! CuDNN (v8400) function cudnnCreateTensorDescriptor() called:
i! Time: 2025-04-17T15:49:43.031841 (0d+0h+0m+1s since start)
i! Process=556373; Thread=556373; GPU=NULL; Handle=NULL; StreamId=NULL.


I! CuDNN (v8400) function cudnnCreateFilterDescriptor() called:
i! Time: 2025-04-17T15:49:43.031887 (0d+0h+0m+1s since start)
i! Process=556373; Thread=556373; GPU=NULL; Handle=NULL; StreamId=NULL.


I! CuDNN (v8400) function cudnnCreateTensorDescriptor() called:
i! Time: 2025-04-17T15:49:43.031897 (0d+0h+0m+1s since start)
i! Process=556373; Thread=556373; GPU=NULL; Handle=NULL; StreamId=NULL.


I! CuDNN (v8400) function cudnnSetTensor4dDescriptor() called:
i!     format: type=cudnnTensorFormat_t; val=CUDNN_TENSOR_NCHW (0);
i!     dataType: type=cudnnDataType_t; val=CUDNN_DATA_FLOAT (0);
i!     n: type=int; val=1;
i!     c: type=int; val=1;
i!     h: type=int; val=4;
i!     w: type=int; val=4;
i! Time: 2025-04-17T15:49:43.031941 (0d+0h+0m+1s since start)
i! Process=556373; Thread=556373; GPU=NULL; Handle=NULL; StreamId=NULL.


I! CuDNN (v8400) function cudnnSetTensor4dDescriptorEx() called:
i!     dataType: type=cudnnDataType_t; val=CUDNN_DATA_FLOAT (0);
i!     n: type=int; val=1;
i!     c: type=int; val=1;
i!     h: type=int; val=4;
i!     w: type=int; val=4;
i!     nStride: type=int; val=16;
i!     cStride: type=int; val=16;
i!     hStride: type=int; val=4;
i!     wStride: type=int; val=1;
i! Time: 2025-04-17T15:49:43.031952 (0d+0h+0m+1s since start)
i! Process=556373; Thread=556373; GPU=NULL; Handle=NULL; StreamId=NULL.


I! CuDNN (v8400) function cudnnSetFilter4dDescriptor() called:
i!     dataType: type=cudnnDataType_t; val=CUDNN_DATA_FLOAT (0);
i!     format: type=cudnnTensorFormat_t; val=CUDNN_TENSOR_NCHW (0);
i!     k: type=int; val=1;
i!     c: type=int; val=1;
i!     h: type=int; val=3;
i!     w: type=int; val=3;
i! Time: 2025-04-17T15:49:43.031978 (0d+0h+0m+1s since start)
i! Process=556373; Thread=556373; GPU=NULL; Handle=NULL; StreamId=NULL.


I! CuDNN (v8400) function cudnnCreateConvolutionDescriptor() called:
i!     convDesc: location=host; addr=0x7ffce7708b88;
i! Time: 2025-04-17T15:49:43.032027 (0d+0h+0m+1s since start)
i! Process=556373; Thread=556373; GPU=NULL; Handle=NULL; StreamId=NULL.


I! CuDNN (v8400) function cudnnGetErrorString() called:
i!     status: type=int; val=9;
i! Time: 2025-04-17T15:49:43.032071 (0d+0h+0m+1s since start)
i! Process=556373; Thread=556373; GPU=NULL; Handle=NULL; StreamId=NULL.

Solution

  • I could not locate the CuDNN ver 8.4 documentation. However, I managed to locate the documentation archive of CuDNN version 8.5.0 to 8.9.7. According to CuDNN version 8.5.0, this function should be:

    cudnnSetConvolution2dDescriptor()
    cudnnStatus_t cudnnSetConvolution2dDescriptor(
        cudnnConvolutionDescriptor_t    convDesc,
        int                             pad_h,
        int                             pad_w,
        int                             u,
        int                             v,
        int                             dilation_h,
        int                             dilation_w,
        cudnnConvolutionMode_t          mode,
        cudnnDataType_t                 computeType)
    

    But according to CuDNN ver. 8.4.0 output, there is no function called cudnn.setConvolution2dDescriptor but it has the cudnn.setConvolution2dDescriptor_v4 and cudnn.setConvolution2dDescriptor_v5 where cudnn.setConvolution2dDescriptor_v4 does not have the computeType kwarg but cudnn.setConvolution2dDescriptor_v5 has it.

    After replacing the cudnn.setConvolution2dDescriptor_v4 function with:

    cudnn.setConvolution2dDescriptor_v5(
            conv_desc,
            pad_h=pad,
            pad_w=pad,
            u=stride,
            v=stride,
            dilation_h=1,
            dilation_w=1,
            mode=cudnn.CUDNN_CONVOLUTION,
            computeType=cudnn.CUDNN_DATA_FLOAT
        )
    

    the cupy_backends.cuda.libs.cudnn.CuDNNError: cuDNN Error: CUDNN_STATUS_NOT_SUPPORTED was resolved.