前回まではFX3側の対応を中心に紹介してきましたが、今回からホストとなるPC側の改善ポイントについて、説明していきます。ホスト側まで来るとUSB3.0の対応になります。
前回説明したFX3での対応を終えたあと、ホスト側での受信の速度検証を行ってみました。
実験対象は下記の2つです。
1.SVI-06用ユーザーモードドライバ + SVI-06用API
2.サイプレスドライバ(カーネルモード) + サイプレス提供API
1の方でデバイスからホストへのデータ転送の速度を求めてみたのが下記の画面の枠内の数字です。
デバイス側で高速化対応したにもかかわらず全然速度がでていません。
転送レートは262.172MB/sとなっています。
うーんなぜだろう???
一方、前々回の記事でも紹介した2の構成であるStreamerというサイプレスが提供しているサンプルアプリケーションで測定した結果を再度掲載します。
その結果には1の構成では全然届きません。
サイプレスはやはり高度なチューニングをしているのか。恐るべしサイプレスドライバー!!!
と恐れをなしていても速度は変わらないので、見られるところから詳細に見ていきましょう。
まずは、1、2の構成時のPC側で取得したそれぞれのUSBパケットキャプチャをご覧ください。
(今回使用しているUSB3.0パケットキャプチャーは、Adviser T3です。)
赤丸のところを見ていただきたいのですが、パケットサイズが同じなのに、取得に要した時間が違っています。
サイプレスドライバ(2の構成)のほうは、43μSなのに対して、弊社のほう(1の構成)は72μSと取得に1.4倍の時間がかかっていることがわかります。
この違いはなんだろうか?でも、遅い原因はこの違いにありそうだ。
そこでもう少し深堀してみましょう。
パケットキャプチャツールでバスのスループットを表示することができるので、それを見てみます。
赤丸で示したところを見ていただけるとわかるのですが、データ受信していない間隙が存在することがわかります。
一方サイプレスドライバはそのような間隙がほとんど存在していません。
つまり、間隙の発生により1の構成ではその分データ取得に時間がかかっているということがわかりました。
つまりこの間隙がなくなれば早くなるということになりますね。
この間隙に対処するためには、次にこの間隙がどこから来るのか調べましょう。
まず手始めに上位のモジュールであるSVI-06用APIのソースコードを見ていきました。
その結果、USBバスからのデータ取得に際してSVI-06用のAPIが、ドライバーから少しずつしかデータを取得できていないことが原因と判明しました。
具体的には、SVI-06用デバイスドライバから1回に取得できる最大のサイズ(MaxPacketSize)をSVI-06用のAPIの中で取得するのですが、このサイズがサイプレスドライバに比べると少ないことが原因でした。
SVI-06用のAPIはデバイスドライバから1回に取得できる最大のデータサイズをMaxPacketSizeの値により決定しているため、大きい値が設定されていれば1回のデータ取得動作で済むところを、この値が小さいために何回も繰り返して行う必要がありました。
そのため、取得の繰り返し動作の待機期間などに間隙が開いてしまったのではないかと推測できました。
そこで、このMaxPacketSizeを大きな値にするために、SVI-06の32bit版として使用していたカーネルモードドライバを使用することにしました。(すでにあるものを使用しています。ユーザーモードドライバを修正してもよいと思います。)
この構成のときのパケットキャプチャの結果は左図のようになりました。
データ取得時間がサイプレスドライバとほぼ同等の時間(44μs)になるとともに、データスループット表示画面では、間隙がほとんどなくなっていることがわかります。
これは、先ほど原因として挙げてたSVI-06用のAPI内でのデータ取得の繰り返し回数が減少したことによるものと思われます。
つまりこの対処によりデータ取得速度がサイプレスドライバ並に向上しました。
また、結果として第1回で説明した通りコンソールアプリまでの転送レートは平均340MB/sになりました。
<検証PCスペック>
PC:Mouse desktop MDV-GZ7000B
OS:Windows7 64bit
チップセット:インテル Z87 Express
CPU:Corei7 3.4GHz 4770
メモリー:32.00GB
ドライブ(SSD):サムスン840 PRO Series MZ-7PD256B/IT
なお、本事例の場合には、掲載した対処法でうまくいきました。
しかし、ホスト側(PC側)の対処には、ドライバーやAPI、アプリケーションといろいろな要因が絡み合っていますのでパケットキャプチャやドライバーの使用方法などを総合的に検討して速度向上を図る必要があると思います。
ここまでは、PC側でUSB3.0のデータを高速に受信するための原因調査から対処までの一例をご紹介しました。
この高速に受信したデータをPCに保存するためにはどうすればいいのか。
それも可能です!
次回以降その方法はご紹介します。