Skip to content

GH-115457: Support splitting and replication of micro ops. - #115558

Merged
markshannon merged 6 commits into
python:mainfrom
faster-cpython:split-on-oparg-1
Feb 20, 2024
Merged

GH-115457: Support splitting and replication of micro ops. #115558
markshannon merged 6 commits into
python:mainfrom
faster-cpython:split-on-oparg-1

Conversation

@markshannon

@markshannonmarkshannon commented Feb 16, 2024

Copy link
Copy Markdown
Member

Adds the split and replicate(N) annotations

split splits uops into two depending on the low bit of the oparg. This removes a few jumps from uops like _LOAD_ATTR_INSTANCE_VALUE.

replicate(N) replicates the original uop for each oparg in range(N). This is particularly valuable for uops that loop over oparg, but it is also useful to inline the oparg at build time rather than when patching.

Comment threadPython/tier2_redundancy_eliminator_cases.c.h Outdated
@Fidget-Spinner

Copy link
Copy Markdown
Member

Also, I like how clean this is in the DSL!

@markshannon

Copy link
Copy Markdown
MemberAuthor

about 1% faster

Comment threadPython/optimizer.c
else if (oparg < _PyUop_Replication[opcode]) {
buffer[pc].opcode = opcode + oparg + 1;
}
else if (opcode == _JUMP_TO_TOP || opcode == _EXIT_TRACE) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe use op_is_end here?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's a static function in another file.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We'll leave it up to Ken Jin to turn it into a macro or static inline in a header. (Because he's adding another opcode that could end the list of opcodes, a new JUMP variant.)

@Fidget-SpinnerFidget-Spinner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good in general, just one minor comment.

properties=compute_properties(op),
)
if effect_depends_on_oparg_1(op) and "split" in op.annotations:
result.properties.oparg_and_1 = True

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For code consistency, shouldn't this be compute_properties?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't what be compute_properties?

@Fidget-SpinnerFidget-SpinnerFeb 19, 2024

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Woops I meant shouldn't this be computed in compute_properties ?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The oparg_and_1 property only applies to the base uop, not the replicas as their behavior does not depend on oparg & 1. compute_properties computes the properties from the definition only, so we would need to modify oparg_and_1 anyway.

@gvanrossumgvanrossum left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cool!

Comment threadPython/optimizer.c
else if (oparg < _PyUop_Replication[opcode]) {
buffer[pc].opcode = opcode + oparg + 1;
}
else if (opcode == _JUMP_TO_TOP || opcode == _EXIT_TRACE) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We'll leave it up to Ken Jin to turn it into a macro or static inline in a header. (Because he's adding another opcode that could end the list of opcodes, a new JUMP variant.)

Comment threadPython/executor_cases.c.h
Comment threadTools/cases_generator/tier2_generator.py
@encukou

encukou commented Feb 20, 2024

Copy link
Copy Markdown
Member

The refleaks buildbot failed on test.test_capi.test_opt.TestUops.test_confidence_score. Likely causes: GH-114142, GH-115558, or GH-115688
I'll investigate later if it's not fixed; you probably have more context.

Edit: it's likely to be fixed in #115728

@markshannon
markshannon deleted the split-on-oparg-1 branch February 21, 2024 16:19
woodruffw pushed a commit to woodruffw-forks/cpython that referenced this pull request Mar 4, 2024
LukasWoodtli pushed a commit to LukasWoodtli/cpython that referenced this pull request Jan 22, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@markshannon@Fidget-Spinner@encukou@mdboom@gvanrossum