-
-
Notifications
You must be signed in to change notification settings - Fork 30.9k
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
Error compiling HACL* Blake2 support for macOS universal binaries #123748
Comments
macOS universal builds are a special form of cross-compile builds that take advantage of the built-in support in Apple's Note, that this is a potential release blocker issue as the macOS installer binaries we provide with each release are built as a universal2 build. The first 3.14 release, 3.14.0a1, is currently scheduled for 2024-10-15. |
Right, except that here it's made even more complicated by the fact that some files should be included in the Intel builds but not the ARM builds. I'm not sure how to achieve that except to special-case the list of files that go into the build with an Apple-specific bit of logic...? |
What kind of files and at what point are they used: configuring, building, installing, executing? |
The files Modules/_hacl/Hacl_Hash_Blake2s_Simd128.c and Modules/_hacl/Hacl_Hash_Blake2b_Simd256.c should only be compiled on x64/x86. They are then linked into the python executable. They may be used at runtime if the CPU that python is then executed on has the right support. So, in more detail:
Let me know if I can provide more details? Thanks! |
Based on this, it sounds like there's no reasonable prospect of getting the Simd128 and Simd256 files to compile on ARM64. AFAIK it's not possible to compile a file for one architecture and link into a universal build - I might be wrong on that, but if I am, I'm going to guess the configure script is going to be messy. On that basis, it sounds like universal builds won't be able to support those options. That's easy enough to override in the configure process - an extra if block checking for universal on Darwin can disable the option. I agree it's a little weird that a pure x86-64 build will have support when ARM and universal won't, but given the new platform that the majority of macOS users are on won't support it, I don't think many users will notice the discrepancy. |
How about putting an #ifdef in those files that makes them empty when on arm64? Would that help? Like:
knowing that HACL_CAN_COMPILE_SIMD128 is not defined on ARM64. @gpshead might have further thoughts |
That's the thing though - universal builds are implemented as a single compilation passes, so HACL_CAN_COMPILE_SIMD128/256 is defined. These are turned on because the compiler flags that enable them are legal compiler options when x86_64 is one of the compiler targets, so the constant is defined by the single-pass configure script. If we were going down the |
A potential fix based on an improved autoconf check: #123927 |
Does macOS really require all files in a universal2 build to be the same? that seems silly. it is common to separate arch specific code into its own files. editoral comments about their toolchain choices aside (clearly they channeled practicality vs purity there), if that is true, just making the simd files have C preprocessor checks that effectively make them empty when the aarch64 side of compilation is running makes sense. the x86_64 side of the compilation (surely there are two independent compiler passes running behind the scenes of their
I'd actually prefer the #define path. A configure test cannot understand the dual compilation and would unnecessarily leave Intel performance on the table. There are a ton of Intel mac's out there and I assume they'll probably be supported until 2030. It becomes more important in the future if/when we get arch specific accelerated HACL* SHA implementations so that hashlib doesn't need OpenSSL to be performant. (blake2 is less important vs those "Standard"s) |
Not unless you're compiling multiple architectures in a single pass, as CPython does. If we compiled for x86_64, then compiled for ARM64, then merged the two binaries into a universal binary, the problem wouldn't exist. However, the single-pass autoconf-based build determines the modules to be compiled, and the flags to be passed in to that compile, based on a single pass compiler check.
Ok - I'll take a look and see what I can make work. My first attempt at doing this failed, but I didn't look too closely at why - I'm probably missing something obvious. |
Thanks, I agree that the pass with the #defines sounds better. This can probably be done with a stub file #if defined (...)
#include Hacl_Hash_Blake2b_Simd256.c
#endif so as to leave the ingestion of upstream HACL* unchanged, without having to hack _hacl/refresh.sh in cpython. |
Q: do we have a macOS universal2 buildbot? |
Not that I'm aware of. It's easy enough to add the appropriate options to CPython |
…D128 on macOS (#123989) Add conditional compilation rules to allow HACL SIMD256 and SIMD128 to be ignored on the ARM64 pass of universal2 macOS builds.
…nd SIMD128 on macOS (python#123989) Add conditional compilation rules to allow HACL SIMD256 and SIMD128 to be ignored on the ARM64 pass of universal2 macOS builds.
Bug report
Bug description:
#99108 tracks the addition of a native HACL implementation to CPython. #119316 added an implementation of Blake2 to
hashlib
.This compiles fine on single architecture macOS builds (as verified by CI); but universal2 builds running on an ARM64 laptop generate a compilation error:
To reproduce the problem: on a macOS machine, configure the build with:
This will eventually yield the compilation error:
From what I can make out, the error comes from the detection of
-mavx2
support. On a bare configure on an ARM64 machine,-mavx2
support is apparently unsupported:and as a result, the
Hacl_Hash_Blake2b_Simd256.c
module isn't compiled. However, when universal support is enabled,-mavx2
is supported:and the module is included. Based on recent configure logs for x86_64 macOS builds, it appears that
-mavx2
is supported on x86_64.I'm not sufficiently familiar with the subject matter to comment on whether the fix here is to fix the autoconf detection to disable the problematic module on universal builds, or to correct the implementation so that it can compile for universal builds.
Tagging @msprotz @R1kM as the authors of the recent HACL* changes.
CPython versions tested on:
CPython main branch
Operating systems tested on:
macOS
Linked PRs
The text was updated successfully, but these errors were encountered: