FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages

Computer Architecture 6th Editionの7章"Domain-Specific Architecture" を読む (7.1, 7.2章)

ヘネパタ第6版こと、"Computer Architecture 6th Edition" では、第7章でドメイン固有アーキテクチャの章が新設された。 これを機会に、しっかり読んでいこう。

Computer Architecture, Sixth Edition: A Quantitative Approach (The Morgan Kaufmann Series in Computer Architecture and Design)

Computer Architecture, Sixth Edition: A Quantitative Approach (The Morgan Kaufmann Series in Computer Architecture and Design)

目次

これは著者が読んだ内容をまとめているだけなので、誤訳、理解不足により誤っている可能性があります!鵜呑みにしないようにお願いします。


7.1 イントロダクション

ゴードン・ムーアの提唱した半導体プロセスの法則について、彼自身はまたその終焉についても言及している。 その証拠に、彼の創業したインテルでも、半導体プロセスの開発の速度は鈍化し始めている。

本書のこれまでの章で紹介したように、半導体プロセスの進化によって、1980年には5ステージの単純なパイプラインにより25,000個のトランジスタでのみ構成されたプロセッサは、現在は100,000個のトランジスタにより、汎用的なコードを汎用プロセッサで高速に動作させるようなメカニズムが搭載されるようになってきている。 - 1次キャッシュ、2次キャッシュ、3次キャッシュ、4次キャッシュ - 512bit 浮動小数SIMDユニット - 15ステージ超のパイプライン - 分岐予測 - アウトオブオーダ実行 - 投機プリフェッチ - マルチスレッディング - マルチプロセッシング

これらの洗練されたアーキテクチャは、C++のような効率的な言語で書かれた数百万行のプログラムで威力を発揮することをターゲットにしているが、アーキテクトはこれらのコード自身はブラックボックスとして扱い、このコードが実際にはどのようなプログラムであるのかについては関知しない。 SPEC2017のようなベンチマークプログラムは、CPUの性能を測定するために人工的に作られたプログラムである。 コンパイラの開発者はハードウェアとソフトウェアの橋渡しを行う人々ではあるが、彼らはアプリケーションの高位な動作についての知識は限定的なものである。 これにより、コンパイラC/C++GPUアーキテクチャの部分で、文法的な橋渡しを行うことが出来無くなってしまう。

第1章で説明したように、でなーどスケーリングはムーアの法則が終焉するよりも前に終わっている。 これにより、より多くの取らんじ沙汰がスイッチングすることにより、より多くの電力が消費されるようになり、シングルコアの性能を向上させるよりも、マルチコアで処理を分散させる方向に進んでいる。 汎用プロセッサのコストパフォーマンス電力効率を向上させるためには、私たちは他に手の打ちようがないのである。 なぜならば、使うことの出来る電力は限られており(エレクトロマイグレーションや、チップの構造や温度の限界による)、これ以上高い性能(1秒間あたりの演算量)を向上させるためには、演算当たりの消費電力を下げる必要がある。

図7.2は、第1章で示したメモリと論理のエネルギーコストの相対値を示したものである。 このオーバヘッドでは、既存のコアを多少改造することにより10%の電力効率向上を行うことが出来るかもしれないが、プログラマビリティを維持しながら桁違いのエネルギー効率改善を行うためには、コアの演算器の数を1から数百に増やす必要がある。 このレベルの効率向上を行うためには、汎用コアから"ドメイン固有アーキテクチャ(Domain Specific Architecture: DSA)"に抜本的な変更を行う必要がある。

したがって、かつてシングルコアからマルチコアに映ったように、汎用プロセッサとDSAでチップを構成するという動きに代わってきている。 汎用プロセッサは、オペレーティングシステムのような巨大なプログラムを動作させて、DSAは実行できるタスクの領域は小さいが、非常に高速かつ効率的に動作することが出来る。 このようなコンピュータは、かつてのホモジニアスのマルチコアというよりも、ヘテロジニアスなコンピュータであるということが出来る。

これまでの数十年は、ムーアの法則に従ってアーキテクチャを増強させてきた(キャッシュ、アウトオブオーダ実行、など)。 これらの構造は、アルト固有のアプリケーションの分野では活用できない場合が多い。 例えば、キャッシュは汎用プロセッサにおいては非常に有用であるが、DSAで実行する、アプリケーションのメモリアクセスパタンが予測やすいようなものや、巨大なデータを使用しており、キャッシュがほとんどヒットしないような場合には有益ではない。 従って、DSAは特定のアプリケーションにおいてシリコンの使用効率を向上させ、エネルギー効率を向上させることが出来る。

アーキテクトは、SPEC2017のような巨大なC++のアプリケーションを全てDSAで実行しようとはおまわないだろう。 ドメイン固有アルゴリズムは、ほとんどの場合大きなシステムの中の、計算が中心になる小さなカーネルの部分に焦点があてられる。 たとえば、物体認識や音声認識などである。 DSAはプログラム全体を実行するわけではなく、そのプログラムの一部に焦点を当てる。 さらには、ベンチマークプログラムのソースコードを書き換えるのは特に問題ない行為である。 したがって、DSAに興味を持ったアーキテクトはアプリケーションのドメインアルゴリズムについても興味を持つ必要がある。

