code: def test_apply_gufunc_broadcasting_loopdims():
      def foo(x, y):
          assert len(x.shape) == 2
          assert len(y.shape) == 3
          x, y = np.broadcast_arrays(x, y)
          return x, y, x * y
  
      rng = da.random.default_rng()
      a = rng.normal(size=(10, 30), chunks=(8, 30))
      b = rng.normal(size=(20, 1, 30), chunks=(3, 1, 30))
  
      x, y, z = apply_gufunc(
          foo,
          "(i),(i)->(i),(i),(i)",
          a,
          b,
          output_dtypes=3 * (float,),
          vectorize=False,
      )
  
      assert x.compute().shape == (20, 10, 30)
      assert y.compute().shape == (20, 10, 30)
      assert z.compute().shape == (20, 10, 30)
  
imports: from __future__ import annotations
  import numpy
  import pytest
  from numpy.testing import assert_equal
  import dask.array
  from dask.array.core import Array
  from dask.array.gufunc import _parse_gufunc_signature, _validate_normalize_axes, apply_gufunc, as_gufunc, gufunc
  from dask.array.utils import assert_eq
label_desc: Use image node_id 29 for calling a global function with example usage: test_apply_gufunc_broadcasting_loopdims() and returns: x,  y,  unknown