shtaxxx日記スマートフォン用の表示で見るshtaxxx日記コンピュータアーキテクチャについて研究している研究者の日記や技術紹介この広告は、90日以上更新していないブログに表示しています。found"とエラーが出てビルドができなかった。Toolsをインストールしておけば大丈夫だったはずだが、再インストールしても直らないので、ちょっと手こずった。Toolsのをヘッダーファイルをインストールすればよい。Divergenceを使って活性値の分布をより正確に近似できる量子化パラメータ(最大値と最小値)を探索しているらしいので、それを実装してみた。量子化前後でヒストグラムのビンの幅が異なるので、そのままではKLダイバージェンスの計算ができない。そこで、量子化後のヒストグラムを量子化前のビンの幅を使ったヒストグラムに変換して、KLダイバージェンスを計算することにした。7.0)という異なる最小値・最大値でクリップするようにしており、16個のビンでヒストグラムを作る(=4ビット量子化)場合にどちらが良いかをKL-divで判定する。この場合、q1よりもq2の方がKL-divが小さく、元の分布を正確に表現できることがわかる。Jessie)を動作させるためのチュートリアルを作りました。Slideshareからどうぞ。以下の手順で専用ハードウェア(といってもチュートリアルではGPIOのみ)をLinux経由で制御するHW/SW協調システムを開発します。Takamaeda-Yamazakiwww.slideshare.netアドバイス・コメント等がありましたらお知らせ頂けますと助かります。0.5.0をリリースしました。3.5をサポートしたり、遅延評価・合成の仕組みを入れたり、かなり意欲的な更新です。github.com最近、GoogleのTensorFlowが流行っていますね。そこで、今回の目玉は、パイプライン回路をお手軽に設計できる、データフローライブラリ(lib.dataflow)です。valid)を持つ、RTLでの設計が面倒なパイプライン回路をPythonだけで設計することができます。データフローの可視化にも対応しています。シミュレーションライブラリ(lib.simulation)を使えば、Pythonだけでそのまま回路シミュレーションもできます。試してみましょう!準備(ダウンロード&インストール)以前の記事を参考にインストールしてください。Verilogが別途インストールされている必要があります。ある例を参考にデータフローモデルで回路を書いてみましょう。ヘッダー部Veriloggenを含む各種ライブラリをインポートします。Add)を計算するデータフローパイプラインを作ります。ModuleオブジェクトのmがVerilogのモジュール定義を管理します。データフローで書けるんじゃないの?と思うと思いますが、lib.dataflowもあくまでVeriloggenのライブラリの一つなので、Verilogのソースコードの一部としてデータフローを高い抽象度で組み立てていきます。rxがそれぞれ入力xのdata・valid・readyの信号に対応します。入力y、出力zも同様です。readyがありません。データフロー本体lib.Dataflowオブジェクトのdfがデータフローの定義を管理します。データフローを追加するVerilogモジュールとデータフロー名のプレフィックス、クロック信号・リセット信号を引数で渡します。通常のVerilogの信号からデータフロー変数を作ります。df.input()メソッドに、データフロー変数を構成する生の信号を渡します。データフロー変数pxは、入力xのデータと制御信号で定義しています。入力yのデータフロー変数pyも同様です。ready=ry)次に、実際に演算を定義しましょう。入力xのデータフロー変数pxに定数cを掛け合わせます。データフロー管理オブジェクトdfをメソッドとして呼び出し、演算の定義を引数で渡します。データフローに基づく演算結果もデータフロー変数になるため、dfメソッド呼び出しは新しいデータフロー変数を返します。次にyの加算を追加し、x*c+yを定義しましょう。pxc(px*cの結果)とpy(入力yのデータフロー変数)との積で定義されています。py)そして、データフロー変数pzを生のVerilog信号に接続して、データフロー変数の世界からVerilogの世界に戻ります。pz.output()メソッドに接続先のVerilog信号を渡せば、自動的に接続されます。最後にmake_always()で順序回路としてデータフロー回路を出力します。ついでに、データフローの定義をdraw_graph()メソッドで可視化しましょう。これを使うにはpygraphvizのインストールが必要です。上記の回路本体だけではVerilogシミュレータでの検証ができないので、シミュレーション用コードを付加した、コード全体を以下に記します。#sim.view_waveform()スクリプト実行では、上記のコードを実行してみましょう。test.pyなど、好きな名前で上記のコードを保存して、実行します。test.pyすると、Verilogの長いソースコードが表示された後、シミュレーション結果が表示されたはずです。スクリプトを実行したディレクトリに"tmp.v"というVerilogのファイルができているので、中身を確認しましょう。その中に、以下の様な回路本体の記述があるはずです。Veriloggenのコードでは、演算の関係だけを定義したのですが、実際に生成される回路は、入力が有効かどうかを示すvalidビットや、出力側で現在の値を受理できるかどうかを示すreadyビットでパイプラインの動作が制御される必要があるため、その制御ロジックが自動で追加されています。これは手では書きたくないですね・・・。定義したデータフローがどのようなものか、ソースコードだけではイメージしづらいので、可視化しましょう。データフロー定義の可視化結果が画像として生成されているので、それを開きます。今回の例ではout.pngです。長方形がデータフロー変数、楕円が演算子、三角形がVerilogの生信号、台形がデータフロー変数を定義するVerilogの生信号の組をそれぞれ表しています。rxでデータフロー変数が定義されており、それとcを掛け合わせたものが_df_data_0となっています。ryで定義されるデータフロー変数の1ステージ分遅れた値が足し合わされ、_df_data_2、_df_data_3と伝搬していき、出力zに接続されています。途中、データフロー変数が自動で追加されるのは、入力された世代(段数)が同じ値ごとに演算を適用するためです。入力からの段数が違うもの同士を演算する場合、段数が少ない方に調整用のデータフロー変数が自動で追加されます。Verilogでの設計の場合には、時刻・段数が違う場合には設計者が明示的にレジスタを挟む必要がありますが、Veriloggenのデータフローライブラリの場合には、自動的に調整を行ってくれます。シミュレーション先ほどのスクリプト実行で表示されたシミュレーション結果は以下の通りのはずです。今回の例ではc=8なので、xの10倍の値がzから出力されていればOKです。100テキストではわかりにくいので、波形で確認しましょう。GTKwaveをインストールした上で、上記スクリプトの最終行"#sim.view_waveform()"のコメントアウトを削除して、再実行すればよいGTKwaveで波形が表示されます。以下の様に直接GTKwaveを起動しても良いです。yの入力に応じて、zの値が変化していることが確認できます。上記のシミュレーションパターンでは、出力zのready信号rzを意図的にぱたぱた変化させ、連続的にデータを受信できないようなケースを検証しています。rzの変化に応じて、パイプライン全体が制御されているのがわかります。まとめVeriloggenのデータフローライブラリを使うと、お手軽に高性能なデータフローパイプライン回路がPythonだけで開発できます。データフロー定義の可視化もできます。FPGAなどのハードウェアアクセレータで高い性能・電力効率を達成するには、高い稼働率を持つ演算パイプラインを構築することが非常に重要です。そのような場合にも、Veriloggenを使えば、既存のHDLよりも少ない労力で、既存の高位合成よりも高い性能のハードウェアを設計することができます。Tumblr広告を非表示にするもっと読むコメントを書く2015-11-12Pythonベースの高位合成コンパイラPolyphonyを試してみたpythonはじめに高位合成友の会の第3回が12/8に開催されるらしいです。(僕はPythonでのハードウェアメタプログラミングの話をします。)hls.connpass.comプログラムによると、PolyphonyというPythonベースの高位合成コンパイラの発表があるらしいです。Pythonで高位合成コンパイラを作っている自分としては、これは試さずにいられない!ということで、早速試してみました。ダウンロード公式Webからダウンロードしましょう。将来的にはオープンソースになるようですが、現在(11月12日)はzip化された実行形式のみが利用可能です。http://www.sinby.com/PolyPhony/we-need-your-feedback.html実行権限が必要なので、chmodしましょう。polyphonyコンパイル対象のPythonのソースコードを準備する今回は、PyCoRAMのtestsにある、フィボナッチ数列を求める回路の記述を利用しました。以下のように、最低限のコードにしましょう。ここでは名前は"test.py"としましょう。r1コンパイル先ほどダウンロードしたpolyphonyを実行しましょう。"-o"オプションで出力ファイル名のprefixが指定出来るようです。HDLコードをチェックする"fib.v"という名前で、以下のようなコードが出力されているはずです。ステートマシンをベースとした回路が生成されています。"VALID"で動作を制御するようですね。自分以外にもPythonで高位合成に取り組んでいる方がいるのも嬉しいです。PyCoRAMの高位合成エンジンも単体で切り出して、普通の高位合成コンパイラとして利用できるようにしようかなぁ、と思いました。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。