M1 MAC上でのAMD64イメージとAARCH64イメージの速度比較

## はじめに
M1MAC上でDockerを実行するとQEMM上でコードを実行することで、イメージによってかってにamd64イメージと、aarch64イメージが選択されます。
M1上で、通常のMACOSのプログラムを実行している気分でいるとamd64イメージでも2，3割程度のオーバーヘッドで動く気がしますが、QEMM上でKernelごと動かしている都合上もっとオーバーヘッドが想像以上に大きかったので、取りあえず測ってみました。

## UNIXベンチの結果
M1MAXでDockerのResource設定でCPU8　メモリ20Gのときの結果です。
裏側でも微妙にブラウザとかつかってたので、あまり厳密な結果じゃないですが、AMD64イメージをM1MACのDockerで実行するとても遅いと言うことで。。
DOCKER上でAARCH64イメージを実行しているとき
System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   55439770.2   4750.6
Double-Precision Whetstone                       55.0       5969.6   1085.4
Execl Throughput                                 43.0       6479.6   1506.9
File Copy 1024 bufsize 2000 maxblocks          3960.0     614480.0   1551.7
File Copy 256 bufsize 500 maxblocks            1655.0     157878.0    953.9
File Copy 4096 bufsize 8000 maxblocks          5800.0    1866978.0   3218.9
Pipe Throughput                               12440.0     944731.2    759.4
Pipe-based Context Switching                   4000.0      17741.4     44.4
Process Creation                                126.0       2757.5    218.9
Shell Scripts (1 concurrent)                     42.4       8041.5   1896.6
Shell Scripts (8 concurrent)                      6.0       3634.8   6057.9
System Call Overhead                          15000.0     641956.6    428.0
                                                                   ========
System Benchmarks Index Score                                        1024.8

DOCKER上でARM64イメージを実行しているとき
System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0    3783450.9    324.2
Double-Precision Whetstone                       55.0        337.5     61.4
Execl Throughput                                 43.0         81.0     18.8
File Copy 1024 bufsize 2000 maxblocks          3960.0     464183.0   1172.2
File Copy 256 bufsize 500 maxblocks            1655.0     120919.0    730.6
File Copy 4096 bufsize 8000 maxblocks          5800.0    1465216.0   2526.2
Pipe Throughput                               12440.0     694340.4    558.2
Pipe-based Context Switching                   4000.0      16642.8     41.6
Process Creation                                126.0        543.9     43.2
Shell Scripts (1 concurrent)                     42.4        329.2     77.6
Shell Scripts (8 concurrent)                      6.0        139.3    232.1
System Call Overhead                          15000.0     434722.2    289.8
                                                                   ========
System Benchmarks Index Score                                         200.6

一応、参考までにExperimental Features にある Use the new virtualization frameworkにチェックをいれたときのAMD64の結果も載せときます。

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0    3788495.6    324.6
Double-Precision Whetstone                       55.0        339.6     61.7
Execl Throughput                                 43.0         82.7     19.2
File Copy 1024 bufsize 2000 maxblocks          3960.0     487335.0   1230.6
File Copy 256 bufsize 500 maxblocks            1655.0     125785.0    760.0
File Copy 4096 bufsize 8000 maxblocks          5800.0    1659651.0   2861.5
Pipe Throughput                               12440.0     736066.3    591.7
Pipe-based Context Switching                   4000.0      24887.4     62.2
Process Creation                                126.0        739.6     58.7
Shell Scripts (1 concurrent)                     42.4        384.1     90.6
Shell Scripts (8 concurrent)                      6.0        171.0    285.0
System Call Overhead                          15000.0     457701.0    305.1
                                                                   ========
System Benchmarks Index Score                                         225.8


## M1 上でのDocker
個人的には一般的な用途というよりは、Dockerをマシンラーニングの環境構築を楽にするためにつかっているので、いろいろM1上のDockerだと制限が多いです。
AMD64の実行は、動くだけでハッピーなのですがそれ以上にUSBパススルーができないからはじまり、カメラとかAudioデバイスをDockerコンテナ上で扱うことが出来ないのがパフォーマンス以上に痛いです。
同様に、GPUにしてもニューラルエンジンにしてもせっかくあってもDoocker上からは使う方法がみつかりません。
速くDocker上からUSBへのダイレクトアクセスと、GPU,ニューラルエンジンが使えるようになって欲しい