32bitを超えるメモリアクセス
今夜は、特電PCI Expressコアに、32bitを超えるメモリアクセスの機能を実装しています。
これができると、バーストリード・ライトができるようになり、パフォーマンスが大きく向上するはずです。
PCIデバッグライブラリ2.0.0には
_MemReadBlock128
と
_MemWriteBlock128
という関数があります。これを使えばSSE2命令を発行して、128bit単位での効率の良いリード・ライト・トランザクションを発行してくれるはずです。
しかし、実際にやってみると、64bit単位でしか発行されていませんでした。原因はよくわかりませんが、チップセットが、128bitのメモリアクセスを64bit 2回のアクセスに分割してしまっているのでしょうか。
メモリライト(PC→アドインカード)時の波形は次のようになりました。
この波形を観察すると、1個のTLPに32bitのデータが2個乗っているのがわかります。そして、それが約120~150nsの周期で送られてきます。128bitのデータが64bitのデータ2個に分けられますが、その間には論理IDLEが挟まれず、前のENDシンボルの直後に次のSTPシンボルが来ています。やはり、チップセットによって分割されているのだと思います。
128バイトのデータを送信するのに1.94μ秒要しているので、スループットは65MBytes/secです。
次はメモリリード(PC←アドインカード)です。
とても悲惨な波形になりました。
トランザクションはだいたい1μ秒に1回しか発行されていません。その1回1回が64bitの転送なので、平均すると8MBytes/sec程度のスループットしか出ないということになります。これがPIOモードの実力なのでしょう。
これはIPコアが悪いのではなく、チップセットが原因なのでしょう。
IPコアはメモリリードに対して即答していますから。
1個のメモリリードは、
①ルートコンプレックスがトランザクション発行
②エンドポイントがAckを返す
③エンドポイントがCompletion(読み出しデータ)を返す
④ルートコンプレックスがAckを返す
という4つのパケットで行われます。
③と④の間は216ns程度かかっています。つまり、PCI Expressの遅延が片道100nsほどあることになります。1つのシンボルが4nsですから、25シンボルほどの遅延時間がかかっていることになります。PCI Expressはマザーボードに直接挿しているようでも、途中でブリッジやスイッチが入るので、そのFIFO分の遅延時間を考えると妥当な時間です。
そして、もっとも遅いのは④の後の次の①までが470nsくらいですが、これはルートコンプレックス(チップセット)の中での待ち時間です。なぜこんなに時間がかかっているのかわかりません。
何はともあれ、任意の長さのリード・ライト機能が実装できました。
ライトはそこそこの速度が出ますが、リードについては改善の余地がありそうです。
| 固定リンク
コメント