やかんです。
コンピュータアーキテクチャの期末レポートにおいて、FUJITSU Processor A64FXのキャッシュについてめっちゃ調べます。
(できる限り)めっちゃ
レポートの問いとしては、「現在使われているプロセッサのキャッシュ構成、各キャッシュのレイテンシや容量、連想度などを調べて表にしてみよう」なので、これに沿うように調べたいところ。
データシートはこちら。
データシートを眺める。
まずは、何はともあれデータシートを眺めます。
データシート曰く、
富士通が開発したA64FXプロセッサー(以下、A64FXと記述)はHigh Performance Computing(HPC)向けに設計され、Armv8-AおよびScalable Vector Extension for Armv8-A命令セットに準拠したアウト・オブ・オーダー実行型スーパースカラー・プロセッサーです。
らしいです。噛み砕いて読んでみると,
- High Performance Computing(HPC)は多分スパコンとかのリソースがとんでもないコンピュータのことでしょう。マルチプロセスとかに強いよ、的な。
- 「Armv8-AおよびScalable Vector Extension for Armv8-A命令セットに準拠した」っていうのは、命令セットの話。Armv8-Aとかがどんなアーキテクチャなのかは一旦置いとく。
- 「アウト・オブ・オーダー実行型スーパースカラー・プロセッサーです」というのは、フロントエンドとバックエンドに分かれていて(つまりOoOできて)、スーパースカラだからパイプラインで同じ処理できる段数が多いよということだろう。リソースが積まれていて、例えばALUが複数あるとか。
次に、
A64FXはアシスタントコアを含む52個のプロセッサー・コア、HBM2に対応したメモリー・コントローラー、TofuインターコネクトDのコントローラー、PCI-Express Gen3対応ルート・コンプレックスを集積しています。
これまじでどゆこと?gpt-4oくんに聞いてみます。もう、もはや翻訳だよねこれ。
https://chatgpt.com/share/1edd584d-3783-4198-8162-7442e736ce8f
gpt-4oを信じ切るわけにはいかないが、やはり優秀だよな。。ありがたいです。
- 「アシスタントコアを含む52個のプロセッサー・コア」とは、52コアあって、そのうちいくつかはアシスタントコア(明示的にコアとして指定できない、特定の役割に回されるコアだと思われる、ユーザー制御じゃなくてマシン制御の。)だよっていうことだろう。
- 「HBM2に対応したメモリー・コントローラー」とか呪文だよな。HBM2はHigh Bandwidth Memory 2は高帯域幅メモリの1種らしいです。非常に高速なメモリアクセスが可能で、このメモリを「制御する」ためのメモリコントローラが組み込まれているらしい。
- 「制御する」についてもうちょい解像度を上げたいですね。ロードストアユニット的な話なんかな?
- メモリを「制御する」とは、メモリのリフレッシュ的な話らしいです。だから、高帯域幅なメモリについてリフレッシュとかするから、メモリは常に万全な状態だよっていうことなんでしょう。
- デフラグとかもやってくれるんかな?と思いましたが、デフラグはソフトウェア制御の話のようです。メモリコントローラーはあくまでハードウェアなので、デフラグは担いませんね。
- 「TofuインターコネクトDのコントローラー」については、取り合えずTofuがすげえ難しそう、ということのみ知っています。スパコンの授業で登場したんだよな。配置配線的なネットワークの話だったと記憶していますが、どうなのでしょうか。
- Tofuやっぱ、現状の知識などでは理解不能なので、「とりあえずネットワークだな」というにとどめてここではスルーします。
- 「PCI-Express Gen3対応ルート・コンプレックス」とかも呪文だ。入出力の話なんじゃないのかなー、と思いつつこれについてもスルーします。
次に、
A64FXにより、スピーディーなシミュレーションと大規模データの利活用を可能とする「高性能」「高い電力当たり性能」「高信頼」なスーパーコンピュータを実現します。
これは、「素敵!」って感じですね。
主な特徴を見てみる
データシートに載っているものを一個一個見ていきます。
Predicted Operations
演算命令およびロード/ストア命令において、特定のSIMD要素のみの処理を可能とする
らしいです。シムディーは、単一命令、複数データ流のことです。Single Instruction, Multiple Data Streamです。1つの命令について並列で処理したり、といったことですね。
で、「特定のSIMD要素のみの処理を可能とする」というのは、コンパイラなどで最適化されたことで「ここは演算不要だよ!」となっている箇所については演算をスキップする事ができる(プロセッサごとに同一コードで違う処理ができる)という事だと理解しています。あってるのかな。
4オペランドFMA
A*B+C => Dの演算において、A,B,C,Dのレジスタが自由に選択可能
Armv8-A SIMDでは、A*B+C => Cの3オペランド演算命令が定義されているが、A64FXはMOVPRFX命令とPACKすることで、4オペランドFMA命令を実現
まずFMAとは、Fused Multiply-Addのことです。積と和が混ざった演算、つまり上記のA*B+Cなどですね。これを、3オペランドで一つのレジスタを書きつぶすのではなく、4オペランドでレジスタを書きつぶすことなくFMAを実行するよってことですね。
レジスタを書きつぶす3オペランドFMAの方がハードウェアコスト少なそうな印象ですが、計算過程を保持したい場合には不便だったり、レジスタなどリソースが豊富な場合はわざわざけちらなくてもいいので4オペのFMAでやりたいわけです。
これを実現するために、A64FXではMOVPRFXという命令と、PACKという命令を定義していますよ、という話だと思います。具体的な命令については置いておきましょう。
Gather / Scatter命令
メモリー上の非連続なデータを読み出しSIMD(Vector)化するGather命令と、メモリー上の非連続な領域にSIMD(Vector)データを書き込むScatter命令
A64FXはCombined Gatherメカニズムでスループットが向上
「SIMD化する」ってところが気になりますが、メモリ上で連続じゃなくても、単一の命令の中で扱えますよっていう話だと思います。
ただこれ、デフラグするのであればそこまでメリットじゃない気がするんですが、どうなのでしょうか。gpt-4oくんに聞いてみます。
- デフラグ:ストレージ上のデータ配置に関する
- SIMD化:CPUのデータ処理に関する
なるほど。デフラグについて勘違いしていたところがありました。主記憶じゃなくて二次記憶の話だったんですね。となれば、SIMD化はかなりメリットですね。メモリ上の配置にデータ流がとらわれないということです。
Math. Acceleration
三角関数や指数関数を求める際の高速化を実現
ハードウェアとして、三角関数、指数関数についての演算を効率化した専用ハードウェアを搭載しているということでしょうか?
多分そういうことなんじゃないかなってことで次行きましょう。
Compress
レジスター上で疎になっているデータを集約
これどういうことだ?レジスタの値を更新し続けるってことか?だとしたら電力消費量かさんじゃうよね。
でも、やっぱこれは「データ配置がいい感じになるようにレジスタを書き換える」ってことらしいな。だから、データ配置を整えるのに必要な電力消費量の方が、良くないデータ配置のレジスタで演算を進める時に要する電力消費量よりも小さいってことなんだろうな。あるいは、無視できるほどに小さいか。
First Fault Load
メモリーアクセス命令において、先頭の要素以外のトラップ発生を抑止し記録
外れたメモリアクセス全てにおいてトラップを発生させるのではなく、先頭の要素についてのみトラップを発生させるよってことだよね?これ、メモリが連続であることを前提してないか?先ほどのSIMD化の話と矛盾しないか?
↑これ、メモリが連続でなくても、「最初の要素でトラップ発生するなら、後続の要素もどうせトラップするでしょ」って話なのではないか?であれば、何度も何度もトラップを発生させてOSに制御を移しまくるのではなく、先頭の要素について1回だけトラップを発生させる方が賢い気がする。
ハードウェア・バリア
ソフトウェアのプロセスまたはスレッド間の同期をハードウェアでサポートする機能
メモリーアクセスを行わず同期処理ができ高速化を実現
ほう。なんだかこれは素人目に見てもありがたそうな機能だ。あくまでハードウェアによるのはサポートだから、ソフトウェアレベルでロックしたりっていう手間は必要だよね。
でも、「メモリーアクセスを行わず」ってことは、通常のソフトウェアによる同期の制御はメモリアクセスを要するってことか?
あー!条件変数とかね!これ確かにメモリアクセス必要だ。おお、、APIでは「なんたらinitでポインタ渡すもの」程度にしか思ってなかったけど、こうしてみれば確かに。ハードウェアのサポートがあれば高速化につながってくれそう。
セクター・キャッシュ
L1, L2キャッシュを仮想的に分割し、命令レベルで使用できる領域を指定できる機能
ふむ。ハードウェアとしては一体のキャッシュコンポーネントを論理的に分割してL1, L2とするよってことですかね。物理的には一体のコンポーネントだから、通信速度は速そうです。
命令レベルで使用できる領域を指定できる機能、というのはどういうことなんすかね。gpt-4oくんに聞いてみました。
うーん、なるほど?マイクロアーキテクチャステートであるキャッシュについて、ソフトウェアから「場所」について制御可能だよってことか?これは確かに、めちゃめちゃ効率化とハードウェアリソースの有効活用が叫ばれるスパコンプログラミングにおいては大事な話なのかもしれない。
以上、ざーっとデータシートについて眺めました。では、問いにもなっているキャッシュについて見ていきましょう。
キャッシュ構成
「キャッシュ構成」とは、おそらくこの文脈でL1, L2,,,などの構成だと思われます。データシートによれば、
- L1Iキャッシュ
- L1Dキャッシュ
- L2キャッシュ
があるようです。キャッシュラインサイズは256byteらしいですね。
L1Iというのは命令のキャッシュで、L1Dはデータのキャッシュだと思われます。L2キャッシュについてはそこの区分がないみたいですね。
各キャッシュのレイテンシ、容量、連想度
上であげた3つのキャッシュについて、レイテンシ、容量、連想度を調べていきます。
L1Iキャッシュ
命令のキャッシュです。ノイマン大先生によるプログラム内蔵方式のPCでは命令もメモリに入ってます。「命令をキャッシュする」というのがどういうことか正直ピンとこないので、gpt-4oくんに聞いてみましょうか。まー、OSに制御を移すときとか使われそうな印象だけど、どうなんだろうか。
https://chatgpt.com/share/4811f498-0614-4d6d-a17e-876dc3a84311
なるほど。ループ処理とかって話ですか。
で、このレイテンシ、容量、連想度について見ていきますが、容量については書いてありますね、3MiBらしいです。Miというのはメガの2進数バージョンですね。
レイテンシと連想度はどこ見ればいいんだろうか。
L1Dキャッシュ
とりあえず容量だけ。これも3MiB。
L2キャッシュ
容量は32MiB。
めも
多分、以下のpdfも参考にしつつ書かないとわからんな。
いやー、お目当ての情報を探し出すというか算出するというか、思ったよりも大変そうです。面白いので頑張ります。
最後までお読みいただき、ありがとうございます。