Hi, I have recently managed to correctly transform a trace to a vectorized trace that includes a guard. I'm hoping that this might be merged into the code base of pypy (when it is finished), thus it would be nice to get feedback and iron out some problems I currently have. Of course this needs explanation (hope that does not lead to tl;dr):
Consider the following trace: short version (pseudo syntax): ``` label(...,i,...) store(c,i) = load(a,i) + load(b,i) j = i+1 guard(j<MAX) jump(...,j,...) ``` long version: http://pastebin.com/e24s1vZg By unrolling this short trace, it is _NOT_ possible to vectorize it. The guard prohibits the store operation to be executed after the guard. I solved this problem by introducing a new guard (called 'early-exit'). It saves the live variables at the beginning of the trace. By finding the index calculations + guards and moving them above the early exit the following is possible: short version (pseudo syntax): ``` label(...,i,...) j = i + 1 guard(j<MAX) k = j + 1 guard(k<MAX) guard_early_exit() # will not be emitted va = vec_load(a,i,2) vb = vec_load(b,i,2) vc = vec_add(va,vb) vec_store(c, i, 2) = vc jump(...,k,...) ``` long version http://pastebin.com/vc3HaZCn My assumptions: Any guard that fails before the early exit must guide blackhole to the original loop at instruction 0. Only pure operations and the guards protecting the index are allowed to move before early-exit. The previous and the use of the live variables of the early exit (at the guard instructions) preserve correctness. I'm not quite sure how to handle the following problems: 1) I had the problem that uneven iterations moved to the blackhole interpreter and executed the loop from the beginning. I fixed it by resetting the blackhole interpreter position to the jitcode index 0. Is this the right way to start from the beginning? 2) Is there a better way to tell the blackhole interpreter to resume from the beginning of the trace, or even do not blackhole and just jump into the normal interpreter? 3) Are there any objections to do it this way (guard early-exit)? Best, Richard
0xCF1B1C8D.asc
Description: application/pgp-keys
signature.asc
Description: OpenPGP digital signature
_______________________________________________ pypy-dev mailing list pypy-dev@python.org https://mail.python.org/mailman/listinfo/pypy-dev