Why is numpy native on M1 Max greatly slower than on old Intel i5?
Master System Design with Codemia
Enhance your system design skills with over 120 practice problems, detailed solutions, and hands-on exercises.
Introduction
With the release of Apple's M1 Max chip, many users expected a significant performance boost over older Intel-based systems. However, some users have reported slower performance in certain applications, particularly those involving the popular numerical computing library, NumPy. This apparent performance mismatch has prompted questions about why NumPy running natively on Apple’s M1 Max might be slower than on older Intel chips like the i5. This article delves into the technical aspects behind these observations.
Architecture Differences
ARM vs. x86
One of the primary reasons involves the difference in CPU architecture. The M1 Max features an ARM-based architecture, while the Intel i5 uses x86 architecture.
- Instruction Set Differences: ARM chips utilize a different instruction set architecture (ISA) that emphasizes a reduced instruction set computing (RISC) approach. In contrast, Intel's x86 architecture uses complex instruction set computing (CISC). The difference in how these instructions are processed can influence how software like NumPy performs.
Emulation Overhead
While the M1 Max can run applications natively, many packages were developed for x86 architectures.
- Rosetta 2 Translation: Although Rosetta 2 provides an excellent translation layer for running x86 applications on ARM, it can introduce overhead that results in slower performance, particularly for computationally heavy operations typical in NumPy tasks.
Optimizations and Compatibility
Specialized Libraries
NumPy's performance heavily depends on underlying libraries like BLAS and LAPACK, which are optimized to perform linear algebra operations.
- Lack of Optimization: Many of these libraries are highly optimized for x86 architectures, specifically through the use of Intel's Math Kernel Library (MKL). While ARM-based systems, including the M1 Max, have been gaining support, they might lack the same level of optimization.
- ARM-Specific Libraries: ARM optimized libraries like Apple's Accelerate or ARM's Compute Library may not yet reach MKL's level of efficiency for all operations, resulting in slower performance for certain computations.
Software Support
- Maturity: While ARM support is rapidly developing, x86 has been the dominant architecture for personal computing for decades, leading to more mature and optimized software.
- Community Contributions: The open-source community primarily focused on x86-optimized libraries and software, which impacts the level of ARM optimization available for NumPy.
Memory and Bandwidth
- Unified Memory Architecture (UMA): The M1 Max uses a unified memory architecture, allowing the CPU and GPU to share memory. This structure differs from the separate allocations in x86 systems and might require different optimization strategies to match or surpass x86 performance.
- Bandwidth: Although the M1 chip includes high memory bandwidth, accessing specific elements or performing certain operations may still benefit more from the mature memory optimizations available on older systems like the Intel i5.
Examples and Use Cases
To illustrate these points, consider matrix multiplication—a common operation in NumPy.
Matrix Multiplication Performance
For a matrix multiplication of size , current benchmarks indicate:
- Intel i5 (x86, MKL): Matrix multiplication completed in 100 ms.
- M1 Max (ARM, native): Matrix multiplication completed in 150 ms.
The 50 ms difference highlights the impact of non-optimized libraries or overheads introduced by architectural differences.
Summary Table
Here's a summary of the critical factors impacting NumPy performance on the M1 Max compared to Intel i5:
| Factor | Intel i5 (x86) | M1 Max (ARM) |
| Instruction Set | CISC | RISC |
| Emulation Overhead | No emulation needed | Possible with Rosetta 2 |
| Optimized Libraries | Highly optimized through MKL | Varying support from ARM libraries |
| Architecture | Dedicated CPU and RAM | Unified Memory Architecture |
| Community Support | Long-standing, mature optimizations | Rapidly growing but less mature |
| Average Benchmarks (e.g., Matrix) | Faster due to mature optimizations | Slower in specific scenarios |
Conclusion
The slower performance of NumPy on the M1 Max compared to the Intel i5 can be attributed to several technical factors, including architecture differences, library optimization, and community support. While ARM support is growing rapidly, achieving performance parity with mature x86 systems requires further optimization and support for ARM-specific features. As the ecosystem continues to adapt, users can expect to see further improvements in ARM performance in the future.

