Japan
サイト内の現在位置
ベクトルの仕組み
no.0022020.08.28
ベクトルとスカラ型プロセッサの違いは次の絵を見ていただくとわかりやすいと思います。スカラとベクトルはともに線形代数で使われる用語です。スカラは次元が0、ベクトルは1次元、これが2次元になると行列と呼ばれるものになります。
スカラ型はあるデータ一つ、ベクトル型は複数のデータからなる行を扱うということになります。極々シンプルに表現するとスカラ型プロセッサとはデータ一つ一つをその都度運んできて足したりかけたりします。ベクトルプロセッサではある長さの行データをまとめて運んできて一度に掛け算足し算をおこないます。
SX-Auroraのベクトル処理のための命令には、大きく分けて256 要素の倍精度浮動小数点データを1 命令で読み書きするベクトルロード/ストア命令と、256 要素にたいして演算を1命令で行うベクトル演算命令があります。ベクトルロード/ストア命令は、メモリとベクトルレジスタとの間のデータ転送を最大で256要素単位で指示するため命令です。例えば倍精度浮動小数点のデータですと8Byte x 256 = 2048Byteをまとめて処理することができます。
このように一度に大きなデータの塊を処理できる仕組みを持つSX-Auroraですが、高速な処理の背景には大量のデータをメモリから持ってくる、あるいは送り返すというデータの物流体制の存在を見逃すことはできません。処理するデータが送られてこないとプロセッサはその間に何もしないで待たされてしまうためです。スーパーやドラッグストアの棚からトイレットペーパーが消えてしまったこの4月の出来事は記憶に新しいですが、次々に売れるトイレットペーパーに対して工場からお店を結ぶ物流の供給が追いつかなかったことが原因と聞きます。工場の倉庫(ここではメモリです)にはたくさん在庫在ったのですが、配送網(メモリとプロセッサを結ぶパイプです)が何らかの理由で細く、お店に十分供給できずに買い手の速度に追いつかないという事態になってしまいました。このようなボトルネックの発生を避けるため、SX-Auroraでは大量にデータをプロセッサに送るに十分なメモリバンド幅を用意しています。最新のSX-Auroraは従来比25%アップの10コアを搭載したプロセッサをもっていますが、これらを遊ばせておかないようにするために6個のHBM2メモリとの間は1.53TB/sのとても幅の広いパイプで結ばれています。この高速ネットワークの上を、これから処理するため、あるいは処理が終わったデータが行き来します。
SX-Auroraは10コアのプロセッサそれぞれに64個のベクトルレジスタを持っていて、そこへ太いパイプからデータが流し込まれるわけですが、ここでパイプライニングという考え方が大切になります。これは次にあげたベクトルプロセッサを構成する3大要素をまとめ上げるために欠かせないものです。
・ 多数のベクトルレジスタ
・ メモリからレジスタへの(あるいは逆方向の)十分なバンド幅
・ メモリに対するアクセス先行の仕組み
少し細かくパイプライニングについてみていきます。N 個のデータをすべて処理する時間 TNは以下の式で表すことができます。ここで、Ts は最初のデータにアクセスをかけてからそれがレジスタに格納されるまでにかかる時間、Tp は 1 つのデータの演算のための時間、Te は最後のデータが算出されてからそれをレジスタからメモリに書き戻すのに要する時間を意味しています。
TN = Ts + Tp x N + Te
レジスタでデータを処理する時間だけでなく、データを持ってくる時間を短くすることも大切で、そのためにデータの先読みということが行われます。30分後にお客が来ることを想定して寿司ネタの準備を前もって始めるようなものです。こうしてめでたく予定通りにデータが送られてくると、レジスタにデータを置く命令、計算する命令、結果をキャッシュに返す命令と一連の作業が待っています。これらをまとめてパイプライニングと呼びます。話を単純にするためこれら3つの命令を3人の寿司職人が働いている様子に例えてはなしをすすめます。
まず一人目はネタ切りを行う職人、二人目はシャリ握り、最後はわさびをおいてネタをのせる職人さんです。こうして3人の職人さんはお客の注文を受けて寿司をにぎっていくわけですが、注文聞いてから寿司ネタ準備していたのでは時間が無駄になるため日ごろの経験から予測をつけて、今日はコハダとイカ、鯛とウニ、それからとアナゴと玉子を用意しておいたとします。これで先の式、Ts部分を短くすることができました。次に、本日はとても都合がいいことに5人のお客さんがそれぞれコハダ→イカ→鯛→ウニ→アナゴ→玉子の順番で注文してくれました。3人の職人は流れを妨げれることなくハイスピードで寿司を用意していきます。これが理想的なパイプライニングです。スカラの場合には、これらの作業を同じく3人の職人さんが行うわけですが、一人目の職人さんがネタ切っている間、二人目と三人目はお客さんと世間話をして手は動いていません。一人目の作業が終わると次に二人目の職人さんがシャリをにぎり始めます。やはりこの間、一人目と三人目は世間話を始めます。このようにある時間で区切ってみたときに各職人さんの一人だけが作業をして、残りは前の作業が終わるのを待っている、といった流れがスカラ型の処理です。これがパイプライニングという仕組みを取り入れた店(ベクトル型店舗)では、前の作業完了を待つのではなく次々に手を動かしてデータをさばいていきます。このことで、次々にやって来るお客を待たせることなく滞りなく寿司を出していくことができるようになります。
さて、ここまでは理想的なある一日の例でしたが、いつもそのようにいくとは限りません。予測がはずれてあらかじめ用意していなかったトロの注文が出ることもあるでしょう。そうすると職人さんは冷蔵庫(メモリ)のところまで行ってマグロを運んでくる作業が発生します。このようなミスヒットが起きると移動時間だけ作業が遅れてしまいます。また、ある時は複数のお客さんがまったく違う順番で用意していなかった注文を出してくるかもしれません。こうしたランダム性はベクトル型オペレーションの妨げとなり、処理の流れを乱す原因になってしまいます。しかし、理想的な状況だけ続くということは現実世界ではありえませんので、うまくさばく工夫が必要になります。それを仕切るのが一つにはコンパイラーの仕事であり、もう一つには流れのいいプログラミングコードを書くという使い手に求められる役割です。この辺りについては後日触れていけたら、と考えています。
ところで、SX-Auroraのパイプの太さをSTREAMというベンチマークソフトを使って実感していただくことができます。SX-AuroraだけでなくIntelプロセッサやPCでも実行できるので、比較してみると面白いかもしれません。
https://www.cs.virginia.edu/stream/
職人1: ネタを切る係
職人2: シャリ握りの係
職人3: わさびおいてネタのせる係
鮨1(コハダ)、鮨2(イカ)、鮨3(鯛),,,,
ベクトル型オペレーション
t1 | t2 | t3 | t4 | t5 | t6 | t7 | t8 | |
職人1 | 鮨1 | 鮨2 | 鮨3 | 鮨4 | 鮨5 | 鮨6 | - | - |
職人2 | - | 鮨1 | 鮨2 | 鮨3 | 鮨4 | 鮨5 | 鮨6 | - |
職人3 | - | - | 鮨1 | 鮨2 | 鮨3 | 鮨4 | 鮨5 | 鮨6 |
スカラ型オペレーション
t1 | t2 | t3 | t4 | t5 | t6 | t7 | t8 | |
職人1 | 鮨1 | - | - | 鮨2 | - | - | 鮨3 | - |
職人2 | - | 鮨1 | - | - | 鮨2 | - | - | 鮨3 |
職人3 | - | - | 鮨1 | - | - | 鮨2 | - | - |
最新資料/カタログはこちらからダウンロード
ご紹介資料、各種カタログをダウンロードいただけます。
My NEC登録が必要です
My NEC登録が必要です
