Uh oh!
There was an error while loading. Please reload this page.
gh-100239: specialize bitwise logical binary ops on ints - #128927
Conversation
| return (is_nonnegative_compactlong(lhs) && is_nonnegative_compactlong(rhs)); | ||
| } | ||
| #define NONNEGATIVE_LONGS_ACTION(NAME, OP) \ |
There was a problem hiding this comment.
Why restrict to nonnegative longs here? If we do restrict, then we can replace the calls _PyLong_CompactValue with direct access to op->long_value.ob_digit[0]
There was a problem hiding this comment.
Because negative ints need more work at runtime and I don't think they're common with bitwise logical ops.
There was a problem hiding this comment.
The extra work is already done by _PyLong_CompactValue or am missing something? The output of ls OP rhs might not be a compact int, but there are no guards for the output type.
There was a problem hiding this comment.
The extra work is already done by
_PyLong_CompactValueor am missing something?
No, I think you're right. Good point.
The output of
ls OP rhsmight not be a compact int, but there are no guards for the output type.
For bitwise logical operators we should expect the results to have the same size as the inputs.
Uh oh!
There was an error while loading. Please reload this page.
…e-100239.7_HpBU.rst Co-authored-by: Pieter Eendebak <pieter.eendebak@gmail.com>
iritkatriel
commented
Jan 17, 2025
The stats are weird with this PR, lot of misses: https://github.com/faster-cpython/benchmarking-public/blob/main/results/bm-20250116-3.14.0a4%2B-c57fe46/bm-20250116-azure-x86_64-iritkatriel-binaryops-3.14.0a4%2B-c57fe46-pystats-vs-base.md ![]() |
Uh oh!
There was an error while loading. Please reload this page.
chris-eibl
left a comment
There was a problem hiding this comment.
I think non-negative should be dropped in the news entry now?
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
chris-eibl
commented
Jan 21, 2025
And maybe in the title of this pull request, too? |
markshannon
left a comment
There was a problem hiding this comment.
It looks like we are seeing a high proportion of specialization failures for non-compact ints with the & operator.
I don't know why that would be. My guess is that some of the benchmarks are using ints as bit vectors and using more than one digit.
| LOOKUP_SPEC(compactlong_float_specs, oparg); | ||
| LOOKUP_SPEC(float_compactlong_specs, oparg); | ||
| LOOKUP_SPEC(compactlongs_specs, oparg); |
There was a problem hiding this comment.
Why three tables, rather than one?
There was a problem hiding this comment.
A single table would need to have a list of (guard, action) pairs for each OP. So it's a table of tables. Same thing basically.
chris-eibl
commented
Jan 22, 2025
Just a wild guess: could those be from enums, which derive from int? Especially flag enums? |
iritkatriel
commented
Jan 22, 2025
I don't think so. We check for int with |
eendebakpt
commented
Jan 22, 2025
I suspect the misses might be Other python constructions that would causes misses (but are not in pyperformance afaics) are |
iritkatriel
commented
Jan 22, 2025
iritkatriel
commented
Jan 22, 2025
(Would be nice if the report was rendered so that it's easy to see which benchmark contributed to a stat.) |
markshannon
commented
Jan 27, 2025
Do we have benchmarking numbers for this? |
(mdboom edited URL to the public one) |
markshannon
commented
Jan 28, 2025
Performance looks neutral within the noise. Were we expecting a speedup on any particular benchmark, or is there a micro-benchmark that shows a speedup? |
iritkatriel
commented
Jan 29, 2025
Here are some microbenchmark numbers: Old: New: |
markshannon
left a comment
There was a problem hiding this comment.
My interpretation of the results is:
- Shows a measurable speedup for the operators and classes it targets
- Doesn't show an overall slowdown
- This specialization's effectiveness is limited by the small range of compact ints. Something like faster-cpython/ideas#548 should mostly fix that.
@iritkatriel do you agree?
If so, let's merge this.




This adds specialisations for bitwise |, &, ^ on non-negative ints.
I'm not adding more in the same PR so we can more easily bisect in the future if we need to.