Spartan-6LXTと特電PCIeコアでDMA
Spartan-6LXTの内蔵PCI Expressコアを、特電PCIeコアでラッパすることによって、割り込みとDMA転送までできるようになりました。
ちょこっとDMAの速度を測りたかっただけなのに、DMAを実現するには割り込みをやらなければならなくて、その前にBAR0空間の各種レジスタをしっかり作りこんだり、コンプリーションを受け取れるようにしたりしていたら、いつのまにか完全な形で移植していました。
やっぱり全部作らないと、ちょこっとした実験もできませんでした。
そして、気になるその速度は・・・
波形で測定したところでは、Writeは336ns間に64バイト送れていたので約190MBytes/secでした。
Readは608ns間に128バイト受け取れていたので、約210MBytes/secでした。
しかし、これはデバイスとパソコン間の理想的な伝送速度です。実際には割り込み(DMAの完了を知らせる)のオーバーヘッドに加え、デバイスドライバの中でのデータのコピーなど様々な要因で遅くなります。
アプリケーションのレベル(DLLの呼出)で測ったところでは、Read(IN方向)が141MBytes/sec、Write(OUT方向)が160MBytes/secでした。
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のデータが消えないので開発には便利です。
このAtomのマシンではRead・Writeともに130MBytes/secくらいが限度でした。ただ、PCI Expressの波形的にはWrite 190MBytesとRead 210MBytesが出ているので、ドライバのオーバーヘッドが原因なのでしょう。
| 固定リンク
コメント