code: def _forward_2d_ideep(self, gy):
      func = self.func
  
      # FIXME
      # Here we expect indexes is returned from MKL-DNN
      # otherwise, there are dtype mismatch for reorder (int64-->uint8)
      if not isinstance(func.indexes, intel64.ideep.mdarray):
          return self.forward_cpu(gy)
  
      kh, kw = func.ksize
      sy, sx = func.stride
      ph, pw = func.pad
      indexes = func.indexes
      in_shape = func._in_shape
  
      n, c, h, w = in_shape
      y_h, y_w = gy[0].shape[2:]
      x = func.get_retained_inputs()[0].array
  
      pd = sy * (y_h - 1) + kh - h - ph
      pr = sx * (y_w - 1) + kw - w - pw
  
      pp = intel64.ideep.pooling2DParam(
          func._in_shape,
          kh,
          kw,
          sy,
          sx,
          ph,
          pw,
          pd,
          pr,
          intel64.ideep.pooling2DParam.pooling_max,
      )
  
      indexes = intel64.ideep.array(indexes)
      gx = intel64.ideep.pooling2D.Backward(
          intel64.ideep.array(x),
          intel64.ideep.array(gy[0]),
          indexes,
          pp,
      )
      return (gx,)
  
imports: import functools
  from operator import mul
  import numpy
  import six
  import chainer
  from chainer import backend
  from chainer.backends import cuda
  from chainer.backends import intel64
  from chainer import configuration
  from chainer import function_node
  from chainer.functions.pooling import max_pooling_nd_kernel
  from chainer.functions.pooling import pooling_nd
  from chainer.utils import conv_nd
  import chainerx
label_desc: Use image node_id 3 for calling the MaxPoolingNDGrad obj's underlying member method code with example usage: obj._forward_2d_ideep(gy) and returns: gx, self