parameters: (self, dy, split_num)
return_statement: return {'shape': dy_shape_all,
                  'dtype': dy['dtype'],
                  'value': None}
docstring: This primitive is implemented by three steps:
              1) Splits the 'dy' along dimension 0 into 'split_num' parts.
              2) For each part, perform _HostAllGather((0, 1, 2, 3, 4, 5, 6, 7)) on the host.
              3) After _HostAllGather, there are still 'split_num' parts in each process. Then, perform Concat on them
                along dimension 0.
  
          The output shape of this primitive: shape(output)[0] == shape(dy)[0] * 8
docstring_summary: This primitive is implemented by three steps:
              1) Splits the 'dy' along dimension 0 into 'split_num' parts.
              2) For each part, perform _HostAllGather((0, 1, 2, 3, 4, 5, 6, 7)) on the host.
              3) After _HostAllGather, there are still 'split_num' parts in each process. Then, perform Concat on them
                along dimension 0.
docstring_tokens: This primitive is implemented by three steps : 1 ) Splits the dy along dimension 0 into split_num parts . 2 ) For each part perform _HostAllGather (( 0 1 2 3 4 5 6 7 )) on the host . 3 ) After _HostAllGather there are still split_num parts in each process . Then perform Concat on them along dimension 0 .
function: def __infer__(self, dy, split_num):
          """
          This primitive is implemented by three steps:
              1) Splits the 'dy' along dimension 0 into 'split_num' parts.
              2) For each part, perform _HostAllGather((0, 1, 2, 3, 4, 5, 6, 7)) on the host.
              3) After _HostAllGather, there are still 'split_num' parts in each process. Then, perform Concat on them
                along dimension 0.
  
          The output shape of this primitive: shape(output)[0] == shape(dy)[0] * 8
          """
          dy_shape = tuple(dy['shape'])
          split_num_value = split_num['value']
          validator.check_value_type("split_num_value", split_num_value, [int], self.name)
          dy_shape_all = self.tuple_setitem(dy_shape, 0, dy_shape[0] * 8)
          return {'shape': dy_shape_all,
                  'dtype': dy['dtype'],
                  'value': None}
function_tokens: def __infer__ ( self , dy , split_num ) : dy_shape = tuple ( dy [ 'shape' ] ) split_num_value = split_num [ 'value' ] validator . check_value_type ( "split_num_value" , split_num_value , [ int ] , self . name ) dy_shape_all = self . tuple_setitem ( dy_shape , 0 , dy_shape [ 0 ] * 8 ) return { 'shape' : dy_shape_all , 'dtype' : dy [ 'dtype' ] , 'value' : None }