さらに、専門の領域を拡大させるだけでなく、ドメイン固有アーキテクチャのアーキテクトは、ターゲットとして十分にSOCのシリコンを使う価値があるかどうかを考える必要がある。 カスタムチップにおける「開発費負担(nonrecurring engineering: NRE)」は、チップの設計費用とカスタムチップのソフトウェアの開発費が含まれる。 例えば、1000チップ程度しか出回らないようであれば、それは価値がなくなってしまう。

少量のチップしか出回らないアプリケーション領域で、DSAを使用するための一つの方法としては、FPGAのような再構成可能なチップを使うということである。 再構成可能なチップのNREは、カスタムチップのNREよりも低く、同じチップを用いていくつかの異なるアプリケーションを実行することが出来るようになる。 しかし、ハードウェアの効率はカスタムチップよりも高くはないため、FPGAによって得られる利益は限定的である。

もう一つのDSAの挑戦は、ソフトウェアの移植である。 C++プログラミング言語のような、慣れ親しんだソフトウェアの開発環境とコンパイラを提供することは容易ではない。

以降では、DSAの設計のための5つのガイドラインについて紹介し、例としてディープニューラルネットワーク(Deep Neural Network:DNN)について紹介する。 DNNは現在のコンピュータ業界の様々な領域において革命的であるため、例として選んだ。 いくつかのハードウェアターゲットと異なり、DNN固有のアーキテクチャは、多くの問題に適用可能である。 従ってDNN固有アーキテクチャを、音声認識、画像認識、言語認識、翻訳、サーチランキングなどの様々な幅広い領域に適用可能である。

私たちは、4つのDSAの例について見ていく。 データセンタにおける、DNNを高速化させるための2つのカスタムチップと、多くのドメインにおいて高速化を行うためのFPGAに搭載したDNN、さらに情報端末(Personal Mobile Device: PMD)用に、画像処理を行うためのチップについて紹介する。 DSAのコストパフォーマンスについて、DNNのベンチマークを用いてCPUとGPUと比較する。

7.2 DSAのガイドライン

ここでは、7.4章から7.7章までで見ていく、DSAデザインの一般的なガイドラインについて見ていく。 これらの5つのガイドラインは、面積効率やエネルギー効率の向上を導くだけでなく、以下の2つのメリットももたらす。 まず、デザインをシンプルにし、DSAのNREを削減する。 次に、7.9章でみるように、これらの原則に従うDSAアクセラレータは、従来のプロセッサのような性能最適化のような最適化よりも、ユーザアプリケーションのような応答時間のデッドラインを守るようなアプリケーションに適している。

  1. データの移動距離を最小化するために、専用メモリを使用せよ。 マイクロプロセッサの複数レベルのキャッシュは優れたものだが、固有のアプリケーションにおける特定の関数内でのデータの移動は、ソフトウェアにより制御されたメモリによって実現することが出来る。

  2. 高度なマイクロアーキテクチャ最適化されたリソースを、より多くの演算器とメモリに使用する 7.1章説明七曜に、ムーアの法則によりCPUとGPUは資源を集中させる最適化(アウトオブオーダ実行、マルチスレッディング、マルチプロセッシング、ぷりふぇっチング、アドレス結合など)を行ってきた。 しかし、範囲の狭い固有ドメインでは、これらの資源は、より多くのプロセッシングユニットもしくはオンチップメモリに使用した方が適切である。

  3. ドメインにマッチする並列性の形を使用せよ DSAのターゲットのドメインは、常に本来並列性を持っている。これを活用する。 たとえば、データレベルの並列性を持っているアプリケーションならば、MIMD演算を使用するよりもSIMD演算を活用することが出来る。 そのドメインで命令セットの並列性があるならば、VLIWを活用することが出来る。

  4. データサイズを削減し、そのドメインで必要な型に限定する

多くのドメインのアプリケーションでは、典型的にメモリアクセス性能に律速される。したがって、小さいデータ型を使うことにより、メモリ帯域とオンチップメモリの使用効率を向上させることが出来る。

  1. コードをDSAに移植するためにドメイン固有のプログラミング言語を使用せよ

ドメイン固有のプログラミング言語は、アーキテクトがDSAに注目する前から有名になり始めている。 たとえば、画像処理のためのHalideやDNNのためのTensorFlowなどである。 これらの言語はアプリケーションをDSAに移植しやすくする。

ガイドライン TPU Catapult Crest Pixel Visual Core
デザインターゲット データセンタ ASIC データセンタ FPGA データセンタ ASIC PMD ASIC/SOC IP
1. 専用メモリ 24MB ユニファイドバッファ 4MB アクセラレータ 構成変更可能 N.A. コアあたり: 128kB ライン バッファ: 64KB P.E. Memory
2. 多くの演算ユニット 65,536 積和演算器 構成変更可能 N.A. コアあたり: 256積和演算器 (512ALU)
3. 並列性 シングルスレッド、SIMD、 インオーダ SIMD, MIMD N.A. MPMD, SIMD, VLIW
4. データサイズ削減 8-bit, 16-bit 整数 8-bit, 16-bit整数 32-bit 浮動小数 21-bit浮動小数 8-bit, 16-bit, 32-bit整数
5. ドメイン固有言語 TensorFlow Verilog TensorFlow Halide/TensorFlow