class_docstr: Target device information, use through TVM API.
  
  Note
  ----
  You can create target using the constructor or the following functions
  
  - :py:func:`tvm.target.arm_cpu` create arm_cpu target
  - :py:func:`tvm.target.cuda` create CUDA target
  - :py:func:`tvm.target.rocm` create ROCM target
  - :py:func:`tvm.target.mali` create Mali target
  - :py:func:`tvm.target.intel_graphics` create Intel Graphics target
class_docstr_tok: ["Target","device","information",",","use","through","TVM","API",".","Note","--","--","You","can","create","target","using","the","constructor","or","the","following","functions","-",":","py",":","func",":","`","tvm.target.arm_cpu","`","create","arm_cpu","target","-",":","py",":","func",":","`","tvm.target.cuda","`","create","CUDA","target","-",":","py",":","func",":","`","tvm.target.rocm","`","create","ROCM","target","-",":","py",":","func",":","`","tvm.target.mali","`","create","Mali","target","-",":","py",":","func",":","`","tvm.target.intel_graphics","`","create","Intel","Graphics","target"]
docstr: Returns a TVM Array<Target> capturing target and target_host. The given target can be in
  any form recognized by Target.canon_multi_target. If given, target_host can be in
  any form recognized by Target.canon_target. If target_host is given it will be set
  as the 'host' in each result Target object (and a warning given).
docstr_tok: ["Returns","a","TVM","Array","<","Target",">","capturing","target","and","target_host",".","The","given","target","can","be","in","any","form","recognized","by","Target.canon_multi_target",".","If","given",",","target_host","can","be","in","any","form","recognized","by","Target.canon_target",".","If","target_host","is","given","it","will","be","set","as","the","'host","'","in","each","result","Target","object","(","and","a","warning","given",")","."]
code: def canon_multi_target_and_host(target, target_host=None):
      """Returns a TVM Array<Target> capturing target and target_host. The given target can be in
      any form recognized by Target.canon_multi_target. If given, target_host can be in
      any form recognized by Target.canon_target. If target_host is given it will be set
      as the 'host' in each result Target object (and a warning given).
      """
      # Convert target to Array<Target>, but not yet accounting for any host.
      raw_targets = Target.canon_multi_target(target)
      assert raw_targets is not None and len(raw_targets) > 0
      # Convert host to Target, if given.
      if raw_targets[0].host is None and target_host is not None:
          warnings.warn(
              "target_host parameter is going to be deprecated. "
              "Please pass in tvm.target.Target(target, host=target_host) instead."
          )
          # Make sure the (canonical) host is captured in all the (canonical) targets.
          target_host = Target.canon_target(target_host)
          raw_targets = convert(
              [tgt.with_host(target_host) for tgt in raw_targets]
          )
      return raw_targets
  
imports: import json
  import re
  import warnings
  from typing import Union
  import tvm._ffi
  from tvm._ffi import register_func
  from tvm._ffi.runtime_ctypes import Device
  from tvm.runtime import Object, convert
  from tvm.runtime.container import String
  from tvm.ir.container import Map, Array
  from .None import _ffi_api
label_desc: Use image node_id 31 for calling the Target obj's underlying member method code with example usage: obj.canon_multi_target_and_host(target, target_host) and returns: raw_targets