ではUSB 3.0でBi-Directionalがどう変わるか? というのがPhoto01である。UAS Driverは最初にリクエストを受けると、ITr(Stat)、ITr(Data-in)、OTr(Data-out)、OTr(CUI)の4つのコマンドをまとめて発行する。

Photo01: USB Attached SCSI Protocol(UASP) Revision 1.0のFigure 9から抜粋

この後は? というと、これを受けたxHCI Controllerは順次(必ずしもUAS Driverから受け取った順ではない)、DP(Data-out)、IN ACK(Data-in)、IN ACK(Stat)、DP(CIU)をそれぞれDevice側に送り出す。この例の場合、まずDP(CIU)に対するレスポンスが最初にDevice側で実行され、その結果がACK(Cmd)として返される。これは直ちにOTc(Cmd)としてUAS Driverに戻される。

次いでIN ACK(Data-in)とDP(Data-out)に対する準備がDevice側で整うと、DeviceはそれぞれERDY(Data-in)とERDY(Data-out)をxHCI Controllerに返す。これを受けてxHCI ControllerはDP(Data-out)とIN ACK(Data-in)を送り出し、データの書き出しと受け取りを同時に開始することになる。

ここで重要なのは、(あくまでもDevice側が対応していれば、という条件付ではあるが)Data-outとData-inという2つのトランザクションを、実際問題として並行して実施できることだ。図1はUSB 2.0の場合のBi-directionalで実際に転送が開始された場合のシーケンスを模式化したものだ。とりあえずData-inとData-outを2回づつ行うまで、を示している。OUT/IN/ACKとDATAのパケット長は適当であるが、あくまでも模式図ということで理解してほしい。USB 2.0の場合、2つのトランザクションが両方実行するといっても送受信が共通であり、あくまでも半二重である。なのでData-outのシーケンスが終わるまでの間は現実問題としてData-inのシーケンスは開始できない。勿論、図2の様に、若干パケットの送受信順序が変わることはありえるだろうが、トータルとしての所要時間には差がないことになる。

図1

図2

ところがUSB 3.0の場合、送信と受信で配線が別だから、図3の様に2つのトランザクションを完全に並行に行うことができる。Photo01を見るとData-outはnumP=4、Data-inはnumP=2とされているので、この図も厳密には正しくないが、単に紫色のData-inのDATAパケットの幅が(Data-outの)半分となり、数が倍になるだけなので、概ね同じと思ってよい。ACKのパケットサイズは実際には非常に小さいので、結局のところDATAのパケットサイズが実際の帯域を定める要因となる。で、USB 2.0ではData-inとData-outの2つのDATAパケットで60MB/secのバス帯域を分け合う形になるから、実質的な転送速度の限界は30MB/secに留まることになる。USB 3.0でもUASを使わない場合はData-inとData-outを多重化しないため、実際には500MB/secの帯域があるにも関わらず実質的な転送速度の限界は半分の250MB/secになる。ところがUASを使うと図3の様に完全に多重化できるため、実質的な転送速度が500MB/secフルに利用できる、という訳だ。

図3

話をPhoto01に戻すと、以後はデータの転送が終わるまでDP→ACK(Data-out)あるいはACK→DP→IN ACK(Data-in)のシーケンスが続けられることになる。Photo01の場合はまずData-inのTransactionが先に終了するので、これが終わるタイミングでITc(Data-in)がxHCI ControllerからUAS Driverに返される。次いでData-outが終わったタイミングで今度はOTc(Data-out)がxHCI ControllerからUAS Driverに返される。一方DeviceはData-in/Data-outが完了するとERDY(Stat)をxHCI Controllerに返すので、xHCI Controllerは改めてIN ACK(Stat)を発行、DeviceからDP(SIU)が戻ってくるのを待ち、この結果をUAS Driverに送り返す。UAS Driverはこの4つの結果が揃うのを待って、上位アプリケーションに制御を戻すという訳だ。

こうして見ると、UAS Driverの効果が一番高いのがこのBi-directionalのケースである事が判る。もっともこの効果を得るためには、Device側がData-inとData-outの両方のTransactionを同時に処理できなければいけないという制約事項も付くことになる。こうなると、単にUSB 3.0のI/Fを装備し、それに見合う帯域の内部バスで接続しましたというだけでは不十分で、ピークで1GB/sec(Read/Write共に500MB/secづつ)のトランザクションを処理できるような内部機構がないと、UAS Driverを使ってもその性能がフルには発揮できないことになる。こうなってくると、現状存在するSSDのI/Fチップでもどれだけがフルに対応しているのかちょっと疑問が残るところである。