code: def _register_cuda_binary_reduction_caller(funcname, lty, rty, retty):
      cuda_func = cuda.declare_device(
          f"Block{funcname}_{lty}_{rty}",
          retty(
              types.CPointer(lty), types.CPointer(rty), group_size_type
          ),
      )
  
      def caller(lhs, rhs, size):
          return cuda_func(lhs, rhs, size)
  
      call_cuda_functions.setdefault(funcname.lower(), {})
  
      type_key = retty, lty, rty
      call_cuda_functions[funcname.lower()][type_key] = caller
  
imports: from typing import Any, Dict
  import numba
  from numba import cuda, types
  from numba.core.extending import make_attribute_wrapper, models, register_model, type_callable, typeof_impl
  from numba.core.typing import signature
  from numba.core.typing.templates import AbstractTemplate, AttributeTemplate
  from numba.cuda.cudadecl import registry
  from numba.np import numpy_support
  from cudf.core.udf._ops import arith_ops, comparison_ops, unary_ops
  from cudf.core.udf.utils import Row, UDFError
label_desc: Use image node_id 3 for calling a global function with example usage: _register_cuda_binary_reduction_caller(funcname, lty, rty, retty) and returns: cuda_func