Author: Richard Plangger <r...@pasra.at> Branch: vecopt-merge Changeset: r79120:e7a3de7993aa Date: 2015-08-21 16:05 +0200 http://bitbucket.org/pypy/pypy/changeset/e7a3de7993aa/
Log: docu diff --git a/rpython/jit/metainterp/optimizeopt/schedule.py b/rpython/jit/metainterp/optimizeopt/schedule.py --- a/rpython/jit/metainterp/optimizeopt/schedule.py +++ b/rpython/jit/metainterp/optimizeopt/schedule.py @@ -12,6 +12,7 @@ class SchedulerData(object): pass class Scheduler(object): + """ The base class to be instantiated to (re)schedule a vector trace. """ def __init__(self, graph, sched_data): assert isinstance(sched_data, SchedulerData) self.graph = graph @@ -37,6 +38,8 @@ return -1 def schedulable(self, candidate): + """ Is the candidate scheduleable? Boils down to dependency_count == 0 + """ if candidate.pack: pack = candidate.pack if pack.is_accumulating(): @@ -52,6 +55,11 @@ return candidate.depends_count() == 0 def scheduled(self, node): + """ Call this function if an operation has been emitted + adds new operations to the schedule list if + their dependency count drops to zero. + In addition it keeps the list sorted (see priority) + """ node.position = len(self.oplist) for dep in node.provides()[:]: # COPY to = dep.to @@ -79,6 +87,9 @@ node.emitted = True def emit_into(self, oplist, renamer, unpack=False): + """ Emit all the operations into the oplist parameter. + Initiates the scheduling. + """ self.renamer = renamer self.oplist = oplist self.unpack = unpack @@ -303,7 +314,7 @@ def transform_pack(self): - """ high level transformation routine of a pack to operations """ + """ High level transformation routine of a pack to operations """ op = self.pack.leftmost() args = op.getarglist() self.before_argument_transform(args) @@ -345,7 +356,7 @@ return self.pack.operations def transform_arguments(self, args): - """ transforming one argument to a vector box argument """ + """ Transforming one argument to a vector box argument """ for i,arg in enumerate(args): if isinstance(arg, BoxVector): continue @@ -446,7 +457,7 @@ return vbox_cloned def unpack(self, vbox, index, count, arg_ptype): - """ extract parts of the vector box into another vector box """ + """ Extract parts of the vector box into another vector box """ assert index < vbox.getcount() assert index + count <= vbox.getcount() assert count > 0 @@ -494,7 +505,7 @@ assert result.getcount() > arg0.getcount() def expand(self, arg, argidx): - """ expand a value into a vector box. useful for arith metic + """ Expand a value into a vector box. useful for arith metic of one vector with a scalar (either constant/varialbe) """ elem_count = self.input_type.getcount() @@ -637,10 +648,9 @@ return None class StoreToVectorStore(OpToVectorOp): - """ - Storing operations are special because they are not allowed - to store to memory if the vector is not fully filled. - Thus a modified split_pack function + """ Storing operations are special because they are not allowed + to store to memory if the vector is not fully filled. + Thus a modified split_pack function. """ def __init__(self): OpToVectorOp.__init__(self, (None, None, PT_GENERIC), None) @@ -659,8 +669,8 @@ class PassThroughOp(OpToVectorOp): """ This pass through is only applicable if the target - operation is capable of handling vector operations. - Guard true/false is such an example. + operation is capable of handling vector operations. + Guard true/false is such an example. """ def __init__(self, args): OpToVectorOp.__init__(self, args, None) @@ -720,12 +730,12 @@ def determine_input_output_types(pack, node, forward): """ This function is two fold. If moving forward, it - gets an input type from the packs output type and returns - the transformed packtype. + gets an input type from the packs output type and returns + the transformed packtype. - Moving backward, the origins pack input type is the output - type and the transformation of the packtype (in reverse direction) - is the input + Moving backward, the origins pack input type is the output + type and the transformation of the packtype (in reverse direction) + is the input """ op = node.getoperation() op2vecop = determine_trans(op) @@ -763,8 +773,8 @@ self.seen = {} def schedule_candidate(self, scheduler, candidate): - """ if you implement a scheduler this operations is called - to emit the actual operation into the oplist of the scheduler + """ If you implement a scheduler this operations is called + to emit the actual operation into the oplist of the scheduler. """ renamer = scheduler.renamer if candidate.pack: @@ -786,7 +796,9 @@ scheduler.oplist.append(op) def as_vector_operation(self, scheduler, pack): - """ transform a pack into a single or several operation """ + """ Transform a pack into a single or several operation. + Calls the as_vector_operation of the OpToVectorOp implementation. + """ assert pack.opcount() > 1 # properties that hold for the pack are: # + isomorphism (see func above) @@ -806,8 +818,8 @@ scheduler.renamer.start_renaming(op.result, box) def unpack_from_vector(self, op, scheduler): - """ if a box is needed that is currently stored within a vector - box, this utility creates a unpacking instruction + """ If a box is needed that is currently stored within a vector + box, this utility creates a unpacking instruction. """ args = op.getarglist() @@ -881,8 +893,8 @@ return self.operations[0].getoperation() def is_full(self, vec_reg_size): - """ if one input element times the opcount is equal - to the vector register size, we are full! + """ If one input element times the opcount is equal + to the vector register size, we are full! """ ptype = self.input_type if self.input_type is None: @@ -922,7 +934,7 @@ node.pack_position = i def rightmost_match_leftmost(self, other): - """ check if pack A can be combined with pack B """ + """ Check if pack A can be combined with pack B """ assert isinstance(other, Pack) rightmost = self.operations[-1] leftmost = other.operations[0] diff --git a/rpython/jit/metainterp/optimizeopt/vectorize.py b/rpython/jit/metainterp/optimizeopt/vectorize.py --- a/rpython/jit/metainterp/optimizeopt/vectorize.py +++ b/rpython/jit/metainterp/optimizeopt/vectorize.py @@ -33,6 +33,9 @@ def optimize_vector(metainterp_sd, jitdriver_sd, loop, optimizations, inline_short_preamble, start_state, warmstate): + """ Enter the world of SIMD instructions. Bails if it cannot + transform the trace. + """ optimize_unroll(metainterp_sd, jitdriver_sd, loop, optimizations, inline_short_preamble, start_state, False) user_code = not jitdriver_sd.vec and warmstate.vec_all @@ -88,8 +91,9 @@ raise def user_loop_bail_fast_path(loop, warmstate): - """ in a fast path over the trace loop: try to prevent vecopt - of spending time on a loop that will most probably fail """ + """ In a fast path over the trace loop: try to prevent vecopt + of spending time on a loop that will most probably fail. + """ resop_count = 0 # the count of operations minus debug_merge_points vector_instr = 0 @@ -112,7 +116,7 @@ if resop_count > warmstate.vec_length: return True - if float(vector_instr)/float(resop_count) <= warmstate.vec_ratio: + if (float(vector_instr)/float(resop_count)) < warmstate.vec_ratio: return True return False _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit