Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[mypyc] Use a native unboxed representation for floats #14880

Merged
merged 56 commits into from
Mar 14, 2023
Merged

Conversation

JukkaL
Copy link
Collaborator

@JukkaL JukkaL commented Mar 11, 2023

Instead of each float value being a heap-allocated Python object, use unboxed C doubles to represent floats. This makes float operations much faster, and this also significantly reduces memory use of floats (when not stored in Python containers, which always use a boxed representation).

Update IR to support float arithmetic and comparison ops, and float literals.

Also add a few primitives corresponding to common math functions, such as math.sqrt. These don't require any boxing or unboxing. (I will add more of these in follow-up PRs.)

Use -113.0 as an overlapping error value for floats. This is similar to native ints. Reuse much of the infrastructure we have to support overlapping error values with native ints (e.g. various bitmaps).

Also improve support for negative float literals.

There are two backward compatibility breaks worth highlighting. First, assigning an int value to a float variable is disallowed within mypyc, since narrowing down to a different value representation is inefficient and can lose precision. Second, information about float subclasses is lost during unboxing.

This makes the bm_float benchmark about 5x faster and the raytrace benchmark about 3x faster.

Closes mypyc/mypyc#966 (I'll create separate issues for remaining open issues).

JukkaL added 30 commits March 11, 2023 16:19
Instead of each float value being a heap-allocated Python object, use
unboxed C doubles to represent floats. This makes float operations
much faster, and this also significantly reduces memory use of floats
(when not stored in Python containers, which always use a boxed
representation).

Update IR to support float arithmetic and comparison ops, and float
literals.

Also add a few primitives corresponding to common math functions, such
as `math.sqrt`. These don't require any boxing or unboxing. (I will add
more of these in follow-up PRs.)

Use -113.0 as an overlapping error value for floats. This is similar
to native ints. Reuse much of the infrastructure we have to support
overlapping error values with native ints (e.g. various bitmaps).

Also improve support for negative float literals.

There are two backward compatibility breaks worth highlighting. First,
assigning an int value to a float variable is disallowed within mypyc,
since narrowing down to a different value representation is
inefficient and can lose precision. Second, information about float
subclasses is lost during unboxing.

This makes the bm_float benchmark about 5x faster and the
raytrace benchmark about 3x faster.

Closes mypyc/mypyc#966 (I'll create separate issues for remaining open
issues).
@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

@github-actions

This comment has been minimized.

JukkaL added a commit to mypyc/mypyc-benchmarks that referenced this pull request Mar 12, 2023
JukkaL added a commit to mypyc/mypyc-benchmarks that referenced this pull request Mar 12, 2023
@github-actions
Copy link
Contributor

According to mypy_primer, this change has no effect on the checked open source code. 🤖🎉

@JukkaL JukkaL merged commit d05974b into master Mar 14, 2023
@JukkaL JukkaL deleted the native-float-3 branch March 14, 2023 19:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Native unboxed floats
2 participants