CentOS 7 for Raspberry Pi 4 における armv7l (32bit) と aarch64 (64bit) の比較

ようやく CentOS 7 for Raspberry Pi 4 にて 64bit である aarch64 が出てきたということで、個人的に気になる箇所の比較をしてみた。
なお、aarch64 版は、ソフト・リアルタイムモードで動くため、CONFIG_PREEMPT オプションのオーバーヘッドが発生している。
そのため、応答性は良くなっているが、スループットは下がっているはず。

■armv7l のメリット
・リリースされてから長期間経っているため、きっと安定している
・作成したバイナリが RPi, 2, 3, 4, Zero で動く
・aarch64 よりも、メモリ消費は少ない(はずだ)

■aarch64 のメリット
・1プロセスが扱えるメモリ量が増えてる
・Linux Kernel のコードのうち、新しい機能については aarch64 は存在するが armv7l では未実装なことが増えてきた

■CentOS 7 aarch64 for RPi のメリット
・Red Hat Enterprise Linux の ARM 版は、aarch64 となるので、EPEL にも aarch64 版が置いてある
※ただし、EPEL for aarch64 は、すでに End of Life となっているため、最新版を使いたければ Source RPM からリビルドする必要がある

■Unixbench armv7l [32bit] (Single) vs aarch64 [64bit] (Single)

Test case armv7l
[32bit]
(Single)
aarch64 PREEMPT
[64bit]
(Single)
Diff
Dhrystone 2 using register variables 10052205.5 9009820.4 89.6%
Double-Precision Whetstone 1924.9 2083.2 108.2%
Execl Throughput 902.5 1786.4 197.9%
File Copy 1024 bufsize 2000 maxblocks 84579.9 174403.2 206.2%
File Copy 256 bufsize 500 maxblocks 22663.1 52049.7 229.7%
File Copy 4096 bufsize 8000 maxblocks 252302.2 477710.0 189.3%
Pipe Throughput 101935.3 249982.8 245.2%
Pipe-based Context Switching 32388.3 44804.8 138.3%
Process Creation 659.6 3471.6 526.3%
Shell Scripts (1 concurrent) 1721.2 2482.3 144.2%
Shell Scripts (8 concurrent) 469.6 654.1 139.3%
System Call Overhead 404748.2 427454.7 105.6%

整数演算の性能は下がっているけど、それ以外は軒並み性能上昇しているように見える。
シングルコア性能では、平均 93% もの性能向上ということになる。
PREEMPT の影響かどうかを追試験する必要があると思われる。

■Unixbench armv7l [32bit] (Multi) vs aarch64 [64bit] (Multi)

Test case armv7l
[32bit]
(Multi)
aarch64 PREEMPT
[64bit]
(Multi)
Diff
Dhrystone 2 using register variables 40221304.3 35990832.7 89.5%
Double-Precision Whetstone 7048.7 8353.3 118.5%
Execl Throughput 2714.8 4421.3 162.9%
File Copy 1024 bufsize 2000 maxblocks 188384.0 280175.6 148.7%
File Copy 256 bufsize 500 maxblocks 50379.5 82155.2 163.1%
File Copy 4096 bufsize 8000 maxblocks 569007.5 700231.9 123.1%
Pipe Throughput 396386.0 999314.8 252.1%
Pipe-based Context Switching 135080.4 171128.6 126.7%
Process Creation 3672.2 7023.8 191.3%
Shell Scripts (1 concurrent) 3574.6 4861.7 136.0%
Shell Scripts (8 concurrent) 539.8 784.8 145.4%
System Call Overhead 1546762.1 1627901.6 105.2%

整数演算の性能は下がっているけど、それ以外は軒並み性能上昇しているように見える。
マルチコア性能では、平均 47% もの性能向上ということになる。
PREEMPT の影響かどうかを追試験する必要があると思われる。

■openssl speed
・armv7l

OpenSSL 1.0.2k-fips  26 Jan 2017
built on: reproducible build, date unspecified
options:bn(64,32) md2(int) rc4(ptr,char) des(idx,cisc,16,long) aes(partial) idea(int) blowfish(ptr)
compiler: gcc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -Wall -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches   -march=armv7-a -mfpu=vfpv3-d16  -mfloat-abi=hard -Wa,--noexecstack -DPURIFY -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DAES_ASM -DBSAES_ASM -DGHASH_ASM
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md2               1535.56k     3313.24k     4528.73k     4987.90k     5144.58k
mdc2                 0.00         0.00         0.00         0.00         0.00
md4              21207.42k    71370.01k   189962.53k   315975.34k   391391.91k
md5              17001.45k    55127.30k   136488.45k   222074.78k   268563.80k
hmac(md5)        16422.33k    53183.19k   135569.12k   220466.52k   269967.36k
sha1             19461.21k    61449.77k   149914.20k   235552.19k   279385.43k
rmd160           13889.74k    37093.78k    74285.74k    99331.41k   110114.13k
rc4             145813.14k   157858.85k   160272.47k   161548.63k   161928.53k
des cbc          32964.03k    35193.11k    35701.93k    35853.65k    36036.58k
des ede3         12660.96k    13150.46k    13214.55k    13244.07k    13254.66k
idea cbc         31984.72k    33821.62k    34124.71k    34250.07k    34313.56k
seed cbc         37204.52k    38478.08k    38742.78k    38903.81k    38958.42k
rc2 cbc          21375.39k    22138.26k    22315.86k    22366.89k    22396.93k
rc5-32/12 cbc    63409.07k    69825.71k    71568.55k    72123.39k    72621.12k
blowfish cbc     45905.31k    50502.53k    51407.96k    51735.89k    51828.05k
cast cbc         49613.90k    54241.76k    55192.83k    55538.35k    55681.02k
aes-128 cbc      82082.43k    87886.55k    92030.37k    92547.41k    92763.48k
aes-192 cbc      71451.53k    75639.94k    78519.04k    79106.05k    79320.41k
aes-256 cbc      63045.61k    66759.77k    68855.27k    69084.84k    69195.09k
camellia-128 cbc    52737.13k    58109.33k    59474.77k    60032.00k    59973.63k
camellia-192 cbc    42345.01k    45871.85k    46719.40k    47063.04k    47193.04k
camellia-256 cbc    42345.06k    45868.71k    46720.09k    47063.72k    46912.85k
sha256           27257.97k    65178.07k   119831.72k   151423.66k   164279.64k
sha512           10152.91k    40321.73k    60150.10k    83329.02k    93978.62k
whirlpool         2702.87k     5471.85k     8967.51k    10681.45k    11285.85k
aes-128 ige      74202.74k    83911.64k    87940.86k    88807.86k    88544.60k
aes-192 ige      65257.29k    72892.75k    75683.41k    76422.94k    76128.26k
aes-256 ige      58514.23k    64140.20k    66671.90k    66850.47k    66871.30k
ghash           160568.33k   192141.38k   192586.50k   192402.43k   192692.22k
                  sign    verify    sign/s verify/s
rsa  512 bits 0.000304s 0.000023s   3284.5  43291.5
rsa 1024 bits 0.001413s 0.000062s    707.5  16193.8
rsa 2048 bits 0.008292s 0.000202s    120.6   4950.8
rsa 4096 bits 0.051865s 0.000734s     19.3   1361.9
                  sign    verify    sign/s verify/s
dsa  512 bits 0.000369s 0.000275s   2713.7   3632.8
dsa 1024 bits 0.000789s 0.000727s   1268.2   1375.1
dsa 2048 bits 0.002285s 0.002292s    437.6    436.2
                              sign    verify    sign/s verify/s
 256 bit ecdsa (nistp256)   0.0033s   0.0020s    306.9    501.2
 384 bit ecdsa (nistp384)   0.0089s   0.0050s    111.8    199.9
 521 bit ecdsa (nistp521)   0.0218s   0.0113s     45.9     88.3
                              op      op/s
 256 bit ecdh (nistp256)   0.0031s    322.2
 384 bit ecdh (nistp384)   0.0085s    117.3
 521 bit ecdh (nistp521)   0.0207s     48.3

・aarch64

OpenSSL 1.0.2k-fips  26 Jan 2017
built on: reproducible build, date unspecified
options:bn(64,64) md2(int) rc4(ptr,char) des(idx,cisc,16,int) aes(partial) idea(int) blowfish(ptr)
compiler: gcc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -DL_ENDIAN -Wall -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches   -Wa,--noexecstack -DPURIFY -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md2               1674.84k     3435.22k     4680.28k     5147.65k     5302.95k
mdc2                 0.00         0.00         0.00         0.00         0.00
md4              25107.02k    82027.26k   203823.02k   324507.99k   390376.11k
md5              19348.73k    60800.34k   143106.82k   217127.38k   253676.20k
hmac(md5)        14987.76k    49852.76k   126847.91k   206437.03k   252258.99k
sha1             19184.06k    56393.73k   120345.60k   168026.79k   190007.98k
rmd160           10017.87k    24107.65k    43173.03k    53874.69k    58212.35k
rc4             139477.89k   145821.93k   147092.57k   147822.59k   148043.09k
des cbc          31476.63k    34198.61k    34606.25k    34765.82k    34805.08k
des ede3         12694.52k    12977.34k    13035.69k    13065.90k    13074.43k
idea cbc         31936.27k    35514.62k    36178.52k    36346.88k    36383.40k
seed cbc         35082.53k    36105.58k    36372.05k    36414.12k    36440.75k
rc2 cbc          20796.27k    21294.57k    21510.57k    21493.11k    21577.73k
rc5-32/12 cbc    65262.09k    76836.95k    78785.19k    79850.77k    79811.93k
blowfish cbc     50312.92k    54436.33k    55401.64k    55774.21k    55926.78k
cast cbc         50114.70k    54013.93k    54955.52k    55281.32k    55429.80k
aes-128 cbc      79840.31k    85555.43k    86671.36k    87470.76k    87616.17k
aes-192 cbc      69636.92k    73987.52k    74768.30k    75366.06k    75451.05k
aes-256 cbc      61740.01k    65138.37k    65741.48k    66202.62k    66270.55k
camellia-128 cbc    56608.79k    62895.83k    63541.08k    63906.13k    63995.90k
camellia-192 cbc    44657.80k    48505.83k    48893.44k    49113.43k    49154.73k
camellia-256 cbc    44653.14k    48514.47k    48891.05k    49110.70k    49157.46k
sha256           25321.10k    57790.51k    99754.41k   121632.77k   130269.18k
sha512           19731.24k    79124.16k   125704.87k   178171.90k   203590.31k
whirlpool         3047.09k     6249.58k    10124.89k    11935.40k    12615.68k
aes-128 ige      76780.37k    83832.06k    85401.43k    86173.70k    86351.87k
aes-192 ige      67291.19k    72646.38k    73822.46k    74391.55k    74525.35k
aes-256 ige      59889.32k    63963.75k    64841.39k    65274.88k    65366.70k
ghash            99817.80k   104670.04k   108365.14k   109595.31k   109953.02k
                  sign    verify    sign/s verify/s
rsa  512 bits 0.000268s 0.000020s   3732.9  49684.6
rsa 1024 bits 0.001167s 0.000055s    856.8  18102.2
rsa 2048 bits 0.007148s 0.000175s    139.9   5717.2
rsa 4096 bits 0.045090s 0.000605s     22.2   1651.6
                  sign    verify    sign/s verify/s
dsa  512 bits 0.000352s 0.000245s   2841.0   4076.6
dsa 1024 bits 0.000741s 0.000684s   1348.7   1461.4
dsa 2048 bits 0.002084s 0.002168s    479.9    461.2
                              sign    verify    sign/s verify/s
 256 bit ecdsa (nistp256)   0.0006s   0.0014s   1778.0    725.7
 384 bit ecdsa (nistp384)   0.0057s   0.0033s    175.8    301.0
 521 bit ecdsa (nistp521)   0.0035s   0.0072s    287.0    138.1
                              op      op/s
 256 bit ecdh (nistp256)   0.0010s    960.1
 384 bit ecdh (nistp384)   0.0054s    185.7
 521 bit ecdh (nistp521)   0.0056s    179.9

aarch64 のほうが軒並み高速だが、特徴的なものが一部みえる。
計算が高度ではないハッシュについては armv7l と比べると半分近くの性能しか出ない場合もあるが、複雑なハッシュのほうは場合によっては armv7l の倍以上の性能が出ている。

■所感
殆どの場合において、aarch64 のほうが高速であると感じられた。
一部の処理は armv7l のほうが優れているが、昨今の処理内容の高度化を考えると、aarch64 のほうがメリットあると考える。
Red Hat Enterprise Linux から生成される CentOS の場合、aarch64 のコードが Red Hat によってメンテナンスされていることを考えると、armv7l よりは aarch64 のほうが品質が高いと考えられる。

カテゴリー: めも パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です