Jiterator can be used together with python registration to override
   an operator's cuda kernel. Following example is overriding gelu's
   cuda kernel with relu.
Example:
  code_string = "template <typename T> T my_gelu(T a) { return a > 0 ? a : 0; }"
  my_gelu = create_jit_fn(code_string)
  my_lib = torch.library.Library("aten", "IMPL")
  my_lib.impl('aten::gelu', my_gelu, "CUDA")
  # torch.nn.GELU and torch.nn.function.gelu are now overridden
  a = torch.rand(3, device='cuda')
  torch.allclose(torch.nn.functional.gelu(a), torch.nn.functional.relu(a))

Warning:
 This API is in beta and may change in future releases.

Warning:
 This API only supports up to 8 inputs and 1 output

Warning:
 All input tensors must live in CUDA device
