« ノートPC「Eee PC S101」を自力で修理 | トップページ | 当社製品の無料モニター様大募集 »

2010.11.03

Spartan-6LXTと特電PCIeコアでDMA

Spartan-6LXTの内蔵PCI Expressコアを、特電PCIeコアでラッパすることによって、割り込みとDMA転送までできるようになりました。

ちょこっとDMAの速度を測りたかっただけなのに、DMAを実現するには割り込みをやらなければならなくて、その前にBAR0空間の各種レジスタをしっかり作りこんだり、コンプリーションを受け取れるようにしたりしていたら、いつのまにか完全な形で移植していました。

やっぱり全部作らないと、ちょこっとした実験もできませんでした。

そして、気になるその速度は・・・
波形で測定したところでは、Writeは336ns間に64バイト送れていたので約190MBytes/secでした。
Dmawr1
Dmawr2

Readは608ns間に128バイト受け取れていたので、約210MBytes/secでした。
Dmard1
Dmard2

しかし、これはデバイスとパソコン間の理想的な伝送速度です。実際には割り込み(DMAの完了を知らせる)のオーバーヘッドに加え、デバイスドライバの中でのデータのコピーなど様々な要因で遅くなります。

アプリケーションのレベル(DLLの呼出)で測ったところでは、Read(IN方向)が141MBytes/sec、Write(OUT方向)が160MBytes/secでした。
Dmardwr

USB2.0の4~5倍は速い。まずまずの成績といえるでしょう。

Readは210MBytes、Writeは190MBytes出ていたので、Spartan-6の内蔵EndPoint BlockはPCI Express x1の性能を最大限に生かせるということがわかりました。つまり、あとはドライバとOSの問題です。

これを理想的な速度に近付けていくには、真のスキャッタギャザーDMAをサポートしなければなりません。今はCommonBufferという方式でDMAをしています。CommonBufferだとデータのコピーが発生するので、速度低下の原因になります。ユーザがmallocしたバッファの論理アドレスめがけて直接DMAをできるようにしないといけませんね。
また、Windowsの1ページ分(4096バイト)の転送を行うたびに割り込みをかけているので、それが速度低下の大きな原因です。だから、FPGAの中にあらかじめ転送先アドレスと長さのテーブルを送っておくようにしないといけないのでしょう。
そういう改良は後のお楽しみとして取っておくことにして、近々このデザインをリリースしようと思います。

このデモは、特電Spartan-6ボードだけではなく、XILINXのSP605などでも動くようにしようかなと思っています。また、ET2010では某社のブースの中で展示します。
お楽しみに。

◆P.S.
主な実験環境はこのマシンです。Mini-ITXのAtomマシンです。Mini-ITXのケースにボードがささらないので、マザーボード剥き出しで実験しています。

マザーボードに延長ケーブルボードをさしてPCI Express External Cableを引き出して、EXPARTAN-6Tに接続しています。こうすると、パソコンとPCI Expressボードが別電源になって、パソコンの電源をOFFにしてもFPGAのデータが消えないので開発には便利です。
Pcieext

このAtomのマシンではRead・Writeともに130MBytes/secくらいが限度でした。ただ、PCI Expressの波形的にはWrite 190MBytesとRead 210MBytesが出ているので、ドライバのオーバーヘッドが原因なのでしょう。

|

« ノートPC「Eee PC S101」を自力で修理 | トップページ | 当社製品の無料モニター様大募集 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« ノートPC「Eee PC S101」を自力で修理 | トップページ | 当社製品の無料モニター様大募集 »