【短期集中連載】大原雄介の最新インターフェイス動向
|
【写真1】ちなみにPIOであれば、そもそもPIOによるオーバーヘッドが無茶苦茶大きいので、これによるオーバーヘッドなんて考える必要がない |
写真1は、現在のPCI Expressにおけるデバイスからの読み出しの一般的な処理フローである。これはデバイスからホストにデータを送るケースであるが、
(1) デバイスからルートコンプレックスにデータをDMA転送する
(2) DMA領域をCPUがキャッシングしていた場合に備え、スヌーピングが発生してCPUの当該エリアのキャッシュ破棄が行なわれる
(3) ルートコンプレックスからメモリにデータが書き込まれる。
(4) 必要ならデバイスから割り込みがルートコンプレックスに送られ、ルートコンプレックスがCPUにデバイス割り込みを通知する
(5) ソフトウェアがDMA転送された結果をメモリに読みに行く
(6) デバイスに対して転送完了が通知される
といったシーケンスを経る事になる。1回のデータ転送量が多い(HDDアクセスなどこの良い例であるが、ほかにもEthernetでJumbo Packetを使ってる場合もこれに相当するだろう)場合には、このシーケンスのオーバーヘッドはそれほど大した事は無い。ところが、1回のデータ転送量がそれほど多くない場合は、このオーバーヘッドが無視できないものになる。
【写真2】もっともこの図で、(2)で直接CPUに書き込みが出来るのは今のところごく一部の製品だけだし、ルートコンプレックスのキャッシュから直接コピーできるものもかなり限られるような気がする。x86系では外部から直接キャッシュ操作(キャッシュ破棄は簡単に出来るが)を許すアーキテクチャになってなかったと思うのだが…… |
そこで、このオーバーヘッドを削減するのがTPHとなる(写真2)。具体的には
(1) デバイスからルートコンプレックスにヒント情報とステアリングタグ付きでデータをDMA転送する。ただし転送先はメモリではなく、ルートコンプレックス内のローカルキャッシュとなる。ここから、直接CPUのキャッシュに転送が行なわれる
(2) メモリは更新されていないので、スヌープは原則として発生しない
(3) 必要ならデバイスから割り込みがルートコンプレックスに送られ、ルートコンプレックスがCPUにデバイス割り込みを通知する
(4) ソフトウェアがDMA転送された結果をキャッシュに読みに行く
(5) デバイスに対して転送完了が通知される
といった動きとなる。要するにDMAでデバイスから直接CPUにデータを送り込む事で、メモリアクセスを省き、レイテンシの削減とスループット向上を両立しようというものだ。
この技法は、一般にはキャッシュスタッシングと呼ばれている。実際FreescaleのPowerPCの一部、最近だとe500とかe500MCが、L2キャッシュのスタッシングを可能にしており、このために専用レジスタまで用意されている。ただ当然ながら、これはアプリケーション(というか、PCI Expressの場合であればデバイスドライバ)がキャッシュのある領域をがっちりロックしておく必要があり、CPU側にもこうしたメカニズムが必要になってくる。
TPHは当然読み込みの場合も役に立つ。写真3はやはり一般的な、PCI Expressデバイスへの書き込みである。順序としては
(1) DMA転送すべきデータをキャッシュ経由でメモリに書き込む
(2) 必要ならルートコンプレックス経由でデバイスに対してコマンド発行
(3) デバイスはルートコンプレックスに対してDMA要求
(4) (3)のDMA要求がメモリに書き込まれる場合、そこでスヌープが発生
(5) メモリからデバイスにDMA転送
(6) デバイスからルートコンプレックスに転送完了を通知
といった具合だ。で、これがTPHを使った場合は、写真4の様に
(1) 転送すべきデータをキャッシュに書き込むと、必要に応じてそれがルートコンプレックスのキャッシュに転送される
(2) 必要ならルートコンプレックス経由でデバイスに対してコマンド発行
(3) デバイスはルートコンプレックスに対してDMA要求を掛け、キャッシュから直接転送される
(4) メモリは更新されていないので、スヌープは原則として発生しない
(5) デバイスからルートコンプレックスに転送完了を通知
となる。こちらもメモリを使わない分、オーバーヘッドが減る。
これらは理屈は簡単だが、実装するとなると色々問題は多い。最大のものはキャッシュスタッシングのメカニズムで、CPU側にこれを実装していない場合は外部にメインメモリより高速にアクセスできるエリアを設け、これを使う形になるだろう。それが写真2/4に出てくるルートコンプレックス内のキャッシュということになる。
ただこうした実装の場合、CPUからルートコンプレックス内のキャッシュはメモリとして扱われるから、スヌープが発生することになってしまい、本当に高速になるかちょっと微妙な感じではある。また、複数のI/O要求がある場合とか、デバイスが複数ある場合の管理、複数種類のI/Oが混在する場合などの使い分けも難しい。このあたりはPCI-SIGでも「検討課題」としており、詳細はもうちょっと待たないと出てこなそうだ(写真5)。
TPHが性能に与える影響のシミュレーション結果は写真6である。左がアクセラレータカード、右はネットワークカードの場合の結果である。右を見ると、特定の処理では大幅なオーバーヘッド削減に繋がるようだが、左を見るとその削減度合いは当然システムキャッシュ(この場合はルートコンプレックス内のキャッシュなのだろう)の容量で決まるようだ。このあたり、実装がどうなるのかちょっと興味ある部分だ。
□大原雄介の最新インターフェイス動向
【3月10日】PCI Express 3.0編その1
http://pc.watch.impress.co.jp/docs/2009/0310/interface01.htm
【3月12日】PCI Express 3.0編その2
http://pc.watch.impress.co.jp/docs/2009/0312/interface02.htm
(2009年3月16日)
[Reported by 大原雄介]