|
13 | 13 | import operator |
14 | 14 | import warnings |
15 | 15 |
|
| 16 | +import dpnp |
16 | 17 | from numba.core import config, errors, ir, types, typing |
17 | 18 | from numba.core.compiler_machinery import register_pass |
18 | 19 | from numba.core.ir_utils import ( |
|
42 | 43 | ) |
43 | 44 | from numba.stencils.stencilparfor import StencilPass |
44 | 45 |
|
| 46 | +from numba_dpex.core.typing import dpnpdecl |
| 47 | + |
45 | 48 |
|
46 | 49 | class ConvertDPNPPass(ConvertNumpyPass): |
47 | 50 | """ |
@@ -293,6 +296,39 @@ def _ufunc_to_parfor_instr( |
293 | 296 | return el_typ |
294 | 297 |
|
295 | 298 |
|
| 299 | +def get_dpnp_ufunc_typ(func): |
| 300 | + """get type of the incoming function from builtin registry""" |
| 301 | + for k, v in dpnpdecl.registry.globals: |
| 302 | + if k == func: |
| 303 | + return v |
| 304 | + raise RuntimeError("type for func ", func, " not found") |
| 305 | + |
| 306 | + |
| 307 | +def _gen_dpnp_divide(arg1, arg2, out_ir, typemap): |
| 308 | + """generate np.divide() instead of / for array_expr to get numpy error model |
| 309 | + like inf for division by zero (test_division_by_zero). |
| 310 | + """ |
| 311 | + scope = arg1.scope |
| 312 | + loc = arg1.loc |
| 313 | + g_np_var = ir.Var(scope, mk_unique_var("$np_g_var"), loc) |
| 314 | + typemap[g_np_var.name] = types.misc.Module(dpnp) |
| 315 | + g_np = ir.Global("dpnp", dpnp, loc) |
| 316 | + g_np_assign = ir.Assign(g_np, g_np_var, loc) |
| 317 | + # attr call: div_attr = getattr(g_np_var, divide) |
| 318 | + div_attr_call = ir.Expr.getattr(g_np_var, "divide", loc) |
| 319 | + attr_var = ir.Var(scope, mk_unique_var("$div_attr"), loc) |
| 320 | + func_var_typ = get_dpnp_ufunc_typ(dpnp.divide) |
| 321 | + typemap[attr_var.name] = func_var_typ |
| 322 | + attr_assign = ir.Assign(div_attr_call, attr_var, loc) |
| 323 | + # divide call: div_attr(arg1, arg2) |
| 324 | + div_call = ir.Expr.call(attr_var, [arg1, arg2], (), loc) |
| 325 | + func_typ = func_var_typ.get_call_type( |
| 326 | + typing.Context(), [typemap[arg1.name], typemap[arg2.name]], {} |
| 327 | + ) |
| 328 | + out_ir.extend([g_np_assign, attr_assign]) |
| 329 | + return func_typ, div_call |
| 330 | + |
| 331 | + |
296 | 332 | def _arrayexpr_tree_to_ir( |
297 | 333 | func_ir, |
298 | 334 | typingctx, |
@@ -343,7 +379,8 @@ def _arrayexpr_tree_to_ir( |
343 | 379 | ) |
344 | 380 | ir_expr = ir.Expr.binop(op, arg_vars[0], arg_vars[1], loc) |
345 | 381 | if op == operator.truediv: |
346 | | - func_typ, ir_expr = parfor._gen_np_divide( |
| 382 | + # NUMBA_DPEX: is_dpnp_func check was added |
| 383 | + func_typ, ir_expr = _gen_dpnp_divide( |
347 | 384 | arg_vars[0], arg_vars[1], out_ir, typemap |
348 | 385 | ) |
349 | 386 | else: |
|
0 commit comments