def ctypes_to_generic_value(cval, t): if isinstance(t, core_types.FloatT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.real(llvm_t, cval.value) elif isinstance(t, core_types.SignedT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.int_signed(llvm_t, cval.value) elif isinstance(t, core_types.IntT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.int(llvm_t, cval.value) elif isinstance(t, core_types.PtrT): return GenericValue.pointer(ctypes.addressof(cval.contents)) else: return GenericValue.pointer(ctypes.addressof(cval))
def python_to_generic_value(x, t): if isinstance(t, core_types.FloatT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.real(llvm_t, x) elif isinstance(t, core_types.SignedT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.int_signed(llvm_t, x) elif isinstance(t, core_types.IntT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.int(llvm_t, x) elif isinstance(t, core_types.PtrT): return GenericValue.pointer(x) else: ctypes_obj = type_conv.from_python(x) return GenericValue.pointer(ctypes.addressof(ctypes_obj))
def python_to_generic_value(x, t): if isinstance(t, FloatT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.real(llvm_t, x) elif isinstance(t, SignedT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.int_signed(llvm_t, x) elif isinstance(t, IntT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.int(llvm_t, x) elif isinstance(t, PtrT): return GenericValue.pointer(x) else: ctypes_obj = type_conv.from_python(x) return GenericValue.pointer(ctypes.addressof(ctypes_obj))
def parfor(fn, niters, fixed_args = (), ee = shared_exec_engine): """ Given a function from index integers to void, run it in parallel over the index range specified by the tuple 'niters' """ assert isinstance(fn, Function), \ "Can only run LLVM functions, not %s" % type(fn) # in case fixed arguments aren't yet GenericValues, convert them fixed_args = tuple(gv_from_python(v, arg.type) for (v,arg) in zip(fixed_args, fn.args)) iter_ranges, steps, shape = parse_iters(niters) result_lltype = return_type(fn) if result_lltype == ty_void: work_fn = parfor_wrapper(fn, steps) launch(work_fn, iter_ranges, fixed_args, ee) return else: assert is_llvm_float_type(result_lltype) or is_llvm_int_type(result_lltype) dtype = lltype_to_dtype(result_lltype) result_array = np.empty(shape = shape, dtype = dtype) fixed_args = (GenericValue.pointer(result_array.ctypes.data),) + fixed_args work_fn = parfor_wrapper(fn, steps, shape) n_given = len(fixed_args) + 2*len(steps) n_expected = len(work_fn.args) assert n_given == n_expected, \ "Work function expects %d arguments but got %d" % (n_expected, n_given) launch(work_fn, iter_ranges, fixed_args, ee) return result_array assert False, "Collecting results not yet implemented"
def gv_from_python(x, llvm_type = None): if isinstance(x, GenericValue): return x elif isinstance(x, (int,long)): llvm_type = ty_int64 if llvm_type is None else llvm_type assert is_llvm_int_type(llvm_type), \ "Expected LLVM integer type, not %s" % (llvm_type,) return GenericValue.int(llvm_type, x) elif isinstance(x, float): llvm_type = ty_float64 if llvm_type is None else llvm_type assert is_llvm_float_type(llvm_type), \ "Expected LLVM float type, not %s" % (llvm_type,) return GenericValue.real(llvm_type, x) elif isinstance(x, bool): llvm_type = ty_int8 if llvm_type is None else llvm_type assert is_llvm_int_type(llvm_type), \ "Expected LLVM integer type, not %s" % (llvm_type,) return GenericValue.int(llvm_type, x) else: assert isinstance(x, np.ndarray) assert llvm_type is not None assert is_llvm_ptr_type(llvm_type), \ "Native argument receiving numpy array must be a pointer, not %s" % (llvm_type,) elt_type = llvm_type.pointee assert is_llvm_float_type(elt_type) or is_llvm_int_type(elt_type) assert elt_type == python_to_lltype(x.dtype), \ "Can't pass array with %s* data pointer to function that expects %s*" % (x.dtype, elt_type) return GenericValue.pointer(x.ctypes.data)
def ctypes_to_generic_value(cval, t): if isinstance(t, FloatT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.real(llvm_t, cval.value) elif isinstance(t, SignedT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.int_signed(llvm_t, cval.value) elif isinstance(t, IntT): llvm_t = llvm_types.llvm_value_type(t) return GenericValue.int(llvm_t, cval.value) elif isinstance(t, NoneT): return GenericValue.int(llvm_types.int64_t, 0) elif isinstance(t, PtrT): return GenericValue.pointer(ctypes.addressof(cval.contents)) else: return GenericValue.pointer(ctypes.addressof(cval))