« PCIのコンフィグ空間を読み書きするWDM | トップページ | WDM版汎用PCI Exiressデバイスドライバをリリースしました »

2009.03.19

データ転送速度190MBytes/sec達成!!

WDM版汎用PCIドライバの開発もいよいよ大詰めです。
今日はメモリリード・ライトの機能を実装しました。

アドインカード上のメモリへCPUから読み書きを行うには、準備段階でMmMapIoSpace()という関数が使われますが、この関数はNT形式のドライバとWDMで仕様が変更されているようでした。

NTドライバでは、マッピング先をキャッシュするかしないかの指定しかできなかったのですが、WDMではMmCached、MmNonCached、MmWriteCombinedに選択肢が増えています。

MmWriteCombinedというオプションを見たとき、川井さんがDWM1月号で書かれていた話はこれか、と思いました。コンバインド書き込みを実行するには、デバイスドライバでそういうオプションを指定するわけですね。

MmMapIoSpace()の第三引数をMmWriteCombinedにすると、複数の書き込み動作が1個に結合されて発行されているようすがJTAGロジアナで確認できました。

実験したところでは、64バイト以上のまとまった書き込みを1個に結合するようです。

・64バイト書き込み → 64バイト書き込み×1回
・16バイト書き込み → 8バイト書き込み×2回
・48バイト書き込み → 8バイト書き込み×6回
・68バイト書き込み → 4バイト書き込み×1回 + 64バイト書き込み×1回
・72バイト書き込み → 64バイト書き込み×1回 + 8バイト書き込み×1回
という感じでした。

たしかに書き込みの順序は保障されていません。
しかも、開始アドレスが64の倍数に揃っていないと効率よく発行されなかったりします。
BAR0の先頭から68バイト連続で書き込んだら、アドレス+64からの4バイトが先に書き込まれました。
なんだか、メモリ上の、アドレスが64バイトにアラインメントされた領域に高速に転送するような感じでした。

PentiumはSSE2命令を使えば128bit(=16バイト)の書き込みバスサイクルを発行できるはずなのですが、これまでいろんなパソコンで試したところでは、PCI Expressのバスに出るときに8バイト×2回のサイクルに分割されてしまっていました。コンバインド書き込みを使えば大きなサイズで書き込みパケットを作れるようで、パフォーマンスが大幅に改善します。

次の図は、4096バイトの連続書き込みを実行したときの、FPGA内部の波形です。
Wrcomb

336nsごとに64バイトのデータが乗ったTLPを受信していて、この波形がずーっと続きます。したがって、64/0.336us=190MBytes/secという速度になります。

コンバインド書き込みを使うことで、PC→アドインカードの転送方法が約130MBytesから190MBytesに向上しました。

このデバイスドライバは、汎用PCI Expressドライバとして、明日、リリースする予定です。

|

« PCIのコンフィグ空間を読み書きするWDM | トップページ | WDM版汎用PCI Exiressデバイスドライバをリリースしました »

コメント

コメントを書く



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




« PCIのコンフィグ空間を読み書きするWDM | トップページ | WDM版汎用PCI Exiressデバイスドライバをリリースしました »