10 ноября 2020 года произошло во многом эпохальное событие в индустрии микропроцессоров - компания Apple презентовала новый Mac Mini, главной фишкой которого являлся чип собственной разработки Apple M1. Данный процессор, без преувеличения, является знаковым достижением для экосистемы ARM - наконец-то был сделан чип, обошедший конкурентов из Intel в той нише, где архитектура x86 доминировала десятилетия.
Но для нас главным интересом является не сам процессор M1, а технология двоичной трансляции Rosetta 2, разработанная с целью запуска legacy x86 кода, не успевшего переехать на архитектуру ARM. Компания Apple имеет большой опыт в разработке решений по двоичной трансляции и является признанным лидером в данной области. Первая версия двоичного транслятора Rosetta появилась в 2006-ом году, когда помогла компании Apple совершить переход с архитектуры PowerPC на x86. И хотя в этот раз гостевая и целевая платформы отличались от тех, которые были в 2006-ом, очевидно, что весь опыт, накопленный инженерами Apple за эти годы, был учтён и вложен в следующую версию Rosetta 2. Тем интреснее было сравнить решение от Apple с аналогичным продуктом Huawei ExaGear (ведущего свою родословную от Eltechs ExaGear), разрабатываемого нашей командой. Заодно, мы оценили производительность двоичной трансляции из x86 в ARM от компании Microsoft (входящей в состав MS Windows 10 для Arm устройств) на лэптопе Huawei MateBook E. На текущий момент, это все известные нам решения по двоичной трансляции из X86 в ARM, доступные на широком рынке.
Т.к. все решения изначально созданы под разные операционные системы (Huawei Exagear – под Linux, Apple Rosetta 2 - под MacOS, Microsoft binary translator – под MS Windows), возникла необходимость найти корректный метод сравнения, т.к. напрямую провести запуски было невозможно. Мы приняли за основу метрику «эффективности трансляции» - это отношение показателя времени исполнения бенчмарка в нативном для платформы режиме (ARM в нашем случае) ко времени запуска этого же бенчмарка в x86-кодах запущенного под двоичным транслятором(или же обратная величина в случае измерения попугаев «больше-лучше»). Иными словами, мы сравнивали то, сколько процентов от нативного исполнения достигает бенчмарк в режиме двоичной трансляции. Такой же метрикой пользовались эксперты с сайта Anandtech, выпустившие обзорную статью про Apple M1, где также были приведены цифры производительности Rosetta 2.
Все замеры проведены в однопоточном режиме, т.к. для нас было важно замерить именно качество оттранслированного кода, насколько он уступает нативному.
Huawei ExaGear vs Apple Rosetta 2
Итак, начнём сравнение Huawei ExaGear с Apple Rosetta 2 на Apple MacBook Pro (M1). Тесты под Rosetta 2 запускаются в родной MacOS BigSur 11.1, тесты под ExaGear - в виртуалке с Linux kernel 5.4.1.
Geekbench 5.4.1 (чем выше – тем лучше):
Bench name | ARM64 MacOS | Rosetta 2 (x86) | Rosetta 2 efficiency | ARM64 Linux (VM) | Exagear (x86) | Exagear efficiency |
AES-XTS | 2769 | 1720 | 62.1% | 2703 | 1823 | 67.4% |
Text Compression | 1502 | 1319 | 87.8% | 1438 | 1349 | 93.8% |
Image Compression | 1356 | 1056 | 77.9% | 1335 | 1230 | 92.1% |
Navigation | 1716 | 1678 | 97.8% | 1717 | 1605 | 93.5% |
HTML5 | 1642 | 1066 | 64.9% | 1717 | 1302 | 75.8% |
SQLite | 1400 | 1000 | 71.4% | 1328 | 1229 | 92.6% |
PDF Rendering | 1600 | 1324 | 82.8% | 1738 | 1464 | 84.2% |
Text Rendering | 1778 | 1290 | 72.6% | 1726 | 1480 | 85.8% |
Clang | 1661 | 1244 | 74.9% | 1738 | 1335 | 76.8% |
Camera | 1612 | 1278 | 79.3% | 1464 | 1148 | 78.4% |
N-Body Physics | 1789 | 1503 | 84.0% | 1830 | 1616 | 88.3% |
Rigid Body Physics | 1772 | 1352 | 76.3% | 1690 | 1176 | 69.6% |
Gaussian Blur | 1407 | 1251 | 88.9% | 1435 | 1297 | 90.4% |
Face Detection | 2215 | 1500 | 67.7% | 2216 | 1632 | 73.7% |
Horizon Detection | 1964 | 1268 | 64.6% | 1879 | 1386 | 73.8% |
Image Inpainting | 3214 | 2893 | 90.0% | 3345 | 2903 | 86.8% |
HDR | 2486 | 2250 | 90.5% | 2761 | 2690 | 97.4% |
Ray Tracing | 2553 | 1970 | 77.2% | 2055 | 1992 | 96.9% |
Structure from Motion | 1406 | 1068 | 76.0% | 1507 | 1150 | 76.3% |
Speech Recognition | 1601 | 1371 | 85.6% | 1485 | 1355 | 91.3% |
Machine Learning | 1243 | 713 | 57.4% | 1229 | 727 | 59.2% |
GeoMean | 76.9% | 82.4% |
Как видно, средняя производительность Huawei ExaGear ( 82.4%) обгоняет Apple Rosetta 2 (76.9%), причём проигрывает ExaGear только на 4-х тестах из 21-го – Navigation, Camera, Rigid Body Physics и Image Inpainting.
Тут надо сделать небольшое, но достаточно интересное отступление. Дело в том, что при более детальном изучении процессора M1 можно обнаружить, что несмотря на то, что он официально вышел только в ноябре 2020-го года (а значит его система команд была зафиксирована задолго до этого момента, явно не позднее 2019-го года), он содержит в себе набор расширений архитектуры ArmV8.7, которая официально была принята и опубликована только осенью 2020-го года. Причём существенная часть этого расширения является ничем иным, как аппаратной поддержкой двоичной трансляции, призванной упростить трансляцию некоторых операций из архитектуры x86. Т.е. компания Apple разрабатывала процессор с расширением, которое на тот момент не было официальным. Более того, при внимательно ретроспективном взгляде на более ранние расширения видно, что ArmV8.5 и ArmV8.4 также включали в себя операции для поддержки двоичной трансляции. Таким образом очевидно, что компания Apple достаточно давно в кооперации с Arm Ltd. работало над аппартной поддержкой своего решения. Apple Rosetta 2 использует все данные возможности и поэтому имеет определённое преимущество, по сравнению с Huawei Exagear, который данные расширения не использует.
Именно поэтому данные 4 теста Apple Rosetta 2 исполняет эффективнее. Но тем не менее, на остальных тестах, даже с учётом имеющегося гандикапа у решения от Apple, Huawei ExaGear показывает более высокие результаты.
Также стоит отметить, что цифры производительности в нативном Arm-режиме на MacOS и Linux в целом достаточно близки, что подтверждает общую корректность нашего подхода по сравнению производительности двоичных трансляторов.
Далее, сравним запуски на SpecCPU2006 и SpecCPU2017. Измеряется время работы каждого подтеста в секундах. Исключены бенчмарки, написанные на Fortran.
SpecCPU2006 (секунды)
Компилятор: clang 11.0 -O3 –flto
INT tests | ARM64 MacOS | Rosetta 2 (x86) | Rosetta 2 efficiency | ARM64 Linux (VM) | ExaGear (x86) | ExaGear efficiency |
400.perlbench | 157 | 218 | 72.0% | 145 | 166 | 87.3% |
401.bzip2 | 248 | 326 | 76.1% | 247 | 282 | 87.6% |
429.mcf | 106 | 118 | 89.8% | 129 | 123 | 104.9% |
445.gobmk | 178 | 198 | 89.9% | 183 | 193 | 94.8% |
456.hmmer | 159 | 170 | 93.5% | 164 | 142 | 115.5% |
458.sjeng | 246 | 300 | 82.0% | 253 | 281 | 90.0% |
462.libquantum | 94 | 107 | 87.9% | 101 | 128 | 78.9% |
464.h264ref | 203 | 328 | 61.9% | 201 | 271 | 74.2% |
471.omnetpp | 146 | 179 | 81.6% | 173 | 193 | 89.6% |
473.astar | 184 | 203 | 90.6% | 196 | 201 | 97.5% |
483.xalancbmk | 82 | 104 | 78.8% | 96 | 112 | 85.7% |
GeoMean Int | 81.7% | 90.8% | ||||
FP tests | ||||||
433.milc | 95 | 130 | 73.1% | 98 | 127 | 77.2% |
444.namd | 139 | 172 | 80.8% | 139 | 164 | 84.8% |
447.dealII | 108 | 117 | 92.3% | 115 | 151 | 76.2% |
450.soplex | 91 | 104 | 87.5% | 95 | 107 | 88.8% |
453.povray | 60 | 78 | 76.9% | 52 | 65 | 80.0% |
470.lbm | 113 | 119 | 95.0% | 114 | 99 | 115.2% |
482.sphinx3 | 194 | 207 | 93.7% | 195 | 215 | 90.7% |
GeoMean FP | 85.2% | 86.7% |
SpecCPU2017 (секунды)
Компилятор: clang 11.0 -O3 –flto
INT tests | ARM64 MacOS | Rosetta 2 (x86) | Rosetta 2 efficiency | ARM64 Linux(VM) | ExaGear (x86) | ExaGear efficiency |
500.perlbench_r | 216 | 282 | 76.6% | 210 | 241 | 87.1% |
502.gcc_r | 125 | 164 | 76.2% | 125 | 153 | 81.7% |
505.mcf_r | 202 | 235 | 86.0% | 217 | 231 | 93.9% |
520.omnetpp_r | 277 | 360 | 76.9% | 295 | 324 | 91.0% |
523.xalancbmk_r | 166 | 204 | 81.4% | 189 | 197 | 95.9% |
525.x264_r | 154 | 176 | 87.5% | 161 | 189 | 85.2% |
531.deepsjeng_r | 175 | 221 | 79.2% | 190 | 197 | 96.4% |
541.leela_r | 282 | 294 | 95.9% | 285 | 277 | 102.9% |
557.xz_r | 275 | 319 | 86.2% | 307 | 335 | 91.6% |
GeoMean Int | 82.7% | 91.6% | ||||
FP tests | ||||||
508.namd_r | 111 | 134 | 82.8% | 111 | 133 | 83.5% |
510.parest_r | 308 | 331 | 93.1% | 304 | 336 | 90.5% |
511.povray_r | 211 | 320 | 65.9% | 196 | 253 | 77.5% |
519.lbm_r | 121 | 153 | 79.1% | 127 | 142 | 89.4% |
526.blender_r | 149 | 179 | 83.2% | 163 | 175 | 93.1% |
538.imagick_r | 210 | 345 | 60.9% | 227 | 271 | 83.8% |
544.nab_r | 156 | 186 | 83.9% | 150 | 174 | 86.2% |
GeoMean FP | 77.7% | 86.1% |
Как видим, на SpecCPU2006/2017 ситуация аналогична тестам на Geekbench – в среднем Huawei ExaGear обыгрывает Apple Rosetta 2, хотя на отдельных подтестах ситуация обратная.
Huawei ExaGear vs Microsoft binary translator
Теперь сравним производительность Huawei ExaGear с двоичным транслятором от Microsoft на Huawei MateBook E.
ExaGear запускается в окружении WSL, транслятор от Microsoft в родной MS Windows 10.
В запусках ExaGear в окружении WSL обнаружилась проблема, что WSL не предоставляет используемые нами для профилирования таймеры, из-за чего не включается режим дооптимизации кода и ExaGear не демонстрирует максимальные цифры производительности. Потери скорости в таком случае можно оценить в 10-20% в зависимости от бенчмарка. Тем не менее, с учётом вышеприведённых результатов сравнения с Apple Rosetta 2, общая картина будет ясна.
Geekbench 5.4.1 (чем выше – тем лучше):
Bench name | ARM64 Windows | MS BT (x86) | MS BT efficiency | ARM64 WSL | ExaGear (x86) | ExaGear efficiency |
AES-XTS | 872 | 437 | 50.1% | 892 | 437 | 49.0% |
Text Compression | 514 | 381 | 74.1% | 518 | 451 | 87.1% |
Image Compression | 577 | 328 | 56.8% | 606 | 433 | 71.5% |
Navigation | 402 | 393 | 97.8% | 522 | 502 | 96.2% |
HTML5 | 517 | 224 | 43.3% | 522 | 371 | 71.1% |
SQLite | 534 | 240 | 44.9% | 565 | 412 | 72.9% |
PDF Rendering | 515 | 253 | 49.1% | 574 | 462 | 80.5% |
Text Rendering | 530 | 264 | 49.8% | 544 | 430 | 79.0% |
Clang | 485 | 187 | 38.6% | 601 | 405 | 67.4% |
Camera | 437 | 221 | 50.6% | 479 | 308 | 64.3% |
N-Body Physics | 390 | 253 | 64.9% | 390 | 317 | 81.3% |
Rigid Body Physics | 634 | 299 | 47.2% | 717 | 485 | 67.6% |
Gaussian Blur | 279 | 217 | 77.8% | 282 | 238 | 84.4% |
Face Detection | 598 | 301 | 50.3% | 657 | 387 | 58.9% |
Horizon Detection | 484 | 235 | 48.6% | 542 | 331 | 61.1% |
Image Inpainting | 580 | 419 | 72.2% | 775 | 504 | 65.0% |
HDR | 637 | 481 | 75.5% | 1035 | 843 | 81.4% |
Ray Tracing | 758 | 296 | 39.1% | 762 | 513 | 67.3% |
Structure from Motion | 379 | 203 | 53.6% | 457 | 289 | 63.2% |
Speech Recognition | 346 | 283 | 81.8% | 355 | 312 | 87.9% |
Machine Learning | 252 | 108 | 42.9% | 240 | 128 | 53.3% |
GeoMean | 55.6% | 70.9% |
SpecCPU2017 (секунды)
Компилятор: clang 11.0 -O3 -flto
INT tests | ARM64 Windows | MS BT (x86) | MS BT efficiency | ARM64 WSL | ExaGear (x86) | ExaGear efficiency |
500.perlbench_r | 824 | 1526 | 54.0% | 800 | 1042 | 76.8% |
502.gcc_r | 716 | 1119 | 64.0% | 690 | 820 | 84.1% |
505.mcf_r | 781 | 1069 | 73.1% | 792 | 992 | 79.8% |
520.omnetpp_r | 1280 | 2025 | 63.2% | 1186 | 1414 | 83.9% |
525.x264_r | 460 | 771 | 59.7% | 481 | 638 | 75.4% |
531.deepsjeng_r | 507 | 711 | 71.3% | 524 | 629 | 83.3% |
541.leela_r | 564 | 897 | 62.9% | 547 | 652 | 83.9% |
557.xz_r | 733 | 938 | 78.1% | 733 | 827 | 88.6% |
GeoMean Int | 65.4% | 81.9% | ||||
FP tests | ||||||
508.namd_r | 423 | 698 | 60.6% | 429 | 619 | 69.3% |
510.parest_r | 1006 | 1274 | 79.0% | 970 | 1179 | 82.3% |
511.povray_r | 808 | 1540 | 52.5% | 761 | 1027 | 74.1% |
519.lbm_r | 428 | 767 | 55.8% | 429 | 549 | 78.1% |
526.blender_r | 474 | 688 | 68.9% | 484 | 716 | 67.6% |
538.imagick_r | 560 | 1075 | 52.1% | 566 | 847 | 66.8% |
544.nab_r | 522 | 1050 | 49.7% | 517 | 617 | 83.8% |
GeoMean FP | 59.0% | 74.3% |
Сборка SpecCPU2006 под Windows вызвала многочисленные ошибки компиляции. Поэтому было решено не тратить время на запуск данного бенчмарка при наличии результатов для SpecCPU2017, которые в целом достаточно идентичны SpecCPU2006.
Резюме
Инженеры компании Apple выпустили не только выдающийся процессор, но и снабдили его очень приличным двоичным транслятором для запуска x86-приложений, показывающим достойные результаты производительности. Тем не менее, Huawei ExaGear уверенно обыгрывает Apple Rosetta 2.
Решение от компании Microsoft существенно уступает по производительности вышеуказанным оппонетам, что достаточно ожидаемо, ввиду отсутствия такого большого опыта в разработке двоичных трансляторов.