連載
» 2019年12月26日 10時00分 公開

「Cortex-A」は“Solution-based”で性能改善、来るべきMatterhorn世代に向けてArm最新動向報告(7)(2/3 ページ)

[大原雄介,MONOist]

「Matterhorn」世代では新たにMatMul命令を投入

 そこでの対策が「Matterhorn」世代で投入される、新しいMatMul(Matrix Multiply)命令である(図4)。これまでに公開されているArmのクライアント向けロードマップ※)で紹介されている7nm世代の「Deimos」が、Cortex-A77である。そして2020年には「Hercules」コアが投入されるが、このHerculesの後に投入されるのがMatterhornだ。2021年以降の投入が予定されており、ターゲットプロセスは5nmかそれ以下となる。

※)関連記事:Arm、クライアント向けCPUのロードマップを発表

図4 図4 ちなみにドット積(Dot Products)の対象はInt 8のみになっている。MatMul命令は後述(クリックで拡大)

 もともと「Cortex-A75/A55」の世代で、ドット積(Dot Product)がコプロセッサ「NEON」に追加されている。これがどう役に立つのか? という話はEE Times Japanの記事でちょっと触れたが※)、畳み込みニューラルネットワーク(CNN:Convolutional Neural Network)では煩雑に畳み込み演算を行うので、この畳み込みにドット積を利用すると簡単かつ高速に実行できるという話である。ドット積そのものは「ARM v8.4-A」で定義されており、これを実装したのがCortex-A75/A55からということになる。

※)関連記事:ArmのAI戦略、見え始めたシナリオ

 Matterhornで搭載される命令はMatMul=Matrix Multiply、つまり行列演算である。こちらの方がより一般的な演算で広範に利用可能だし、もちろんMLの処理にも利用できる。ドット積も利用可能だが、これは畳み込みを利用するCNNの場合にのみ効果があり、他の手法では役に立たない。MatMulならばこうしたケースでも恐らく効果的である。

 さて、その性能がこちら(図5)。縦軸はMLの性能ではなく、GEMM(General Matrix Multiplication:汎用行列乗算)の性能である。実はGEMMの場合、ドット積の有無はほとんど無関係である(たまに行列の内積を計算する、ということもあるから0ではないが)。

図5 図5 ドット積(Dot Products)はInt 8、MatMul命令はbfloat16。実のところこれらを同列に並べるのもちょっとおかしな感じではあるのだが……(クリックで拡大)

 このグラフの縦軸で、Cortex-A73からCortex-A75への性能アップはNEONのスループット向上によるものだし、Cortex-A75からCortex-A76への大きな飛躍はNEONユニットの倍増によるところが大きい。要するにドット積はほとんど無関係である。ただし、Cortex-A77や次のHerculesの世代でも、行列乗算に関しては要素ごとに分解していちいち掛け算を行うことになる。これがMatterhorn世代ではMatMul命令を使うことで大幅に高速化できる、という話である。

 このMatMul命令だが、「汎用」と言いつつも実際はML向けを念頭に置いており、対応するデータフォーマットはbfloat16である。bloat16は、符号1ビット、仮数部7ビット、指数部8ビットで合計16ビットの浮動小数点である。仮数部7ビットだから、有効数字は実質2桁でしかない。その代わり指数部は8ビットあるから、FP32と同程度の値の範囲がサポートされる。

 要するに、値の範囲が広い(から、桁数が重要で数字そのものの精度は荒くても構わない)タイプのネットワークに対応したフォーマットである。このため、いわゆる科学技術計算には全く向いておらず、ほぼML向けである。実際にグーグル(Google)とインテルが既にbfloat16をサポートしており、Armもこれに倣う形になる。実はこれもちょっと複雑で、MatMul命令はNEONとSVE(Scalable Vector Extensions)の両方が対応している。恐らくNEONに実装されるのはbfloat16のみであり、一方SVEではどうもbfloat16以外(FP32とかひょっとするとFP64)でも演算が可能になりそうだ。

 ちなみにこのbfloat16は「Arm v8.6-A」として定義される形になる。非常に分かりにくいのだが、Armの命令セットはV8世代でもv8.0-A〜v8.6-Aまで7バージョンある。それぞれの特徴を簡単にまとめると、以下のようになる

  • v8.0-A:Arm V8世代のベース。
  • v8.1-A:Atomics命令/VHE(Virtualization Host Extensions)を追加
  • v8.2-A:半精度(FP16)のサポート、Stat Profiling、RAS機能、SVEを追加
  • v8.3-A:ネストされた仮想化(Nested Virtualization)、RCpc(Release Consistent processor consistent)、ポインタ認証(Pointer Authentification)の追加
  • v8.4-A:Crypto命令の強化とSHA512/SHA3対応命令の追加、Secure EL2、MPAM(Memory Partitioning and Monitoring)の追加
  • v8.5-A:RNG(乱数発生命令)、BTI(Branch Target Identifier)、メモリタギング(Memory Tagging)の追加
  • v8.6-A:MatMul命令の実装、bfloat16サポート、仮想化強化、ポインタ認証強化(Enhanced PAC2およびFPAC実装)

 Armのプロセッサで言えば、Cortex-A32/35/53/57/72/73までがArm v8.0-A準拠、Cortex-A55/75/76/77がArm v8.2-A準拠である。Cortex-A77などは、部分的にArm v8.5-Aの特徴の一部を実装しているが、Arm v8.5-Aの全て(+Arm v8.4-A/v8.3-Aの全て)の機能を実装しているわけではないので、フル実装しているバージョンで言えばArm v8.2-Aになる。

 そして、次のHerculesも恐らくv8.2-Aのままである。これが変わるのはMatterhorn世代で、ここでいきなりv8.6-A相当になる「らしい」。つまりこれまでArmがv8.0-A以降で定義してきた命令セットや機能をほぼ含んだ形になるという意味である(全部かどうか、までは確認できていない)。これは相応に大変な作業であり、2020年登場のHerculesに実装できなくても不思議ではないだろう。

Copyright © ITmedia, Inc. All Rights Reserved.