docstr: morton3D_invert, CUDA implementation
  Args:
      indices: [N], int32, in [0, 128^3)
  Returns:
      coords: [N, 3], int32, in [0, 128)
docstr_tok: ["morton3D_invert",",","CUDA","implementation","Args",":","indices",":","[","N","]",",","int32",",","in","[","0",",","128^3",")","Returns",":","coords",":","[","N",",","3","]",",","int32",",","in","[","0",",","128",")"]
code: def forward(ctx, indices):
      """morton3D_invert, CUDA implementation
      Args:
          indices: [N], int32, in [0, 128^3)
      Returns:
          coords: [N, 3], int32, in [0, 128)
  
      """
      if not indices.is_cuda:
          indices = indices.cuda()
  
      N = indices.shape[0]
  
      coords = torch.empty(
          N, 3, dtype=torch.int32, device=indices.device
      )
  
      get_backend().morton3D_invert(indices.int(), N, coords)
  
      return coords
  
imports: import torch
  from torch.autograd import Function
  from torch.cuda.amp import custom_bwd, custom_fwd
label_desc: Use image node_id 1 for calling the _morton3D_invert obj's underlying member method code with example usage: obj.forward(ctx, indices) and returns: coords