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 существенно уступает по п��оизводительности вышеуказанным оппонетам, что достаточно ожидаемо, ввиду отсутствия такого большого опыта в разработке двоичных трансляторов.