———————————————————————————————————————— セッションS5-c 「Pythonによる高位設計フレームワークPyCoRAMでFPGAシステムを開発してみよう」 コーディネータ: 高前田 伸也(奈良先端科学技術大学院大学) 参加者23名 ———————————————————————————————————————— ○概要 利用者が構成の変更が可能なデバイスであるFPGAは幅広い用途に利用されており,評価ボードの低価格化・小型化に伴ってソフトウェア技術者などにも広まりつつある. 開発方式は抽象度が高まりつつあり,アプリケーションをIPコアという形でパッケージ化し,EDAツール上でそれらを組み合わせることにより,システムが実現できる. このセッションでは,Pythonによる高位合成とメモリシステムの抽象化を用いたポータブルな設計フレームワークであるPyCoRAMを用いた,FPGAシステムの開発方法について解説する. また,参加者と共に今後の高位設計環境に求められるものは何かを議論し明らかにする. ○テーマ • 「好きな道具」で「好きなもの」を作る世界  発表者の場合   - 好きな道具:好きな言語(Python)・モデル・書き方   - 好きなもの:FPGAを使ったカスタムコンピュータ • 「こんな風に設計できたらいいな」を実現しよう  発表者の場合   - PyCoRAM:PythonによるIPコア高位設計フレームワーク   - Pyverilog:Verilog HDL解析・生成ツールキット   - Veriloggen:PythonでVerilog HDLを組み立てる軽量ライブラリ 自分の手になじむ道具を実際に作って公開すると,誰かが「こっちの方がいいだろう」や「これいいね」など多からず少なからずコメントや反響がある. こういった研究者スタイルも楽しい すべてのツールはGitHubで公開している. PIPでもインストール可能 ○FPGAとは MulticoreやGPUやManycoreというのはノイマン型のコンピュータであるので 命令を持ってくる→読む→処理する→書きもどす という動きである.これをどういう粒度でやるか,どういうスピードでやるか,誰が同時に何人やるというのが違うだけである. 一方,FPGAはハードウェアの構成が変更できる.回路の形を変えて回路そのもので計算をする. 回路の形が命令のようなものであり,命令のようなものをを貼り付けていってコンピュータを作る. まとめると, • 中身を改変可能なLSI  - 設計者が独自のデジタル回路を形成することができる  - 対してCPUやGPUはFLD(Fixed Logic Device) • CPUなどとの大きな違いは?  - CPUの振る舞いはソフトウェア(プログラム)で規定される   ユーザはCPUそのものの回路を変更することはできない  - FPGAの振る舞いはハードウェアそのものの変更で変えられる ○FPGAの用途 • LSI設計・検証のプラットフォームとして  - LSI機能を製造前に検証  - HWの完成を待たなくてもSW開発検証ができる  - ソフトウェアシミュレータによる回路シミュレーションよりも高速に検証できる. • 最終製品に組み込むLSIとして  - 画像処理  - ネットワーク機器 • アクセラレータとして  - データベース  - ウェブ検索  - 証券取引  - 機械学習 もともとはLSI設計・検証のプラットフォームとして使うというのがそもそもの使い方である. LSIは一回の製造にかなりのお金がかかる.さらに,できあがってからバグが見つかると,とんでもないことになる.なので,その前に十分に検証しなければならない. 普通,検証とはソフトウェアのシミュレータで仮想的に検証するといったことをする.しかし,ソフトウェアのシミュレータというのは仮想的にLSIのモデルをCPUに作るのでとても遅い. そこで,速く検証するためにFPGAにハードウェア化しておとすと十分速い速度で検証をすることができる.これによってはやめにバグが見つかってお金もセーブできる. 最近では製品やシステムを組み込むというのが増えてきている.例えば画像処理などでよく使われている. ○増え続けるFPGAの回路規模 • トランジスタのスケーリングによりFPGAの回路規模も増大  - 5年で6倍以上に増加  - 今後も更なる増加が予想される • その分設計が大変に  - 設計検証の時間が増大  - 効率的な開発方式が必要 CPUもトランジスタの数増えているから大変じゃないのか? ある程度大変ではあるが,そうでもない. 新しい世代のCPUは何にトランジスタを使っているのかというとやはりキャッシュメモリである. キャッシュメモリとは自分で明示的にどう動くか書くものではなく,命令の列が動いたその副作用でなにかが起こる. キャッシュがでかければでかいほどメモリアクセスがはやくなって,はやく計算ができるという仕組み. 多くのCPUはキャッシュメモリの拡大やユーザーが見えないところのリソースの拡大にトランジスタを使っている. 一方,FPGAでは,構成要素の数そのものが増え,ユーザーに見えてしまう.つまり,使うユーザーが増えた分を使わないと増えても意味がない. こういった問題をどうにかするために高位合成というものが普及し始めている. ○近年のFPGAを取り巻く環境 ARM搭載のFPGAが登場 • 普通のFPGAと何が違う?  - そもそも通常のFPGA上もCPU搭載可能(ソフトマクロ)  - コア性能が数倍~10倍違う • 独自のHW/SW協調SoCの実現が容易になる  - 面倒な処理はCPU上のソフトウェアで実現  - 並列処理部はFPGA上の専用ハードウェアで実現  - CPU-FPGA間のデータ共有はキャッシュ・DRAMをCPUとロジックで共有しているので簡単 浮動小数点ユニット搭載FPGA • 従来のFPGAのDSP(乗算)ユニットは整数のみ対応  - 浮動小数点演算は変換ロジックを組み合わせて実現 • Altera次期モデルがハードマクロ浮動小数点DSPを搭載  - コンピューティングデバイスとしてのFPGAの利用が増加? IPコアベースのシステム開発環境の普及 • IPコアを開発・追加して繋げばHW完成  - 標準的なインターコネクトでIPコア達を接続  - EDAツールが自動的にインターコネクトとデバイス依存のインターフェースを生成してくれる   ため楽 アプリケーションの変化 • 以前は画像処理やネットワーキングなどが主流 • 「ビッグデータ」指向へ:脱ノイマン型?  - イーサネットNICでMemcached  - Microsoft Bing search engine (Catapult) ○高位合成とは? • 動作モデルからRTLモデルを生成するツール・コンパイラ  - 入力:ソフトウェアのソースコード  - 出力:RTL(HDLソースコード) • 構成:SWコンパイラと同等のフロントエンドと高位合成ならではのバックエンド  - フロントエンド:抽象構文木(AST)生成・コントロールデータフロー(CDFG)解析  - バックエンド:「いつ」「どの演算」をするか決めたり,演算を演算器に変数をレジスタに割   り当てたり Verilogを書くのがすごく大変なので,それをさぼるためのツール ○RTL設計と高位合成設計の違い • RTL設計  - クロックサイクルレベルでレジスタ間のデータ移動や演算のタイミングを定義する  - Timed設計:「なに」を「いつ」「どのように」行うかを定義  - 通常のソフトウェアでいう「アセンブリ」の様なもの • 高位設計  - 汎用プログラミング言語を用いて振る舞いを定義  - Untimed設計:「なに」を行うかを実装  - 通常のソフトウェアでいう高級プログラミング言語に設計 高位設計で一番嬉しいのはUntimedな設計ができること Verilogの場合は「なに」を「いつ」行うかを定義しなければいけない.高位合成の場合は「なに」をするかさえ書けばシステムを作ることができる. 「いつ」「どのように」やるかはコンパイラが決める. しかし速いかどうかは別である.速い回路を作るためには,追加の情報をソースコードに入れなければならない. 「この回路はこれぐらいのタイミングでこういうことをする」といったような指示をソースコードに入れる. しかしこれは全ての回路に入れる必要はないのでお任せでいいところには入れる必要はない.「ここは大事だな」というところだけ入れておけば設計が非常に簡単になる. ○実際のコード比較 2配列の積和演算をRTL設計と高位設計の両方で設計してみた結果 • RTL設計(Verilog HDL):105行,2098文字,15分 • 高位設計(C言語):11行,163文字,1分 1/10の記述量と1/15の開発時間で設計することができた. ○FPGA向け商用高位合成ツールが多数登場 • Xilinx Vivado HLS  - C/C++で振る舞いを定義・ディレクティブで性能チューニング  - SDSoCならSWコードから部分的にHW化・I/Fも自動生成  - その他C言語ベースImpulse C・CWB・eXCite • OpenCL系:Altera OpenCLやXilinx SDAccel  - ホストPCありき・ホストPC上SWのお作法も定義 ○オープンソースな高位合成ツールの登場 • LegUp:トロント大学で開発されているCベース処理系  - C記述をMIPS CPU用SW部とHW部に自動分割・論文多数 • Synthesijer:Javaによる高位合成処理系  - Java言語仕様に改変なし,サブセットをそのまま合成可能 ○高位合成のメリット・デメリット • メリット  - いつものプログラミング言語でハードウェアが開発できる  - 少ない記述量:RTL設計の1/10以下  - デバッグのしやすさ:通常のソフトウェアとして実行して機能レベルの正しさを検証 • デメリット  - 達成可能な性能・電力効率・面積効率はRTL設計の方が高い  - 癖のあるコードを書く必要がある  - クロックサイクルレベルの振る舞いを書くのが苦手 ○Pythonによる高位設計フレームワークPyCoRAM 背景 • CPU with IP-cores  - ハードマクロCPU(ARM)搭載FPGAが主流に:Xilinx Zynq, etc  - 専用HWはIPコアとして実装し,インターコネクト(AXI4やAvalon)を介してCPUを接続 • どのようにしてアクセラレータIPコアを設計するか  - HDLですべて設計するのは大変  - 性能を出すには高稼働率パイプラインとデータ供給機構が必要 • →データ転送を抽象化すれば幸せそう 接続する先は標準的なインターコネクト(AXI4やAvalon) 設計者は「プロトコルが~」などを気にしなくてよく,「データを書きたいです」「データを読みたいです」というような粒度で書けば難しいことは全てやってくれる. それによって設計がポータブルになるようにする. 例えばAXI4でベタな回路を書いてしまうと,他のプラットフォームで動かない. しかし,もしコンパイラで拾ってくれていれば,再コンパイルすれば動く. こういった抽象化を与えてやれば,Avalonや他のFPGAでも動かすことができる. ○CoRAMとは • FPGAアクセラレータのためのメモリ抽象化  - 高位モデルによるメモリ管理でアクセラレータをポータブルに 未来のFPGAの考え方である. FPGAにどういう風にデータをあげるのかというパターンを書いたスレッド(コントロールスレッド)があればよい. ロジックというのはデータを読みたいだけなので,そのデータを記憶するメモリがあればよい. データを置くメモリがあってロジックはそこからデータを読む.そこに「いつ」「どこのデータを」「どんなふうにもってくるか」をコントロールスレッドで制御する. というふうに分離して設計するというのがCoRAMの考え方である. ○PyCoRAMとは 抽象化されたインターコネクトとメモリシステムの上でIPコアを開発するフレームワーク CoRAMのオープンソースの実装 最近のモダンな環境でちゃんと使えるというところに特化したのがPyCoRAM CoRAMは未来のFPGAの考え方だけであるので,既存のシステムを組み込むことはできない. 今の問題はレゴブロックをいかに簡単に作るかというところが大変であるので,レゴブロックを簡単につくるためにPyCoRAMを作ろうということで作られた. レゴブロックが簡単に作れればあとはCPUが制御すればよいのでそんなに難しくないという考え ○PyCoRAMのフレームワーク構成 • 入力:2種類のソースコード  - データフロー:Verilog HDL  - データ転送制御:Python • 出力:演算パイプと制御機構を持つIPコア  - DMAを主体としたデータ転送重点型ハードウェアが合成される ○PyCoRAMにおけるIPコアの作り方・でき方 1. 2種類のファイルをを用意する  - Verilog HDL:計算ロジック(データパス)  - Python:コントロールスレッド(制御) 1. PyCoRAMが自動的にIPコアのパッケージを作成  - Python-Verilog高位合成とRTL変換を自動で行う ○デモ 実際のコードを見て,配列の和を求めるプログラムを実際に実行した. 実際のコードを見て, Verilogのコードはメモリに書いてあるデータを読んだり書いたりというのしかやらない. どうやってデータを投げるのかというのをPythonで書く. という構成を説明した. ○FPGAシステム開発で面倒なところ • CPUや他のIPとの接続方法・インターフェース実装  - IPコアのバスインターフェース:AXI4, Avalon • データの置き場・供給方法  - オンチップメモリ(ブロックRAM)・DRAM • CPUとのデータ共有方法  - OSなし:論理メモリ空間 = 物理メモリ空間なので簡単  - OSあり:仮想メモリが存在するため面倒 ○今後の高位合成ツールはどうあるべきか • オープンソースである  - 普段よく使うコンパイラの多くはオープンソース  - 誰でもすぐ導入できるのは正義 • ソフトウェア開発者が自然に導入できる  - 記述モデル:結局,手続き型+オブジェクト指向がよい?  - 多少のディレクティブは許容される • 高位合成系におけるLLVM的環境  - データフローを入力したらスケジューリング・アロケーションしてくれるフレームワーク・足   回り  - 言語や記述モデルでオリジナリティを出す • 好きな言語でハードウェア開発できる  - ソフトウェア開発は用途と好みに応じて言語を学べる  - ハードウェア開発は?→選択肢が少ない • 「好きな道具」で「好きなもの」を作る世界  - 高位設計 ≠ C設計  - 現状Cベースが一番いいのが認めるけどRubyで書きたい,Goで書きたい,Pythonで書きたい ○自分が使いたい道具を自分で作ろう • こんな風に回路が書けたらいいな • あの言語でハードウェアを生成したい • でもそんな道具はない...じゃあ作りましょう! ○質疑応答 Q.ツールを作る研究というのはユーザーがいるわけですが,学生に使わせてユーザビリティを評  価するなどはやっていますか? A.PyCoRAMはあまりユーザーがいない.PyVerilogは結構使われている.作ってみないとどれが  当たるのかわからない. Q.ツールの使いやすさ,使いにくさの話をしていたが,PyCoRAMは最初だったから? A.はまる人,できる人はすごい性能が出せるが,初手の人は難しい.