バーストライト
PCI Expressコアで、バーストリードができるように改良してみました。
ここでいうバーストライトというのは、PCI Expressのターゲット・ボード(FPGA)から、パソコン上のメモリへデータを一度に転送するモードです。このモードは画像のキャプチャなど大量のデータを取り込むときに使う、もっとも高速性が要求される重要なモードです。
実験に使用しているパソコンは、インテルのICH9というチップセットが乗っています。このボードの現在のBIOSの設定では、PCI Expressで一度に転送できるデータサイズ(Max Payload Size)は128に設定されているようです。このため、大きなデータを転送しようと思ったら128バイトごとに区切って送らなければなりません。
その区切りがあるため、上の図のように間欠的に転送が起きています。
なお、この約束を守らずに128バイトを超えるサイズのデータを送ろうとしても無視されてしまうようです。
上の図では、128バイトのデータ転送に928nsかかっています。
つまり、実効転送レートは137MBytes/sec程度しか出ておりません。これではPCI Expressの帯域の55%しか活かしきれていないことになり、バーストリードよりも遅いという結果になってしまいました。
その原因は、マザーボード側が返してくるAckを受け取るまでは、FPGAが次のデータを送らないように待ってしまっているためです。
そこでACKを無視してフライング気味に動かすようにしてみました。
最初の3回はACKを見ますが、その後はACKを見ないようにしてみました。
こうすると、128バイトを608nsで送れるので、最大速度が211MBytes/secと理論どおりになります。
おそらくパソコンのマザーボードは、メモリにデータを書き込むためには、キャッシュの制御やSDRAMのバンク切り替えなど、いろいろとやらねばならないことが多いのでしょう。そのため最初の1回目は時間がかかるのだと思われます。
そういうわけですので、PCI Expressの最大速度でパソコンに対してデータを送るならば、ACKの制御やフローコントロール、送信バッファは必須といえるでしょう。
逆に毎秒130MBytes程度でよいならば送信バッファもACK・フローコントロールなしでも大丈夫そうです。
このIPコアはDMAの実装まで完了しましたが、この時点でSpartan3 1000の20%のSLICEを消費しました。論理合成時間はいまだに2分以下で済んでいます。
そろそろ上位層へのインタフェースを書き直したりして、来週中のリリースを目指します。
| 固定リンク
コメント