diff --git a/examples/python/call-external.py b/examples/python/call-external.py deleted file mode 100644 index 904270472391a3f3c776ba6c254450a9755eed13..0000000000000000000000000000000000000000 --- a/examples/python/call-external.py +++ /dev/null @@ -1,105 +0,0 @@ -import loopy as lp -import numpy as np -from loopy.diagnostic import LoopyError -from loopy.target.c import CTarget - - -# {{{ blas callable - -class BLASCallable(lp.ScalarCallable): - def with_types(self, arg_id_to_dtype, kernel): - for i in range(0, 2): - if i not in arg_id_to_dtype or arg_id_to_dtype[i] is None: - # the types provided aren't mature enough to specialize the - # callable - return self.copy(arg_id_to_dtype=arg_id_to_dtype) - - mat_dtype = arg_id_to_dtype[0].numpy_dtype - vec_dtype = arg_id_to_dtype[1].numpy_dtype - - if mat_dtype != vec_dtype: - raise LoopyError("DGEMV should have same dtype for matrix and " - "vector") - - if vec_dtype == np.float32: - name_in_target = "cblas_sgemv" - elif vec_dtype == np.float64: - name_in_target = "cblas_dgemv" - else: - raise LoopyError("GEMV only supported for float32 and float64 " - "types") - - from loopy.types import NumpyType - return self.copy(name_in_target=name_in_target, - arg_id_to_dtype={0: NumpyType(vec_dtype), 1: NumpyType(vec_dtype), - -1: NumpyType(vec_dtype)}) - - def emit_call_insn(self, insn, target, expression_to_code_mapper): - assert self.is_ready_for_codegen() - - from loopy.kernel.instruction import CallInstruction - - assert isinstance(insn, CallInstruction) - - parameters = insn.expression.parameters - - parameters = list(parameters) - par_dtypes = [self.arg_id_to_dtype[i] for i, _ in enumerate(parameters)] - - parameters.append(insn.assignees[0]) - par_dtypes.append(self.arg_id_to_dtype[-1]) - - # no type casting in array calls. - from loopy.expression import dtype_to_type_context - from pymbolic.mapper.stringifier import PREC_NONE - from loopy.symbolic import SubArrayRef - from pymbolic import var - - mat_descr = self.arg_id_to_descr[0] - - c_parameters = [ - expression_to_code_mapper(par, PREC_NONE, - dtype_to_type_context(target, par_dtype), - par_dtype).expr if isinstance(par, SubArrayRef) else - expression_to_code_mapper(par, PREC_NONE, - dtype_to_type_context(target, par_dtype), - par_dtype).expr - for par, par_dtype in zip( - parameters, par_dtypes)] - c_parameters.insert(0, var('CblasRowMajor')) - c_parameters.insert(1, var('CblasNoTrans')) - c_parameters.insert(2, mat_descr.shape[0]) - c_parameters.insert(3, mat_descr.shape[1]) - c_parameters.insert(4, 1) - c_parameters.insert(6, 1) - c_parameters.insert(8, 1) - c_parameters.insert(10, 1) - return var(self.name_in_target)(*c_parameters), False - - def generate_preambles(self, target): - assert isinstance(target, CTarget) - yield("99_cblas", "#include ") - return - - -def blas_fn_lookup(target, identifier): - if identifier == 'gemv': - return BLASCallable(name='gemv') - return None - -# }}} - - -n = 10 - -knl = lp.make_kernel( - "{[i]: 0<=i<10}", - """ - y[:] = gemv(A[:, :], x[:]) - """, [ - lp.ArrayArg('A', dtype=np.float64, shape=(n, n)), - lp.ArrayArg('x', dtype=np.float64, shape=(n, )), - lp.ArrayArg('y', shape=(n, )), ...], - target=CTarget()) - -knl = lp.register_function_lookup(knl, blas_fn_lookup) diff --git a/loopy/preprocess.py b/loopy/preprocess.py index 6beadb3deea06d155b08194447bd8beb07d0b54c..2e4d07974766427c4a0c0bb6d73dfd2b40786c87 100644 --- a/loopy/preprocess.py +++ b/loopy/preprocess.py @@ -2133,15 +2133,14 @@ class ArgDescrInferenceMapper(CombineMapper): # FIXME logic duplication between map_call and map_call_with_kwargs def map_call(self, expr, **kwargs): from loopy.kernel.function_interface import ValueArgDescriptor - from loopy.symbolic import SubArrayRef, ScopedFunction + from loopy.symbolic import ScopedFunction # ignoring if the call is not to a ScopedFunction if not isinstance(expr.function, ScopedFunction): return self.combine((self.rec(child) for child in expr.parameters)) # descriptors for the args - arg_id_to_descr = dict((i, par.get_array_arg_descriptor(self.kernel)) - if isinstance(par, SubArrayRef) else (i, ValueArgDescriptor()) + arg_id_to_descr = dict((i, ValueArgDescriptor()) for i, par in enumerate(expr.parameters)) assignee_id_to_descr = {} @@ -2152,11 +2151,7 @@ class ArgDescrInferenceMapper(CombineMapper): assignees = kwargs['assignees'] assert isinstance(assignees, tuple) for i, par in enumerate(assignees): - if isinstance(par, SubArrayRef): - assignee_id_to_descr[-i-1] = ( - par.get_array_arg_descriptor(self.kernel)) - else: - assignee_id_to_descr[-i-1] = ValueArgDescriptor() + assignee_id_to_descr[-i-1] = ValueArgDescriptor() # gathering all the descriptors # TODO: I dont like in place updates. Change this to somthing else. @@ -2175,11 +2170,9 @@ class ArgDescrInferenceMapper(CombineMapper): def map_call_with_kwargs(self, expr, **kwargs): from loopy.kernel.function_interface import ValueArgDescriptor - from loopy.symbolic import SubArrayRef # descriptors for the args and kwargs: - arg_id_to_descr = dict((i, par.get_array_arg_descriptor(self.kernel)) - if isinstance(par, SubArrayRef) else ValueArgDescriptor() + arg_id_to_descr = dict((i, ValueArgDescriptor()) for i, par in tuple(enumerate(expr.parameters)) + tuple(expr.kw_parameters.items())) @@ -2190,11 +2183,7 @@ class ArgDescrInferenceMapper(CombineMapper): assignees = kwargs['assignees'] assert isinstance(assignees, tuple) for i, par in enumerate(assignees): - if isinstance(par, SubArrayRef): - assignee_id_to_descr[-i-1] = ( - par.get_array_arg_descriptor(self.kernel)) - else: - assignee_id_to_descr[-i-1] = ValueArgDescriptor() + assignee_id_to_descr[-i-1] = ValueArgDescriptor() # gathering all the descriptors # TODO: I dont like in place updates. Change this to somthing else.