Mengompilasi C / C ++ di Apple M1





Penasaran dengan benchmark M1 yang mengesankan, saya mengeluarkan Mac Mini terbaru untuk mengukur kecepatan kompilasi saya di C / C ++.



Kami mengukur build2 lokal (tanpa repositori paket), yang sebagian besar menyertakan kode C ++ (611 unit terjemahan) dengan beberapa blok C (29) dan tautan di antaranya (19). Tolok ukur ini hanya memerlukan kompiler C ++ dan disertakan dalam rangkaian pengujian Phoronix , sehingga dapat dibandingkan dengan sejumlah besar prosesor.



Tolok ukur Phoronix saat ini menggunakan build2 0.12.0, kami memiliki 0.13.0 (rilis saat ini), di sini build tersebut sekitar 10% lebih lambat.


Setelah menyiapkan Mac OS dan menginstal alat baris perintah untuk XCode 12.2, kami memiliki semua yang kami butuhkan:



$ clang++ --version
Apple clang version 12.0.0 (clang-1200.0.32.27)
Target: arm64-apple-darwin20.1.0
      
      





Dilihat _LIBCPP_VERSION



dari __version



file judulnya libc++



, versi Clang Clang vanilla Apple ini menyimpang dari suatu tempat dalam proses pengembangan 10.0.0.



Anda mungkin juga telah memperhatikan bahwa nama prosesor di triplet Apple Clang berbeda dari yang standar aarch64



. Sebenarnya config.guess



menunjukkan yang berikut:



$ ./config.guess
aarch64-apple-darwin20.1.0
      
      





Untuk menghindari penggunaan dua nama yang sama, build2 dikanonisasi arm64



dalam aarch64



, jadi buildfiles



kita selalu melihat aarch64 in.


Mari kita periksa jumlah utas perangkat keras di sysctl



:



$ sysctl -n hw.ncpu
8
      
      





Ada 8 utas di sini, ini adalah 4 inti produktif dan 4 yang hemat energi. Dalam proses pertama, kami menggunakan semua inti. Jelas ini memberikan hasil terbaik:



$ time sh ./build2-install-0.13.0.sh --local --yes ~/install
163s
      
      





Merupakan kejutan yang menyenangkan bahwa build2 0.13.0 berfungsi tanpa masalah, meskipun dirilis lebih awal dari M1. Karena ARM memiliki pengurutan memori yang lemah, ini juga berfungsi sebagai pengujian tambahan untuk implementasi multithreaded dari build2 dan penggunaan atomics yang berat.


Pertama, mari bandingkan M1 dengan workstation saya pada 8-core Intel Xeon E-2288G (pada dasarnya adalah i9-9900K plus ECC). Build yang sama pada vanilla Clang membutuhkan 131 detik. Meski ini hasil terbaik, performa M1 tetap impresif. Terutama jika Anda mempertimbangkan bahwa selama kompilasi, workstation secara harfiah memuntahkan udara panas dan dengungan seperti pesawat terbang, dan M1 berdesir pelan dengan aliran udara hangat yang nyaris tidak terlihat.



Tolok ukur single-threaded mengevaluasi performa CPU dalam build inkremental:



$ time sh. /build2-install-0.13.0.sh --local --yes-j 1 ~ / install
691s
      
      





Inti E-2288G membutuhkan waktu 826 detik. Jadi inti 5GHz Xeon sebenarnya lebih lambat dari inti 3.2GHz M1.



Hasil menarik lainnya adalah proses empat thread yang hanya menggunakan inti M1 yang efisien:



$ time sh ./build2-install-0.13.0.sh --local --yes -j 4 ~/install
207s
      
      





Meskipun agak lebih lambat dari tes delapan inti, ini menggunakan lebih sedikit memori. Jadi, opsi ini masuk akal pada sistem dengan RAM yang tidak mencukupi (seperti pada semua mesin M1 modern).



Berikut adalah ringkasan dari semua hasil:



CPU CORES / THREADS TIME
-------------------------
E-2288G 8/16 131s
M1 4 + 4163s
M1 4 207s
M1 1 691s
E-2288G 1 826s


Jelas bahwa dalam banyak hal ini adalah perbandingan apel-ke-jeruk (workstation versus perangkat seluler, desain lama dan teknologi proses versus modern, dll.)



Sekarang mari tambahkan beberapa hasil menarik dari tolok ukur Phoronix. Secara khusus, adalah tepat untuk mengambil indikator workstation dan prosesor seluler terbaru dari Intel dan AMD. Inilah pilihan saya (Anda dapat membuatnya sendiri, ingatlah untuk menambahkan 10% ekstra ke hasil Phoronix; perhatikan juga bahwa sebagian besar tes menggunakan GCC daripada Clang):



CPU CORES / THREADS TIME
------------------------------------------
AMD Threadripper 3990X 64/128 56s
AMD Ryzen 5950X 16/32 71s
Intel Xeon E-2288G 8/16 131s
Apple M1 4 + 4163s
AMD   Ryzen        4900HS   8/16      176s*
Apple                 M1    4         207s
AMD   Ryzen        4700U    8/8       222s
Intel Core         1185G    4/8       281s*
Intel Core         1165G    4/8       295s

* .


Harap dicatat bahwa hasil untuk Intel seluler (1185G) dan AMD (4900HS) terbaik sayangnya belum tersedia, dan angka yang dikutip diekstrapolasi berdasarkan jam dan tolok ukur lainnya.



Dari tabel di atas, mudah untuk melihat bahwa Apple M1 adalah prosesor yang mengesankan, terutama dalam hal konsumsi daya. Selain itu, ini adalah prosesor ARM kelas desktop mainstream pertama. Sebagai perbandingan, build yang sama pada Raspberry Pi 4B membutuhkan waktu 1724 detik, yang lebih dari 10 kali lebih lambat! Meskipun kami tidak dapat mem-boot Linux atau Windows di sini, ada beberapa bukti bahwa mereka berjalan di mesin virtual dengan kinerja yang layak. Akibatnya, pipeline build berkelanjutan berbasis ARM dapat menjadi standar.



Setelah melihat tolok ukur M1, orang bertanya-tanya bagaimana Apple melakukan ini. Meskipun ada banyak spekulasi dengan beberapa elemen ilmu hitam dan sihir, tetapi artikel tentang M1 di Anandtech ini (dan satu lagi di sana melalui tautan) menurut saya merupakan sumber informasi teknis yang cukup baik . Highlight:



TSMC 5

10 ( 11x5G, 14  E-2288G) 7  AMD/TSMC.



LPDDR4-4266 RAM

Intel AMD .



L1

M1 L1 .



L2

Intel AMD, L2 , L3, M1 L2.





M1 memiliki kernel yang sangat luas yang menjalankan beberapa instruksi secara paralel dan / atau tidak berurutan. Ada spekulasi bahwa karena pengurutan memori ARM yang buruk dan pengodean instruksi ukuran tetap, Apple dapat membuat kernel yang jauh lebih luas.


Menarik juga untuk melihat bagaimana Apple dapat menskalakan desain ini ke lebih banyak inti.



All Articles