From f174fd730c5c681512821a6f3309526f2b841c20 Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner <inform@tiker.net> Date: Fri, 24 Aug 2012 00:13:27 -0400 Subject: [PATCH] Support floor_divs through preamble generation. --- loopy/codegen/__init__.py | 19 ------------------- loopy/codegen/expression.py | 8 +++++++- loopy/kernel.py | 18 ++++++++++++++++++ 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/loopy/codegen/__init__.py b/loopy/codegen/__init__.py index cf5a0ed69..e653feb93 100644 --- a/loopy/codegen/__init__.py +++ b/loopy/codegen/__init__.py @@ -313,25 +313,6 @@ def generate_code(kernel, with_annotation=False, Value("void", kernel.name), args))), body)) - gen_code_str = str(gen_code) - - from cgen import LiteralLines - if "int_floor_div" in gen_code_str: - mod.extend(LiteralLines(""" - #define int_floor_div(a,b) \ - (( (a) - \ - ( ( (a)<0 ) != ( (b)<0 )) \ - *( (b) + ( (b)<0 ) - ( (b)>=0 ) )) \ - / (b) ) - """)) - - if "int_floor_div_pos_b" in gen_code_str: - mod.extend(LiteralLines(""" - #define int_floor_div_pos_b(a,b) ( \ - ( (a) - ( ((a)<0) ? ((b)-1) : 0 ) ) / (b) \ - ) - """)) - from loopy.check import check_implemented_domains assert check_implemented_domains(kernel, gen_code.implemented_domains) diff --git a/loopy/codegen/expression.py b/loopy/codegen/expression.py index da323a794..870843aaa 100644 --- a/loopy/codegen/expression.py +++ b/loopy/codegen/expression.py @@ -318,19 +318,25 @@ class LoopyCCodeMapper(RecursiveMapper): num_nonneg = is_nonnegative(expr.numerator, domain) den_nonneg = is_nonnegative(expr.denominator, domain) + def seen_func(name): + idt = self.kernel.index_dtype + self.seen_functions.add((name, name, (idt, idt))) + if den_nonneg: if num_nonneg: return self.parenthesize_if_needed( - "%s // %s" % ( + "%s / %s" % ( self.rec(expr.numerator, PREC_PRODUCT, type_context), # analogous to ^{-1} self.rec(expr.denominator, PREC_POWER, type_context)), enclosing_prec, PREC_PRODUCT) else: + seen_func("int_floor_div_pos_b") return ("int_floor_div_pos_b(%s, %s)" % (self.rec(expr.numerator, PREC_NONE, 'i'), self.rec(expr.denominator, PREC_NONE, 'i'))) else: + seen_func("int_floor_div") return ("int_floor_div(%s, %s)" % (self.rec(expr.numerator, PREC_NONE, 'i'), self.rec(expr.denominator, PREC_NONE, 'i'))) diff --git a/loopy/kernel.py b/loopy/kernel.py index 4ac55c12a..6fea7bfac 100644 --- a/loopy/kernel.py +++ b/loopy/kernel.py @@ -513,6 +513,24 @@ def default_preamble_generator(seen_dtypes, seen_functions): #include <pyopencl-complex.h> """) + c_funcs = set(c_name for name, c_name, arg_dtypes in seen_functions) + if "int_floor_div" in c_funcs: + yield ("05_int_floor_div", """ + #define int_floor_div(a,b) \ + (( (a) - \ + ( ( (a)<0 ) != ( (b)<0 )) \ + *( (b) + ( (b)<0 ) - ( (b)>=0 ) )) \ + / (b) ) + """) + + if "int_floor_div_pos_b" in c_funcs: + yield ("05_int_floor_div_pos_b", """ + #define int_floor_div_pos_b(a,b) ( \ + ( (a) - ( ((a)<0) ? ((b)-1) : 0 ) ) / (b) \ + ) + """) + + # }}} # {{{ loop kernel object -- GitLab