code: func (handle *Context) NewRNN(hiddenSize int, numLayers int, dropout *Dropout, inputMode RNNInputMode, direction DirectionMode, mode RNNMode, algo RNNAlgo, dataType DataType) (retVal *RNN, err error) {
  	var internal C.cudnnRNNDescriptor_t
  	if err := result(C.cudnnCreateRNNDescriptor(&internal)); err != nil {
  		return nil, err
  	}
  
  	if err := result(C.cudnnSetRNNDescriptor(handle.internal, internal, C.int(hiddenSize), C.int(numLayers), dropout.internal, inputMode.C(), direction.C(), mode.C(), algo.C(), dataType.C())); err != nil {
  		return nil, err
  	}
  
  	retVal = &RNN{
  		internal: internal,
  
  		hiddenSize:        hiddenSize,
  		layers:            numLayers,
  		dropoutDescriptor: dropout,
  		inputMode:         inputMode,
  		directionMode:     direction,
  		mode:              mode,
  		algo:              algo,
  		dataType:          dataType,
  		matrixMathType:    DefaultMath,
  	}
  	runtime.SetFinalizer(retVal, destroyRNN)
  	return retVal, nil
  }
docs: // NewRNN creates a new RNN.