code: func AllocAndCopy(p unsafe.Pointer, bytesize int64) (DevicePtr, error) {
  	if bytesize == 0 {
  		return 0, errors.Wrapf(InvalidValue, "Cannot allocate memory with size 0")
  	}
  
  	var d C.CUdeviceptr
  	if err := result(C.cuAllocAndCopy(&d, p, C.size_t(bytesize))); err != nil {
  		return 0, errors.Wrapf(err, "AllocAndCopy")
  	}
  	return DevicePtr(d), nil
  }
docs: // AllocAndCopy abstracts away the common pattern of allocating and then copying a Go slice to the GPU