HPCシステムズではエンジニアを募集しています。詳しくはこちらをご覧ください。
HPCシステムズのエンジニア達による技術ブログ

Tech Blog

M6g 触ってみた (1) ーARM64の広がる世界ー

はじめに

SARS-CoV-2対策のため、未だ未完成の富岳の起動が発表されたことに、オタク心をくすぐられた方も多いのではないかと思います。富岳はCPUがARMベースであることも知られており、1CPUあたり48コアにおよぶ計算用コアはHPCに必要な演算性能を生み出しますが、カタログ上の最大演算性能は内蔵されているSVEと呼ばれるベクトル演算ユニットに依るところが大きいと思われます。ARMはCPUが持つべき基本機能を備えた設計のみをライセンス販売していて、開発者はそれをたたき台にアレンジしたり、SVEのような付加機能を付け足したりすることで、実際のCPUを設計・製造します。これによりCPU全体やそれを取り扱うOSなどのソフトウエアをゼロから設計する必要がなく、欲しい機能に注力することができる・・・ということになっています。当然ながら一方ならぬご苦労はあったはずです。

Graviton2の登場

さて、AWSがARMベースのGravitonプロセッサーを独自に開発し、A1インスタンスとして誰もが利用可能にしたのが1年半前です。そして昨年末のre:Inventで、初代を大幅に性能改善したGraviton2という第2世代プロセッサが発表されました。ARMはスマホなどモバイル用途のCortexシリーズが有名ですが、Graviton2はARMがサーバー向けに開発したNeoverse N1ベースになっていて、やはりサーバー向けのMarvellから出ているThunderXとも異なるシリーズです。A1はその字の通りARMであることが特徴でしたが、今回はM6g/C6g/R6gと目的ベースのネーミングポリシーになっており、ある意味ARMであることを言い訳にしない、お試しではなく実戦投入という意気込みを感じます。

詳細はここでは省きますが、スペック的には初代にくらべ「パフォーマンスで7倍、コンピューティングコア数で4倍、キャッシュサイズで2倍、メモリ速度では5倍の性能」という触れ込みになっています。用途としては汎用となっていて、SVEのような強力な浮動小数点演算ユニットが搭載されているわけもなく、決してHPCに適した設計にはなっていませんが、AMD ROME同様の64コアとなっている点、A1ではメモリ帯域不足と思われる原因により、16コアのうち8コアまでしかスケールしなかったのが、どの程度改善したか?などに興味がありました。ただし、CPU性能に特化したC6gインスタンスが予定されている(ただしメモリ搭載量は半減する模様)ので、今後追っていきたいと思います。

さて、M6gはすぐにプレビューに申し込んだのですが、当選しなかったようで返事をもらえませんでした。今回、このインスタンスが一般利用可能になり、最大64コア256GBメモリのM6g.16xlargeインスタンスまでが誰でも使えるようになりました。そこで早速ベンチマークを取ってみたのでご報告させていただきます。

ベンチマーク内容

過去にA1でベンチマークを取得したUbuntu18.04LTS環境がそのまま起動できたので、それをアップデートし、Ubuntu20.04LTSとしています。対象はおなじみのHPL-2.3と、オープンCAE学会によるチャネル流ベンチマークを、この環境でビルドしたOpenFOAM-v1912で取得しました。報告について今回はHPLで、次回にOpenFOAMとします。

結果

HPLにはBLASが必要なので、まずは標準リポジトリから入れられるATLASを試しましたが、性能的に振るわないので、ARM対応も進んできているOpenBLASを使いました。当初OpenBLAS 0.3.6でgenericなライブラリで検証をはじめたのですが、3月にNeoverseをサポートしたv0.3.9が出ていたので切り替えて比較しました。コンパイラとMPIは、どちらも標準のgcc-9.3.0とOpenMPI-4.0.3です。HPL,OpenBLASともにチューニングは一切していません。

~/hpl-2.3/testing$ mpirun -np 64 ./xhpl
================================================================================
HPLinpack 2.3 -- High-Performance Linpack benchmark -- December 2, 2018
Written by A. Petitet and R. Clint Whaley, Innovative Computing Laboratory, UTK
Modified by Piotr Luszczek, Innovative Computing Laboratory, UTK
Modified by Julien Langou, University of Colorado Denver
================================================================================
An explanation of the input/output parameters follows:
T/V    : Wall time / encoded variant.
N      : The order of the coefficient matrix A.
NB     : The partitioning blocking factor.
P      : The number of process rows.
Q      : The number of process columns.
Time   : Time in seconds to solve the linear system.
Gflops : Rate of execution for solving the linear system.

The following parameter values will be used:
N      :   45000 
NB     :     144 
PMAP   : Row-major process mapping
P      :       8 
Q      :       8 
PFACT  :   Crout 
NBMIN  :       2 
NDIV   :       2 
RFACT  :    Left 
BCAST  :   1ring 
DEPTH  :       0 
SWAP   : Mix (threshold = 64)
L1     : no-transposed form
U      : no-transposed form
EQUIL  : yes
ALIGN  : 8 double precision words
--------------------------------------------------------------------------------
- The matrix A is randomly generated for each test.
- The following scaled residual check will be computed:
      ||Ax-b||_oo / ( eps * ( || x ||_oo * || A ||_oo + || b ||_oo ) * N )
- The relative machine precision (eps) is taken to be               1.110223e-16
- Computational tests pass if scaled residuals are less than                16.0
================================================================================
T/V                N    NB     P     Q               Time                 Gflops
--------------------------------------------------------------------------------
WR00L2C2       45000   144     8     8             120.58             5.0386e+02  # v0.3.6
WR00L2C2       45000   144     8     8              75.06             8.0941e+02  # v0.3.9
WR00L2C2       90000   144     8     8             556.63             8.7313e+02  # v0.3.6
WR00L2C2       90000   144     8     8             557.16             8.7230e+02  # v0.3.9
WR00L2C2      120000   144     8     8            1293.83             8.9040e+02  # v0.3.6
WR00L2C2      120000   144     8     8            1295.15             8.8949e+02  # v0.3.9
WR00L2C2      160000   144     8     8            3087.50             8.8444e+02  # v0.3.6
WR00L2C2      160000   144     8     8            3031.57             9.0076e+02  # v0.3.9
--------------------------------------------------------------------------------
||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)=   6.81600027e-04 ...... PASSED
================================================================================
Finished 1 tests with the following results:
1 tests completed and passed residual checks,
0 tests completed and failed residual checks,
0 tests skipped because of illegal input values.
--------------------------------------------------------------------------------

Nを増やしてサチるのは、他ではあまり見かけたことのない挙動ですが、900GFlops近く出ているのは十分に高性能と言えます。Nが小さい領域ではNeoverse対応が入ったOpenBLAS v0.3.9の効果が顕著ですが、大きくなると差異が出てきません。つまりメモリ帯域が確保できれば更に大幅な高性能が実現できるのではないでしょうか。C6gのメモリサイズが小さいのはこのあたりが影響しているのかもしれません。ブロックサイズNB=144は、N=4000程度で追いこんだ最適値です。インテルではNB=163あたりになります。

さて、近日中に続編のOpenFOAMの結果を出しますのでお楽しみに。