New submission from Serhiy Storchaka: Currently the PREDICT() macros is used for predicticting following pair of opcodes in the ceval loop:
LIST_APPEND JUMP_ABSOLUTE SET_ADD JUMP_ABSOLUTE MAP_ADD JUMP_ABSOLUTE COMPARE_OP POP_JUMP_IF_FALSE COMPARE_OP POP_JUMP_IF_TRUE GET_ITER FOR_ITER FOR_ITER STORE_FAST (if continue iterating) FOR_ITER UNPACK_SEQUENCE (if continue iterating) WITH_CLEANUP_START WITH_CLEANUP_FINISH WITH_CLEANUP_FINISH END_FINALLY I collected static and dynamic opcode statistics. Static statistics is a statistics about what opcodes are used in code objects after running the compileall script on the Lib directory. Dynamic statistics is is a statistics about what opcodes are executed when run all Python tests. Resulting numbers are close, but there are some reasonable differences (opcodes used in loops have larger numbers in dynamic statistics, and opcodes used for creating classes and functions have larger numbers in static statistics). In following lines the fist number is from dynamic statistics and the second number is from static statistics. LIST_APPEND, SET_ADD and MAP_ADD are always followed by JUMP_ABSOLUTE. COMPARE_OP is followed by POP_JUMP_IF_FALSE in 83% (78%) and by POP_JUMP_IF_TRUE in 13% (5%). GET_ITER is followed by FOR_ITER in 72% (80%) and CALL_FUNCTION in 28% (28%). FOR_ITER is followed by STORE_FAST in 50% (80%), UNPACK_SEQUENCE in 21% (18%) and POP_BLOCK in 20% (0%). WITH_CLEANUP_START is always followed by WITH_CLEANUP_FINISH. WITH_CLEANUP_FINISH is always followed by END_FINALLY According to this statistic existing predictions are correct. But the statistics suggests other predictions. JUMP_ABSOLUTE is followed by FOR_ITER in 77% (0%). UNPACK_SEQUENCE is followed by STORE_FAST in 97% (94%). SETUP_LOOP is followed by LOAD_FAST in 81% (52%) and LOAD_GLOBAL in 18% (31%). BUILD_SLICE is followed by BINARY_SUBSCR in 99% (87%). ROT_TWO is followed by STORE_FAST in 85% (40%). LOAD_CLOSURE is followed by BUILD_TUPLE in 94% (68%). SETUP_WITH is followed by POP_TOP in 94% (54%) and STORE_FAST in 6% (44%). GET_YIELD_FROM_ITER, GET_AITER, GET_ANEXT and GET_AWAITABLE are always followed by LOAD_CONST. DUP_TOP_TWO is always followed by BINARY_SUBSCR. BEFORE_ASYNC_WITH is always followed by GET_AWAITABLE. All INPLACE_ instructions almost always are followed by STORE_FAST. Proposed patch adds predictions of following pairs: DUP_TOP_TWO BINARY_SUBSCR INPLACE_POWER STORE_FAST INPLACE_MULTIPLY STORE_FAST INPLACE_MATRIX_MULTIPLY STORE_FAST INPLACE_TRUE_DIVIDE STORE_FAST INPLACE_FLOOR_DIVIDE STORE_FAST INPLACE_MODULO STORE_FAST INPLACE_ADD STORE_FAST INPLACE_SUBTRACT STORE_FAST INPLACE_LSHIFT STORE_FAST INPLACE_RSHIFT STORE_FAST INPLACE_AND STORE_FAST INPLACE_XOR STORE_FAST INPLACE_OR STORE_FAST GET_AITER LOAD_CONST GET_ANEXT LOAD_CONST GET_AWAITABLE LOAD_CONST UNPACK_SEQUENCE STORE_FAST LOAD_CLOSURE BUILD_TUPLE GET_ITER CALL_FUNCTION GET_YIELD_FROM_ITER LOAD_CONST FOR_ITER POP_BLOCK BEFORE_ASYNC_WITH GET_AWAITABLE SETUP_WITH POP_TOP SETUP_WITH STORE_FAST BUILD_SLICE BINARY_SUBSCR Note that the effect of this change is not very significant since the PREDICT() macros is no-op if computed GOTOs are used. ---------- components: Interpreter Core files: more_opcode_predicts.patch keywords: patch messages: 267719 nosy: serhiy.storchaka priority: normal severity: normal stage: patch review status: open title: More opcode predictions type: enhancement versions: Python 3.6 Added file: http://bugs.python.org/file43283/more_opcode_predicts.patch _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue27255> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com