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

Native unboxed floats #966

Closed
JukkaL opened this issue Jan 9, 2023 · 0 comments · Fixed by python/mypy#14880
Closed

Native unboxed floats #966

JukkaL opened this issue Jan 9, 2023 · 0 comments · Fixed by python/mypy#14880
Assignees
Labels
area-native-types Unboxed types. feature Supporting previously unsupported Python, new native types, new features, etc. speed

Comments

@JukkaL
Copy link
Collaborator

JukkaL commented Jan 9, 2023

Mypyc currently uses heap allocated (boxed) CPython objects to represent float values. This is both slow and can waste memory, especially once we support packed arrays (#840). Instead, represent float values as C double values, similar to how we are going to support native integers (#837).

Native floats will use an overlapping error value, similar to native integers. We could potentially also reserve a specific NaN value to be used as an error value, but overlapping error values seem cleaner and they might even be more efficient, at least on some architectures.

We'll also need some primitives for math functions such as math.sqrt to avoid unnecessary boxing/unboxing and slow CPython calls. We don't need to cover all math functions -- just the most common/fundamental ones are sufficient.

Open issues:

  • How should we handle interactions with NumPy floating point types such as numpy.float64?
  • Which are the most important functions in math to support using primitives?
  • What to do with the ** operator which can produce Any types? The simplest thing is to just go with the types mypy can infer, and sometimes the result will be boxed.

The open issues don't need to be resolved to land an initial implementation.

@ichard26 ichard26 added speed feature Supporting previously unsupported Python, new native types, new features, etc. area-native-types Unboxed types. labels Jan 13, 2023
JukkaL added a commit to python/mypy that referenced this issue 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 a commit to python/mypy that referenced this issue Mar 14, 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).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area-native-types Unboxed types. feature Supporting previously unsupported Python, new native types, new features, etc. speed
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants