code: func (co *Context) ReduceTensor(reduceTensorDesc *Reduction, indices Memory, indicesSizeInBytes uintptr, workspace Memory, workspaceSizeInBytes uintptr, alpha float64, aDesc *TensorDescriptor, A Memory, beta float64, cDesc *TensorDescriptor, C_ Memory) error {
  	// DOUBLECHECK: "cudnnReduceTensor" returns Memory type in Parameter 2
  	var alphaC, betaC unsafe.Pointer
  	switch aDesc.dataType {
  	case Float, Half:
  		var alphaF, betaF C.float
  		alphaF = C.float(float32(alpha))
  		betaF = C.float(float32(beta))
  		alphaC = unsafe.Pointer(&alphaF)
  		betaC = unsafe.Pointer(&betaF)
  	case Double:
  		var alphaF, betaF C.double
  		alphaF = C.double(alpha)
  		betaF = C.double(beta)
  		alphaC = unsafe.Pointer(&alphaF)
  		betaC = unsafe.Pointer(&betaF)
  	default:
  		return errors.Errorf("Unsupported data type: %v", aDesc.dataType)
  	}
  	// call cudnnReduceTensor
  	return result(C.cudnnReduceTensor(co.internal, reduceTensorDesc.internal, indices.Pointer(), C.size_t(indicesSizeInBytes), workspace.Pointer(), C.size_t(workspaceSizeInBytes), alphaC, aDesc.internal, A.Pointer(), betaC, cDesc.internal, C_.Pointer()))
  }
docs: // ReduceTensor reduces tensor A by implementing the equation C = alpha * reduce op ( A ) + beta * C, given tensors A and C and scaling factors alpha and beta. The reduction op to use is indicated by the descriptor reduceTensorDesc. Currently-supported ops are listed by the ReduceTensorOp_t enum.
  //	C_ is both an input and output