Upgrade to Pro — share decks privately, control downloads, hide ads and more …

輪講資料: パタヘネ 6章

190ikp
April 21, 2023

輪講資料: パタヘネ 6章

研究室の輪講用

190ikp

April 21, 2023
Tweet

More Decks by 190ikp

Other Decks in Education

Transcript

  1. 並列性の意味合い • タスク・レベル並列性(プロセス・レベル並列性) • 独立した複数のアプリケーションを単一のプロセッサで同時に処理 • 「大型で低効率のプロセッサ」 • 並列処理プログラム •

    複数プロセッサで単一のプログラムを並列化 • 「小型で高効率のプロセッサ×n個」 • ex. クラスタ (多数の独立なサーバ上に搭載されたマイクロプロセッサ群で構成) → 「マルチプロセッサ・マイクロプロセッサ」 →「マルチコア・マイクロプロセッサ」
  2. 並列性の意味合い • マルチコア・チップではプロセッサ→コアと呼称 • 共有記憶型マルチプロセッサ (shared memory processor: SMP) を持つ

    • コア間で単一の物理アドレス空間を共有しているため • 詳細は6.5 • ハードウエアだけでなくソフトウエアでの最適化も重要になる
  3. 強いスケーリング / 弱いスケーリング • 強いスケーリング • 問題の規模を固定したままで達成される速度向上 • より困難 •

    弱いスケーリング • プロセッサ数の増大に比例して問題の規模も拡大 • 通常は比較的容易に達成可能 • 記憶階層によってはより困難になる (データセットが最下位レベルのキャッシュから溢れる場合など) プロセッサあたりのメモリ量は強いスケーリングなら×1/プロセッサ数
  4. 強いスケーリング / 弱いスケーリング • アプリケーションの種類に応じて適切な方を選択 ex. TPC-Cによる現金/信販数データベース・ベンチマーク • 時間当たりのトランザクション数を増やすには… •

    顧客一人当たりのトランザクション数を増やす(強いスケーリング) ↑現実に即していない • 顧客数を増やす(弱いスケーリング)
  5. 並列ハードウエアの分類 SPMD (single program multiple data) • ex. MPI (message

    passing interface) • 並列処理プログラム作成時のプログラミング・モデルの1種 • MIMD型コンピュータ上で動作するプログラムで通常採用 • 各プロセッサが同じ処理を行う • 各プロセッサが主記憶に持つデータセットは異なる
  6. 並列ハードウエアの分類 SIMD • アレイ・プロセッサ(ベクトルプロセッサ)から着想 • ex. NEC SXシリーズ • データ流のベクトル(1次元配列)を

    単一のプログラム・カウンタからの単一命令で操作 これに対してすべての並列実行ユニットが同期して応答する • ex. 単一のSIMD型命令で64組の数値の加算を行う場合 1. 64本のデータ流を64個のALUにそれぞれ送信 2. 単一のクロック・サイクルで64個の和すべてを計算
  7. SIMD • プログラマから見ると従来のSISD型とほぼ変わらない • コンパイラから見ると変わる (SISD,SIMD向けで別々にコンパイルされる) • 並列実行ユニット毎に別々のアドレス・レジスタを持つため • 複数の並列実行ユニットを1つの制御ユニット下で動かす

    →制御ユニットのコスト低減 • 同時に実行されるコードのコピーは1つだけ →命令のバンド幅と(キャッシュ)空間が小さく済む • MIMDではプロセッサ毎にコードのコピーが必要→コスト増
  8. SIMD • forループで高い性能を発揮 • 同一の構造を有する大量のデータの処理=データ・レベル並列性 • データ・レベル並列性: 独立したデータ群に 同一処理を行うことによって得られる並列性 (部分語並列性

    (3.6)) • 条件分岐は苦手 • 各実行ユニットによって実行する命令が異なってくるため • 条件分岐による場合の数nに対してSIMDプロセッサの実効性能は1/n
  9. ベクトル対スカラ ex. 倍精度浮動小数点数64個のベクトルX, Yの加算 𝑌 = 𝑎 × 𝑋 +

    𝑌 • 動的な命令のバンド幅 (実行される命令数) が大きく削減できる • スカラ命令を繰り返し実行 = 単一のベクトル命令の実行 • オーバヘッド関連の命令が存在しない • 終了判定,インデックス繰り上げ,残ループ数計算,etc... • 場合によってはループ処理の半分近くを占める
  10. ベクトル対スカラ その他の利点 • パイプライン・ハザードの発生頻度低減 • ベクトル内の各要素の計算結果は独立 • ハードウエアによる要素毎のデータ・ハザードのチェックが不要 • 必要なのはベクトル命令間でのデータ・ハザードのチェックのみ

    • ループ始点に戻る分岐によって発生する制御ハザードが存在しない • メモリアクセスのコスト低減 • コスト (レイテンシ) がかかるのがデータ要素単位 → ベクトル単位へ → 消費電力およびエネルギーの面で有利
  11. ベクトル対マルチメディア機能拡張 マルチメディア機能拡張 • 複合した1つの操作を指定 • ベクトルの長さ (複合操作数) 毎に命令操作コード群が存在 ベクトル命令 •

    単純な操作を複数指定 • ベクトルの長さは可変長 • 演算対象の要素数は別建てのレ ジスタ群に格納 • レジスタを書き換えるだけで OK • コンパイラ技術と相性が良い • 将来的な発展 (機能拡張) がさ せやすい
  12. ベクトル対マルチメディア機能拡張 • ストライド型アクセス • 主記憶内のデータ要素を飛び飛びでロードする • インデックス修飾アクセス • ベクトル・レジスタにロードするデータ要素のアドレスを算出して ロード

    • 収集・拡散ともいう • 収集…主記憶から要素を取集して一連の連続したベクトル要素としてロード • 拡散…ベクトル要素を主記憶中に拡散してストア
  13. 細粒度 / 粗粒度マルチスレッディング 細粒度 (fine-grained) マルチスレッディング: • 命令毎にスレッド切替が発生,複数のスレッドを満遍なく実行 • 切替先スレッドの選択はラウンドロビン方式が多い

    • 切替時のクロック・サイクルでストールしているスレッドはスキップ Pros: • 長時間・短時間どちらのストールにも対応可能 Cons: • 他のスレッドからの切替で待機するスレッドが発生 →個々のスレッドの実行に時間がかかる
  14. 細粒度 / 粗粒度マルチスレッディング 粗粒度 (coarse-grained) マルチスレッディング: • 現行のスレッドで長時間のストールが発生した場合にスレッド切替 (最下位 レベルでのキャッシュミスなど)

    Pros: • スレッドの高速な切替が不要 • 他のスレッドからの切替を待機する必要がなくなる →個々のスレッドの実行が遅くなる可能性を低減 Cons: • 短時間のストールには対応できない → 全体のスループット低下 • 切替には既存のパイプラインを空にするか一時凍結する必要があるため →切替先のパイプライン起動に時間がかかる • 長時間のストールであればスレッド切替するだけの価値がある
  15. 同時マルチスレッディング 同時マルチスレッディング (simultaneous multithreading: SMT) • 命令レベル並列性 (ILP),スレッドレベル並列性 (TLP)を活用 •

    独立した別々のスレッドから複数の命令を発行可能 • レジスタ・リネーミングと動的スケジューリングを活用 • 命令間の依存関係は考慮しなくてOK • クロック・サイクル単位でのリソース切替は無し • 命令スロットとリネーミングされたレジスタに適切なスレッド を対応づける処理はハードウエアが担当
  16. 各方式によるリソース活用能力の比較 SMT • ILPとTLPを両方活用 • (理想的な状態で) 発行スロットの使用が 限定されるのは • 複数スレッドにまたがるリソースが必要な場

    合 • リソースの利用可能性が不均衡な場合 のみ • 実際は他の要因も絡んでスループットが 低下するが,他方式よりははるかに良い 単一サイクルで 複数のスレッドが 発行スロットを使用
  17. SMTによる性能向上 参考: Intel Core i7 960 (Core i 第1世代)でのSMTによるスループット向上 (Intel用語ではHyper-Threading

    Technology: HTT) • 1プロセッサ (コア) あたり2スロットをサポート • 平均速度向上率: 1.31 • エネルギー効率の平均向上率: 1.07 → エネルギーに影響を及ぼさず性能を向上 x86では他にAMDもコアあたり2スロット (SMT) PowerPCであればIBMがコアあたり4/8スロット (SMT4/SMT8)
  18. ここからの話 • ここまでは単一プロセッサ上での性能向上の話 • 最近はチップあたりのプロセッサ数も増大している • 最新のチップ (AMD EPYC Genoa)

    では96コア/チップ • チップ上のすべてのプロセッサを効率よく利用することで Mooreの法則の性能向上率を実現したい
  19. 共有記憶型マルチプロセッサ (shared memory processor: SMP) • マルチコアにおけるスタンダードな形 • すべてのプロセッサからアクセス可能な単一物理アドレス空間を提供 •

    プロセッサは主記憶内の共有変数を通じてデータの居場所の情報を交換 • ハードウエアによってキャッシュ・コヒーレンスが維持される (5.8) • プロセッサはあくまで独自の仮想アドレス内で独立したジョブを実行可能 SMPの古典的な構成例
  20. SMPの種類 • 均等メモリアクセス(uniform memory access: UMA) • 主記憶中のデータへのアクセス時間がプロセッサに依存しない • 非均等メモリアクセス(non-uniform

    memory access: NUMA) • 主記憶が分割されて別々のプロセッサ・メモリコントローラへ割当 • 主記憶中のデータの位置へ近いプロセッサほどアクセスが速い • プログラミングの難度は高いがプロセッサ数の拡大が容易
  21. 同期 (synchronization) • 別々のプロセッサが同じデータを同時に操作することがないように する仕組み (2章) • ex. 共有される変数にロック (lock)

    を適用 (2.11) • 同時にデータを操作できるプロセッサは1つだけになる • 他のプロセッサは先にロックを取得したプロセッサがロック解除するまで待 機 OpenMP • 共有記憶型マルチプロセッシングのためのAPI • ループの並列化と縮約 (reduction: 各プロセッサでの演算結果の集 計) を行う
  22. GPUの登場 グラフィックス処理ユニット (Graphics Processing Units: GPU) • マイクロプロセッサにSIMD命令を追加するだけでは性能不足 • グラフィックス処理改善のために登場

    • コンピュータ・ゲーム市場の拡大を受けてマイクロプロセッサより も速いペースで改善 • 多数の並列処理浮動小数点ユニットを持つ低コストなハードウエア の誕生 →GPUコンピューティング (general-purpose computing on GPU:GPGPU)
  23. GPUとCPUの違い (役割) • GPUはCPUを補完するハードウエア • CPUができるタスクを全てできる必要はない • 純粋にグラフィックス処理に専念して良い • GPUの扱うデータサイズは通常MiB~GiB単位

    • 極端に大きなデータ(102GiB~TiB)を扱える必要はない • (ただ最近は深層学習で比較的大きなデータを扱うことがある) これらの違いを踏まえて…
  24. GPUとCPUの違い (アーキテクチャ) • マルチレベル (階層構造) のキャッシュは利用しない • 個々のデータセットが102 MiBと大きく,キャッシュに収まらない •

    メモリアクセスの待ち時間はハードウエア・マルチスレッディングに より別のスレッドを実行,レイテンシを隠蔽 • 主記憶のデータ幅,バンド幅重視 • バンド幅: CPU…~460GB/s,GPU…~3TB/s (2023年現在) • 主記憶はCPUより小さい (CPU…~6TiB,GPU…~80GiB) • 多数のスレッドが必要になる → 多数のスレッド,並列プロセッサ (MIMD) に対応する必要がある → CPUよりも高度なマルチスレッド化された多くのプロセッサを搭載
  25. NVIDIA GPUアーキテクチャの概要 ex. Fermiアーキテクチャ (現行の8世代前) • GPUはマルチスレッド方式のSIMDプロセッサで構成されるMIMD • データ・レベル並列性のある問題にのみ効果があるのはベクトル・プ ロセッサ同様

    • ベクトル・プロセッサよりレジスタ,並列機能ユニットが多い • SIMDスレッド (=SIMD命令のみを含むスレッド) • GPUが生成,管理,スケジュール,実行するマシン・オブジェクト • 独自のプログラム・カウンタを持つ
  26. NVIDIA GPUアーキテクチャの概要 GPUは2種類のスケジューラを持つ • SIMDスレッド・スケジューラ • SIMDプロセッサに内蔵 • 実行準備ができたSIMDスレッドをSIMDスレッド・スケジューラ内の コントローラが選び,該当スレッドをディスパッチ・ユニットへ送る

    • ディスパッチ・ユニットは該当スレッドをSIMDプロセッサ上で実行 • 「実行準備ができたものから」=細粒度マルチスレッディング • スレッド・ブロック・スケジューラ • スレッドのブロックを各SIMDプロセッサに割当 • GPU自体のスケーラビリティ (様々な規模の製品) を提供できる
  27. NVIDIA GPUアーキテクチャの概要 • 各スレッドのSIMD命令の幅は32 • 各スレッドは32要素の計算をする • 各SIMDプロセッサは並列機能ユニット (SIMDレーン) を16本持つ

    • ベクトル・レーン (6.3) によく似た構成 • SIMD命令の幅 (ベクトルの長さ)が32に対し SIMDレーンは16 → SIMD命令のスレッド内の各SIMD命令の完 了まで2クロック・サイクル 16本のSIMDレーン GPU内の各SIMDプロセッサの構造
  28. 補足: CUDA CUDA (Compute Unified Device Archtecture) • (制限はあるものの) NVIDIAのGPU上で実行できるCプログラムを記述可能

    • CUDAスレッド • 最下位レベルの並列処理 • POSIXスレッドとは全く異なる (任意にシステム・コールを行ったり同期をとったりできない) • CUDAスレッドを複数束ねてブロック化し,GPU内での並列処理や並列性を活用 • マルチスレッドの各プロセッサが各ブロックを実行 OpenCL (Open Computing Language) • CUDAの利点を活かしつつ,さらに移植性の高いプログラミング言語を開発 するプロジェクト • 他ベンダのGPUでも実行可能
  29. NVIDIA GPUメモリの構造 • CPUでマルチレベルキャッシュに使われていた領域は • より多くのプロセッサの実装 • SIMD命令で実行される多くのスレッドの状態を保持する大量のレジス タ実装 に利用

    • 最近のGPUは追加のキャッシュを備えていることがある • GPUメモリへのリクエスト低減 • マルチスレッディングでレイテンシを隠蔽できないようなある種の変 数用のアクセラレータ
  30. DSAとは? 1. 専用のメモリを使用 • 汎用マイクロプロセッサの多階層キャッシュは領域・エネルギーを多 く消費する • 無駄なキャッシュを排し,メモリをソフトウエア制御することにより 無駄なデータ移送を削減 2.

    高度なマイクロアーキテクチャ的最適化を止め,そのリソー スを算術装置や主記憶の増強に注ぎ込む • ドメイン固有の領域では実行されるプログラムがあらかじめわかって いる • 汎用プロセッサ向けの機能に割くリソースは不要になり,それらを処 理装置や専用メモリの拡大に充てられる
  31. DSAとは? 3. ドメインに適合する最も容易な形の並列性を利用する • 対象となるドメインにはほとんどの場合,そのドメイン固有の並列性 がある • その並列性の形態に応じて並列実行できるような形にDSAを設計する 4. データのサイズとタイプをドメインに必要最低限・単純なも

    のへと削減 • 多くのドメインではメモリにより制約を受ける(メモリ・バウンド的) ことが多い • 幅の狭いデータ・タイプを使用することで,有効なメモリ・バンド幅 およびオンチップ・メモリの利用効率を高め,同じチップ領域・許容 エネルギーあたりでより多くの処理装置を詰め込むことができる
  32. DSAの例: Google TPUv1 具体的な性能 • 6つの実用DNNアプリケーションの平均 • 現代のCPU比: 29.2倍高速 •

    現代のGPU比: 15.32倍高速 • コスト性能比 • 総運営費用 (total cost of ownership: TCO) を評価基準に • ハードウエアの購入費用,運用中の電力・冷却・占有面積による運用コスト • 当初の目標: TCOあたりCPU・GPUの10倍の性能 • 消費電力値をTCOの目安として利用 • ワットパフォーマンスでGPUの29倍,CPUの83倍 DSAを開発することで目標を達成できた!
  33. メッセージ交換型マルチプロセッサ メッセージ交換型マルチプロセッサ • 各プロセッサは固有の物理アドレス空間を持 つ • マルチプロセッサ同士は明示的なメッセージ 交換を行う • メッセージ送信ルーチン

    / メッセージ受信 ルーチンの間で調整が行われる • 受信側から送信元に応答することでメッセー ジ到達を確認 (Ackのようなもの) メッセージ交換を行うマルチ プロセッサの古典的な構成
  34. メッセージ交換型マルチプロセッサ • ハードウエア設計が行いやすい • プログラマにとっては • 情報交換のタイミングが明示的 →共有記憶型にありがちな暗黙的な情報交換によって予想外に性能が落ち込む 問題が少ない •

    逐次処理プログラムを移植することが難しい • あらゆる情報交換のタイミングを事前に洗い出しておくことが必要になる • 今日では • マルチコア・マイクロプロセッサ間レベルでは共有記憶型 • クラスタ内のノード間レベルではメッセージ交換型 が用いられている
  35. クラスタ • 標準的なネットワークで結合された単一のメッセージ交換型マ ルチプロセッサとして機能する,コンピュータの集合体 • 通常の汎用マシンなので低コスト • 各ノードではOSの別個のコピーが独立して稼働 • アプリケーションはOSのレイヤ上で稼働

    • 主記憶は分割されている • タスク・レベルでの並列性や情報交換がほとんどないアプリケーショ ンであれば実行にアドレス共有を必要とないので問題なし • システムを停止させずにノードの交換,拡張などが可能 →システムの可用性・拡張性向上
  36. グリッド・コンピューティング • クラスタは全ノードがLAN内 • グリッド・コンピューティングはWANに分散 • 情報交換のハードルが高い • 各ワーカーノードである程度計算し,計算結果をマスターに集約 •

    具体的なプロジェクト: 最近だとFolding@home • タンパク質のふるまいのシミュレーションを行うプロジェクト • ボランティアとして参加した,インターネット上にあるアイドル状態 のコンピュータの演算能力を活用 • 2.4EFLOPSを達成 (世界初のエクサスケールコンピュータ)
  37. WSCにおける処理の例 MapReduce,Apache Hadoop (OSS) • WSCにおけるバッチ処理で最も普及しているフレームワーク • 並列化されたMapReduceタスクを簡単に実行可能 処理の流れ 1.

    プログラマが定義した関数を適用 2. Mapステップ • マスターノードがタスクを分割して数千のワーカーノードに配布して処理させ,中間 結果としてkey, valueの組を生成 3. Reduceステップ: • Mapによる分散タスクの出力をマスターノードで収集し,プログラマが定義した別の 関数を使用して集約
  38. WSCの目標 1. 豊富で容易な並列性 • ターゲットとなるアプリケーションに十分な並列性があるか • 並列性を活用するために必要なネットワークのコストが高すぎないか • ex. 要求レベル並列性

    (Request-level Parallelism) • 通常多くの独立した作業を並列して進められ,ノード間通信・同期の必要がほぼ ない • SaaS (Software as a Service)に代表される,独立したユーザが個別に利用する 対話型のインターネット・サービス・アプリケーション (インターネットメール など) • データの読み出し・書き込みに依存関係がない
  39. WSCの目標 2. 運用コストの比重 • 従来のサーバはピーク性能が重要,運用コスト等は二の次 • WSCは耐用・償却年数が長い • 特に建物と電気・冷却系統は10~20年,全体に占めるコストは30%以上 3.

    規模及び規模に関連した機会 • 機材の発注数が多いのでベンダから割引を受けられる (規模の経済) →WSCのノード単位コストが低減 →クラウド・コンピューティングの提供コスト低減,価格引き下げ • 規模が大きい →それだけ故障の機会も多い →設計上WSC全体の耐故障性が重要
  40. まえおき • マルチコア・チップやノードの相互接続にはそれに適したネッ トワークが必要 • ネットワークを構成する要素 • スイッチ (全体のスイッチ数,スイッチあたりのリンク数,帯域幅) •

    ネットワークをチップに組み込む際のリンク長 • ノード同士の位置関係 • 無負荷・負荷ありでのレイテンシ,スループット,遅延,etc... • 耐故障性 • エネルギー効率の高さ
  41. ネットワーク・トポロジ • 通常はグラフで表現 • トポロジの評価尺度: • 「総合的な」ネットワーク・バンド幅 (network bandwidth) •

    各リンクのバンド幅にリンク数を乗算,ピーク・バンド幅を表す • 2分割バンド幅 (bisection bandwidth) • 頂点が半分ずつになるようシステムを2分割 • 一方のグループのノードから他方のノードに伝送したいときのバンド幅に相当 • 対称形でない場合はネットワーク性能が最も最悪になるように分割 • 仮想上の分割線を横切るリンクのバンド幅を計算 • 最悪の場合に近い値を表す • 並列プログラムの性能は最弱のリンクに制約を受けることが多い
  42. 様々なネットワーク・トポロジ 商用の並列プロセッサで使用されている代表的なトポロジ • 各スイッチはノードと1:1接続 • 2次元格子 (メッシュ) • 縦横にリングネットワーク •

    これをさらに進化させた多次元トーラス は近年のHPCネットワークで よく利用される • ブーリアンnキューブ・トポロジ • 2𝑛個のノードと𝑛次元空間で相互結合する • 隣接ノード数も𝑛
  43. 様々なネットワーク・トポロジ マルチステージ・ネットワーク (multistage network) • 一部のノードはスイッチのみを置く • スイッチはノードよりも小さい →高密度化,ノード間の距離も小さくできる •

    メッセージがいくつかのステージ を経て送られる • クロスバ・ネットワーク (crossbar network) • あるノードから任意の他ノードへ 1パスで通信可能 8ノードのマルチステージ・ネットワーク
  44. 様々なネットワーク・トポロジ • オメガ・ネットワーク (Omega network) • クロスバ・ネットワークよりも使用するスイッチが少なく済む • 𝑛2 vs

    2𝑛log2 𝑛 • 通信パターンによっては競合が発生 • ex. 𝑃1 → 𝑃7 と𝑃0 → 𝑃6 は同時に通信できない スイッチ数: 64 スイッチ数: 48
  45. ネットワーク・トポロジの実現 • 実際のネットワークでは • リンクの長さ • 長いリンクで高クロックの通信をするのはコストが高い • 逆に短いと各リンクの配線数を増やすことが容易に・コストも低くなる •

    3次元のトポロジをチップやボード (2次元) にマッピングする方法 • エネルギー これらの制約により,理想的なネットワーク・トポロジが実現できない こともある
  46. クラスタの相互接続 LANの主流はEthernet • 時代とともに高速化 (2023年現在では800GbEがIEEE 802.3で標準化策定中) • NIC (Network Interface

    Card) によりノード間を接続 • NICは1つのインタフェースでTX (メッセージの送信) とRX (受信)の両方を行う PCIe (Peripheral Component Interconnect Express) • 高速なI/Oをマイクロプロセッサに接続するための最も一般的なリンク • 基本的な構成要素: シリアルレーン • 4本のレーン: 2×2の全二重 → リンク • リンクを複数レーン束ねて必要な帯域幅を利用 (最大32レーン) • 2023年現在で最新はPCIe 5.0 (双方向32Gb/s/レーン) NetFPGA 10GbE NIC
  47. PCIe 図の10GbE NIC: PCIe 1.1 x8 • 双方向2Gb/s/レーン ×8レーン =

    16Gb/s • 10GbEの各リンクでそれぞれ送信待ち行列と受信待ち行列を持ち,そ のそれぞれが長さが最大 (MTUのサイズ分)のEthernetパケットを2つ ずつ格納できる • ホスト・コンピュータとのやり取り用に32件を保持できる待ち行列が 2つある 待ち行列 NetFPGA 10GbE NIC
  48. メモリ・マップI/O • アドレス空間の一部をI/O装置に充てる • NICに命令を与えるために,プロセッサは装置のアドレスを指定して コマンド語を発する ←装置のアドレスが必要 • ブート中にPCIe装置は指定した長さのアドレス領域割当を要求 •

    以降は該当アドレス宛のアクセスは各装置に振り向けられる = 各装置への命令 • 割り当てられたアドレス空間にユーザ・プログラムは直接アク セスできない • 代わりにあるアドレスへアクセスすることで利用できる
  49. ネットワークのパフォーマンス改善 パフォーマンス低下の原因: SW: • OSのアドレス空間 ←→ ユーザのアドレス空間のデータコピー • リソース (メモリ)

    が枯渇しないうちに処理を完了させる必要がある • カーネル空間 ←→ ユーザ空間のコンテキストスイッチ切替 • 割込みによるパイプラインの乱れ HW: • Ethernetパケットのフィールドの値計算 • デバイス・ドライバ (CPU) で行うとPCIe経由の通信が発生 → レイテンシ増加 • 記憶階層における無駄なアクセス • 制御用に使用されるデータを主記憶に書くとキャッシュに都度書き込む羽目に
  50. ベンチマーキング・システム における注意点 主に設定されることが多い規則 (逸脱すれば結果は無効となる) • ベンチマーク内容は変更できない • ソース・コード,データ・セット,正解データ等は固定 • ただし,問題の規模を大きくしてもよい

    (弱いスケーリング) • プロセッサ数が大きく異なる環境でもベンチマークを実行するため • 強いスケーリングはNG • 規模の異なる問題を対象にベンチマークを実行した結果を比較すると きは注意が必要
  51. 性能モデル • 浮動小数点のピーク性能を用いる • マルチコア・チップでは全コアのピーク性能の合計 • マルチプロセッサのシステムではチップあたりピーク性能×チップ数 • 記憶システムに対する要求の高さを1つの指標に •

    上記のピーク性能を,アクセスされたバイトあたりの浮動小数点演算 の平均数で割ることで推測できる • ピークの浮動小数点演算数/sec 浮動小数点演算の平均数/Byte = Byte/sec
  52. 性能モデル • 算術強度 (arithmetic intensity) • プログラム実行中にメモリへ転送されたデータのバイト数に対する, プログラム中の浮動小数点演算数の割合 (データを転送する間に何回演算しているか) •

    問題の規模に応じて算術強度強度が高まるカーネル (密行列),無関係 なカーネルがあることに注意する • 前者は記憶システムに対する要求が低い → 弱いスケーリングでは異なる結果になることがある バークレー・デザイン・パターンにおける算術強度
  53. ルーフライン・モデル • 浮動小数点演算のピーク性能はハードウエア仕様から求まる • ピーク性能に達するまでは? →記憶システムに対する要求の高さに依存 • メモリのピーク性能はキャッシュの背後にある記憶システムに 依存する •

    カーネルのワーキング・セットはキャッシュに収まらない大きさ • メモリのピーク性能ベンチマーク例: Streamベンチマーク • 長いベクトル演算の性能を測定 • 時間的局所性なし • コンピュータのキャッシュよりも大きな配列にアクセス
  54. ex. 2世代間のCPUの比較 AMD Opteron X2 AMD Opteron X4 メモリのピーク・バンド幅 (同じ)

    (同じ) コア数 2 4 クロック・サイクルあたりの 浮動小数点演算命令数 1 2 クロック周波数 2.2GHz 2.3GHz L3キャッシュ — 2MiB → 4倍以上の浮動小数点演算ピーク性能
  55. プログラムの最適化 演算能力上のボトルネック • 浮動小数点演算ミックス • 同じ数の乗算と加算をほぼ同時に行う • 積和命令 (FMA)が実行される (𝑎

    = 𝑎 + (𝑏 × 𝑐),3.5のヒューズド積和) • 浮動小数点演算ユニットは同じ個数の加算器と乗算器を備えている • ILP (命令レベル並列性)の改善 & SIMDの適用 • スーパースカラ・アーキテクチャではクロック・サイクル毎に3~4命 令が実行されると最も性能発揮できる • ILPを高めることでこれを達成 (ex. ループ展開) • x86の場合は単一のAVX命令で倍精度オペランドを8つ操作できるので それも用いる
  56. プログラムの最適化 どのアプローチを選択すべきか?→ルーフライン・モデルを活用 • 演算能力の場合 • 浮動小数点演算のピーク性能 • プロセッサのマニュアルを見る • メモリの場合

    • メモリのピーク・バンド幅 • Streamベンチマークを実行 • NUMAノードは実験を行って実際のバンド幅との差を把握 最適化手法に対応する「天井」を打ち破る必要がある
  57. DNNとの訓練と推論 • DNNの訓練 (学習) のフェーズを高速化する • どのようなハードウエアで高速化するか? • GPU •

    DSA (Google TPU, NEC SXシリーズ, etc...) ここではGoogle TPUv3を例にとり, NVIDIA Volta GPU (Tesla V100)と比較する
  58. DNNの処理手順 (おさらい) 1. 順伝播 • ランダムに選んだ学習データをモデルの入力に適用し推論結果を算出 • 推論ならここのフェーズで止める 2. 逆伝播

    • 各層を出力から順にさかのぼり,それぞれの損失を算出 • ここの処理が重い 3. 重み更新 • 各層の入力と損失を組み合わせて,それぞれの重みの変化 (デルタ) を 計算 • 重みの変化を重みに加算 • この処理の負荷は比較的小さい
  59. スーパーコンピュータ・ネットワーク TPUv3では • 32×32 (1024チップ) のトーラストポロジ • 2分割バンド幅: 64リンク ×

    656Gbp = 42.3Tbps • 一方64ノードを接続しているInfiniband HDRのネットワークでは... • 単一の64ポートスイッチで全ノード接続 • 高々64リンク × 100Gbps = 6.4Tbps • 高コスト
  60. 実際の性能比較 • TPUv3 • ICIによる相互接続,独自コンパイラによる全縮約処理のサポート • 128x128の配列,bf16 • 計算,メモリ,ネットワークはコンパイラが制御 •

    V100 • 同一ノード内のNVLink • ノード間のInfiniBandネットワーク • 4x4または16x16,fp16,損失スケーリングが必要 • 多くのスレッドを保持できる巨大なレジスタ・ファイル,CUDAが処 理操作の重ね合わせを制御
  61. 実際の性能比較 • TPUv3 • 32MiBのスクラッチパッド・メモリをソフトウエア制御,コンパイラ によってスケジュール • DRAMへの順次アクセスをTPUv3上のDMAコントローラで指示 • V100

    • 6MiBをハードウエア制御,7.5MiBをソフトウエア制御 • DRAMへの順次アクセスにマルチスレッディングと結合処理用のハー ドウエアを使用
  62. 1. Amdahlの法則は 並列コンピュータにも適用できる ex. 同一時間で1000倍の仕事量をこなせるようスケーリング → 逐次処理部分は入力の規模関係なく一定,残りはすべて並列的 → 1000個のプロセッサでも線形の速度向上が実現 →「Amdahlの法則が破られた」

    違う,そうじゃない... 強いスケーリングで考えるべき (同一データ・セットに対して1000倍の高速化) ユーザの関心が弱いスケーリングにある場合ももちろんあるので 注意が必要
  63. 3. 斬新なアーキテクチャを十分に活用した, あるいはそれに最適化した ソフトウエアを開発すべきである 斬新なハードウエア ≠ 高速なハードウエア • 高速に動作させるにはソフトウエアによる最適化が必要 •

    ex. マルチプロセッサ環境でのOSのアルゴリズム・データ構造 • マルチプロセッサでは複数のプロセスがページ割当 • ページ・テーブルが単一のロックで保護されていると... → 別のプロセスがロック解除するまで使えない → 並列ハードウエアなのに直列化
  64. 4. 優れたベクトル性能を得るために メモリのバンド幅は増やすべきである • ルーフライン・モデルをよく思い出してください • DAXPY (Y = 𝑎

    × 𝑋 + 𝑌, Double-precision A×X Plus Y) • 浮動小数点演算毎に1.5回のメモリ参照が必要 → メモリによる制約 • ex. Cray-1におけるLinpackベンチマーク • 元々メモリのバンド幅が不足 →値をベクトル・レジスタ中に保持できるよう計算を変更 → FLOPSあたりのメモリ参照回数の低減 → 2倍近くの性能向上 ルーフライン・モデルにより予測できる
  65. 5. 命令セット・アーキテクチャ (ISA) は 物理的な実装上の特性を 必ずしも隠ぺいしない Spectreの攻撃手順 1. 不正な命令をあえて投機的に実行 •

    予測は外れ,処理は元に戻されるがキャッシュは復元されない • 後の工程のための手がかりをキャッシュ上に残す 2. 先の手順でキャッシュ上に残した手がかりを追跡し,本来ア クセスできないはずのデータへアクセスする 3. 近傍で実行される攻撃対象のプログラムの命令に紛れ込む • ハードウエア・マルチスレッディングではあるプログラムの命令が他 のプログラムの命令と混ざることは普通にあり得る
  66. おわりに • マルチプロセッサによる並列コンピューティングのアイディア は昔からあった • 大幅な速度向上をする並列プログラムを作ることは難しい (Amdahlの 法則による限界) • 現在のトレンドも並列コンピューティング

    • 昔とは状況が違う • (SaaS向けクラスタ,ウエアハウス・スケール・コンピューティング,マルチメ ディア・アプリケーション,機械学習等) • どのベンダも作っているのはマルチプロセッサ • マルチプロセッサがかつてのユニプロセッサと同じ扱いに (非線形の性能向上で 許される) • オープンソース運動の興隆
  67. おわりに 3章~6章にかけてDGEMMを高速化 • 3章: データ・レベル並列性 • 512bit AVX命令のオペランドを利用 (SIMD) •

    64bitの浮動小数点演算を8つ並列に実行 → 7.8倍高速化 • 4章: 命令レベル並列性 • ループを4回展開し,アウトオブオーダー実行ハードウエアにスケ ジュールすべき命令を多く供給 → 1.8倍高速化
  68. おわりに 3章~6章にかけてDGEMMを高速化 • 5章: キャッシュ最適化 • キャッシュ・ブロッキングを利用してキャッシュ・ミスを低減 →L1キャッシュに行列が収まらない場合の性能を1.5倍高速化 • 6章:

    スレッド・レベル並列性 • OpenMPによりマルチコア・チップのすべてのコアを利用 (MIMD) → 12~17倍高速化 最終的な性能向上は150倍以上