-
Notifications
You must be signed in to change notification settings - Fork 46
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
Labels
area-native-types
Unboxed types.
feature
Supporting previously unsupported Python, new native types, new features, etc.
speed
Comments
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
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, representfloat
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 asmath.sqrt
to avoid unnecessary boxing/unboxing and slow CPython calls. We don't need to cover allmath
functions -- just the most common/fundamental ones are sufficient.Open issues:
numpy.float64
?math
to support using primitives?**
operator which can produceAny
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.
The text was updated successfully, but these errors were encountered: