知っておくと便利!EC2インスタンスのCPU機能調査ガイド
こんにちは。ゲームソリューション部の出村です。
EC2では、さまざまなベンダーのCPUが採用されています。これらのCPUの違いとしては、動作周波数やキャッシュ容量といった数値で明確に分かる違いのほか、処理できる命令などCPUに実装されている機能の違いもあります。
ここでは、そのような機能の違いを調査する方法を解説します。
CPUによって実装されている機能は異なる
EC2インスタンスは、その世代やインスタンスタイプによって異なるCPUが搭載されています。そのため、サポートされている機能がEC2の世代ごとに異なります。例えば、○○ソフトウェアでは、実行環境としてCPUに○○命令(=演算処理する機能)が実装されていることが必須と指定されることがあります(主に科学技術計算を行うソフトウェアなどの場合です)。
このような場合、○○命令はYYYインスタンスでは実行できないものの、ZZZインスタンスでは実行可能なため、ZZZインスタンスの使用が必須となります。
なお、CPUに搭載されているさまざまな機能は簡単に調べることができます。
大半の利用用途ではCPUの違いは気にしなくて良い
まず最初に、CPUに実装されている機能の違いは、大抵の場合は気にする必要がありません。例えば「Webサーバーを構築する際にAmazonLinuxで提供されているパッケージを利用する場合」や「PHPなどのスクリプト言語を使って開発・実行する場合」は、CPUの機能にほとんど依存せず、どのインスタンスでも同様に動作します。
CPUに実装されている機能の違いを意識する必要があるのは、次のような場合です:
- CPUの性能を最大限に引き出すようなソフトウェアを開発する場合
- CPUの機能に大きく依存したソフトウェアを実行する場合
具体的な例として:
- EC2のCPU性能を最大限活用するためにC言語のコンパイルオプションを指定したい場合
- 科学技術計算ソフトウェアの実行環境として「○○○命令が実装されているCPU」が必要な場合
なお、CPUに搭載されている命令はCコンパイラですべて適切に利用されているとは限りません。人間がCPUの特定命令(特定機能)を活かすようなソースコードを書くことで、ソフトウェアの実行速度が大幅に改善することがあります。最近の例では、FFmpegという動画エンコードソフトで手動でアセンブリコードを書くことにより、実行速度が94倍になったという事例があります。
CPUのスペック・機能情報を取得する
では、このような情報を取得する方法を説明します。なお、ここではAmazonLinuxなどのLinuxを利用している前提で進めていきます。
CPUの情報を取得するには、次のいずれかの方法を取ります。
cat /dev/cpuinfo
lscpuコマンド
いずれの方法も出力される情報はほぼ同じなので、ここでは、どの環境でも実行できる”cat /dev/cpuinfo”の出力結果を元に進めます。
例としてc7a.largeインスタンスでの出力結果を提示しました。c7a.largeはvCPUが2つあるため、次の情報がコア単位で2つ出力されます。ここではコア1個分の情報を掲載しています。
processor : 1
vendor_id : AuthenticAMD
cpu family : 25
model : 17
model name : AMD EPYC 9R14
stepping : 1
microcode : 0xa101148
cpu MHz : 3699.286
cache size : 1024 KB
physical id : 0
siblings : 2
core id : 1
cpu cores : 2
apicid : 1
initial apicid : 1
fpu : yes
fpu_exception : yes
cpuid level : 16
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid aperfmperf tsc_known_freq pni pclmulqdq monitor ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch topoext perfctr_core invpcid_single ssbd perfmon_v2 ibrs ibpb stibp ibrs_enhanced vmmcall fsgsbase bmi1 avx2 smep bmi2 invpcid avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves avx512_bf16 clzero xsaveerptr rdpru wbnoinvd arat avx512vbmi pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg avx512_vpopcntdq rdpid flush_l1d
bugs : sysret_ss_attrs spectre_v1 spectre_v2 spec_store_bypass srso
bogomips : 5200.00
TLB size : 3584 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 48 bits physical, 48 bits virtual
power management:
出力された情報をみると「AMD EPYC 9R14が搭載されている」「動作周波数は3699.286MHz」といった情報が見て取れます。それ以外にも情報はいろいろ書かれているので、興味あるかたは調べて観てみてください。
flagsで出力される情報
さて、ここからが本題です。
cpuinfoのなかにflagsという項目があります。そこには一見すると意味不明な単語が並んでいますが、実はそれらの単語はCPUに実装されている機能を指しています。それぞれの単語の意味を少し解説します。
単語 | 意味 |
---|---|
fpu | ハードウェアによる浮動小数点演算ユニットを搭載 |
vme | 仮想8086モードをサポート |
de | 拡張デバッグ機能をサポート |
ここで「fpu:ハードウェアによる浮動小数点演算ユニットを搭載」の詳細を解説し始めると長文となるので説明は割愛します。
avx512を取り上げていく
このエントリーではflagに登場するavx512という単語を取り上げて解説していきます。
avx512とはAVX-512と呼ばれる512ビット分の演算が1度に行える命令群を指しています。AVX-512の命令によって512ビット分の処理が1度に行われるため行列やベクトルの演算が高速化されます。先ほどのFFMpegの処理が94倍高速化した話も、avx-512の命令を活用して高速化できた好例です。
AVX-512の命令が利用できるインスタンスを調べる
EC2のインスタンスは、すべてのインスタンスがAVX-512の命令をサポートしている訳ではありません。ここでは、c6i、c6a、c7i、c7aのそれぞれのインスタンスで調べてみます。ここではavxから始まる単語のみを抽出して掲載しています。
c6iインスタンス
avx avx2 avx512_bitalg avx512bw avx512cd avx512dq avx512f avx512ifma avx512vbmi avx512_vbmi2 avx512vl avx512_vnni avx512_vpopcntdq
c6aインスタンス
avx avx2
c7iインスタンス
avx avx2 avx512_bf16 avx512_bitalg avx512bw avx512cd avx512dq avx512f avx512_fp16 avx512ifma avx512vbmi avx512_vbmi2 avx512vl avx512_vnni avx512_vpopcntdq avx_vnni
c7aインスタンス
avx avx2 avx512_bf16 avx512_bitalg avx512bw avx512cd avx512dq avx512f avx512ifma avx512vbmi avx512_vbmi2 avx512vl avx512_vnni avx512_vpopcntdq
このように、AVX-512の命令はc6i、c7i、c7aインスタンスで利用できることが分かりました。AVX-512の命令を利用する演算はc7iやc7aといった最新インスタンスであれば、どちらでも実行可能だと分かりました。
まとめ
なにげに利用しているEC2ですが、世代ごとに機能追加、性能向上している事がこのようにみることができます。
お手軽に機能を調べたい場合は、ググらなくてもこのように調査する方法が用意されています。かなり詳しく出力されるので、初めて見ると戸惑うこともあるかと思いますが、慣れてくると歴史的な経緯が見えてきて楽しい、かもしれません。