code: func (co *Context) OpTensor(opTensorDesc *Op, alpha1 float64, aDesc *TensorDescriptor, A Memory, alpha2 float64, bDesc *TensorDescriptor, B Memory, beta float64, cDesc *TensorDescriptor, C_ Memory) error {
  	var alpha1C, alpha2C, betaC unsafe.Pointer
  	switch aDesc.dataType {
  	case Float, Half:
  		var alpha1F, alpha2F, betaF C.float
  		alpha1F = C.float(float32(alpha1))
  		alpha2F = C.float(float32(alpha2))
  		betaF = C.float(float32(beta))
  		alpha1C = unsafe.Pointer(&alpha1F)
  		alpha2C = unsafe.Pointer(&alpha2F)
  		betaC = unsafe.Pointer(&betaF)
  	case Double:
  		var alpha1F, alpha2F, betaF C.double
  		alpha1F = C.double(alpha1)
  		alpha2F = C.double(alpha2)
  		betaF = C.double(beta)
  		alpha1C = unsafe.Pointer(&alpha1F)
  		alpha2C = unsafe.Pointer(&alpha2F)
  		betaC = unsafe.Pointer(&betaF)
  	default:
  		return errors.Errorf("Unsupported data type: %v", aDesc.dataType)
  	}
  	// call cudnnOpTensor
  	return result(C.cudnnOpTensor(co.internal, opTensorDesc.internal, alpha1C, aDesc.internal, A.Pointer(), alpha2C, bDesc.internal, B.Pointer(), betaC, cDesc.internal, C_.Pointer()))
  }
docs: // OpTensor implements the equation C = op ( alpha1[0] * A, alpha2[0] * B ) + beta[0] * C, given tensors A, B, and C and scaling factors alpha1, alpha2, and beta. The op to use is indicated by the descriptor opTensorDesc. Currently-supported ops are listed by the OpTensorOp_t enum.
  //	C_ is both an input and output