Dear Alban,
Thank you very much for your time!
Let me be more precise about the setting with the following pseudo-code:
    @staticmethod
    def forward(ctx, input, w_f, bias_f, w_b, stride, padding):
        
            y = cudnn_convolution.convolution(input, w_f, bias_f, 
                                              stride, padding,
                                              (1, 1), 1, False, False)
            
            r = cudnn_convolution.convolution_backward_input(input.shape, w_b.data, y, 
                                                             stride, padding, 
                                                             (1, 1), 1, False, False, False)
            
            ctx.save_for_backward(y, w_b)
            ctx.stride = stride
            ctx.padding = padding
            
            return r        
        
    @staticmethod
    def backward(ctx, grad_r):
        w_b_learning = ctx.w_b_learning
        stride, padding = ctx.stride, ctx.padding

        y, w_b = ctx.saved_tensors    
        
        grad_w_b = cudnn_convolution.convolution_backward_weight(..?..)
        grad_y = cudnn_convolution.convolution_backward_input(..?..)
        grad_w_f = cudnn_convolution.convolution_backward_weight(input, w_f.shape, grad_y, stride, padding, (1, 1), 1, False, False, False)
        grad_bias_f = torch.sum(grad_y, dim=[0, 2, 3]).squeeze(0)   
        
        return None, grad_w_f, grad_bias_f, grad_w_b, None, None

My question is therefore the following : how could I compute  grad_w_b and grad_y? Can we also use cudnn_convolution.convolution_backward_input and cudnn_convolution.convolution_backward_weight with the “right” parameters? Or should we use another cpp function? It would be incredibly helpful, I have looked everywhere on the web and I could not find an answer :-(.