Yocto(opkg)のpythonでmmapを使う方法 (DE0-nano-SoC)

DE0-nano-SoCはFPGAとARMの組み合わせのチップが載っているSoC FPGAの評価ボードであり、現在研究でこれを使っている。
その中でPython中でmmapを使いたいことがあり、嵌ったのでメモ

普通のPythonではmmapは普通に出来るらしい。
しかしながらDE0-nano-SoC上のPythonで走らせたところimport mmapの時点でNo such moduleと言われてしまった。
調べるのに時間がかかったが、どうやらライブラリが足らないんじゃないかということに落ち着き、aptで入れようとしたがyoctoだったので代わりにopkgで試した。が、しかし、ライブラリが無く、焦った。

パッケージ一覧を眺めたところpython-mmapというパッケージを発見、
無事インストールし、解決した。

opkg install python-mmap

FPGAの速度

FPGAは、普通のハードロジックと比べて10~100倍程度遅いとされているが、最近どんどん速くなってきているようだ。

自分はまだこの業界に片足を突っ込んで日は浅いが、alteraがintelに買収された真っ只中を見ている。

intelに買収されたことによる一番のメリットはおそらくFPGAのプロセスルールが急激に進歩すると考えられることだ。

プロセスルールの微細化といえばintelが主導してやってきていて7nmなどが出ると言われているが、FPGAのプロセスルールは何十というオーダーだったのが一気に十何nmというオーダーになるのだ。

Altera側もXilinxに大きな差をつけられるので経営的に良かったのだろうし、intelもアクセラレータ候補を手に入れたことになる。

もしかしたらFPGAがコンシューマPCの中で計算に使われる時代が近いのかもしれない。

DE0-nano-SoCのf2hポートでAvalon-MMのreadができない

Avalon-MMでreadをしようとして嵌っている。。

DE0-nano-SoCボードというARMコアにFPGAが付いたものを使っているのだが、そこにはFPGAからSDRAMにアクセス可能なバスがありこれをFPGA2HPSという。

このバスはAXIインターフェイスなのだが、Qsysで合成する時にAvalon-MMとAXIの変換器を自動で入れてくれるのでごちゃまぜにして利用することが可能なのだ。

Avalon-MMインターフェイスは信号線の選択によって色々なインターフェイスを作ることが可能なのだが、自分は基本的にwaitrequestという信号がアサートされたら待つというだけでそれ以外はシンプルなメモリインターフェイスのように使っている。
しかしこれがいけないのだろうか。readをしようとしてもいつまで経ってもwaitrequestがアサートされたままで前に進むことが出来ない。

byteenableやreaddatavalidなどを有効にして試していきたいが、何しろコンパイル時間がかかりすぎてそのやる気が出ない。
困ったものだ。

 

追記5/13

結局、h2fからAddress Span Expanderを介してf2hに向かう信号をロジアナで解析することでこの問題は解決した。

使った信号線はaddress, read, readdatavalid, readdata, write, writedata, burstcount, waitrequest, byteenableだ。

このうちbyteenableは全ビット1固定、burstcountは1で固定しておけば良い。
実際的に追加したのはreaddatavalidだけで、pipelinedな形式でないと読めないのだと考えられる。

追記5/16

恐らくこれは非同期なメモリインターフェイスと同期なメモリインターフェイスを自動変換してくれないということなのだろう。

FPGA SoC (FPGAとARMコア Altera-SoC/Zynq)

今の研究はFPGAとARMがひとつになったXilinx社でいえばZYNQ、Altera社でいえばAltera-SoCというものを触っているのだが、この可能性について書きたい。

ARMは近年いろいろなところで利用されるようになった。CPUの出荷台数で言えばARMはintelの数倍になっている。

本題のARMとFPGAの組み合わせだが、使っているということはアリだと思っているわけである。というのも、ARMが使われている分野は(電池駆動の)組込系が多く消費電力にシビアな世界が多い。だから高性能なCPUは使えない。じゃあGPUはどうかというと更に消費電力が高く組み込み系には使いづらいだろう。

ARMコア単体でも組み込み系で特に電力に関してシビアなものに搭載されているというイメージがある。一方FPGAは今まで単体でカメラなどに採用されてきたが汎用性の問題で置き去りにされてきたイメージだ。この汎用性の問題が解決すれば十分に使い物になると思う。特にCNNを利用した画像処理は大量の計算リソースが必要でFPGAに適しているだろう。

ARMからFPGAがコンフィギュア可能という特徴があるのでアプリケーションごとにFPGAを再構成させることが可能になる。また、全体の再構成だけではなく、部分的再構成させることも可能になるだろう。(今も苦労すれば出来るのかもしれないが)

個人的にはFPGAという細粒度な再構成可能アクセラレータよりCGRAのような粗粒度な再構成可能アクセラレータに分があると考えている。

FPGAは、本当に汎用的に使いたい分野にこそ向かないものの、同じプログラムを頻繁に利用するような組み込みの世界ではスループットを爆発的に改善する大きな一歩になるだろう。

Avalonインターフェイス

Avalonインターフェイスが良くわからず最近調べていたが単純に言えば

  • Alteraが作った
  • Qsysでつかう
  • AXIと互換性がある
  • AXI-LiteとAXIがAvalon-MMと対応
  • AXI-StreamingがAvalon-STと対応

ということのようだ。

AXIより単純そうなので多用していきたいが、もっと標準化してもらえないと困るというのが本音。

Avalon-MMはシンプルなメモリインターフェイスでwaitrequestがアサートされたら待ってるだけなので楽。

Avalon-STに関してはまだ勉強中だが、mSGDMAを使うと良さそう。

Avalonインターフェイスの日本語資料はここにある。
https://www.altera.co.jp/documentation/nik1412467993397.html