残暑お見舞い申し上げます.
さて,時節柄,自由研究よろしく,e7SATAボードによるSSDとHDDの読み出し性能をはかってみましたので,ご紹介いたします.
ちなみに,このボード+自社コアでMicron RealSSD C400から16MBのデータを読み込むときの速度は270MBps+αでした.
測定環境
今回は,e7SATAボードとZedboardを使ってはかってみました.
e7 SATAボードは,”FPGAで手軽にSATAなディスクにアクセスできるようにする”を目標に,SATAポートとFMCコネクタだけを搭載したシンプルなFPGAボードです.アプリケーションを実装するメインボードと独立したボードにすることで,アプリケーションロジックの開発時にSATAに関するタイミング制約やリソース割当を考慮する必要がないというメリットがあります.アプリケーションロジックとe7 SATAボードはLVDS上のUPLでデータをやりとりします.
今回は,測定用のロジックを全部FMC子ボードであるe7SATAボード上のFPGAに実装し,SATAのFISパケットの生成や制御はZedboardボードのZynq上で走るLinuxから実行することにしました.Zynq,便利だなあ…
システムを構成するコンポーネントは↓のような感じ.XillinuxとXillybusを使ってZynq上のソフトウェアとUPLで接続されたロジックコンポーネントをつないでいます.
e7SATA IPコアについて
もうちょっとだけ前置きが続きますが,e7SATA IPコアについて少々.
e7SATA IPコアはSATAなディスクにアクセスするためのIPコアです.ディスクとの接続の初期化に必要なOOB制御や,データ転送時のデータのスクランブル/デスクランブル,CRC処理などを司ります.e7SATA IPコアを使えば,ユーザ(ロジック)はFISデータをUPLパケットとしてコアに送り込むだけでディスクにアクセスできます.
逆に言えば,コマンド層以上の,FISを使ったアプリケーション部分に関しては自分で作らなきゃいけないわけですが…
今回は,SATAコアに読み出しリクエストを発行するタイミングからリクエストに応じたデータが帰ってくるまでの時間を計測しました.つまり,(1)UPL0経由でコアにDMAリードリクエストを送り,(2)コアがそのコマンドをディスクに送り,(3)ディスクから送られてきたデータをコアが処理して,(4)最終的にUPL2経由で出力し終えるまで,のトータルの時間です.
結果
お待ちかねの(?),測定結果の発表です.測定に使ったディスクは
- Micron RealSSD C400 (SSD)
- Intel SSD 330 Series (SSD)
- Fujitsu MHZ2080BK G2 (HDD)
です.なお,結果は,あくまで一測定事例であることにご注意ください.
読み出しにかかった時間
結果の生データは↓の通りです.値はユーザクロックである75MHzでまわるカウンタのカウンタ値で,それぞれ10回の測定結果の最大最小をのぞいて平均したものです.ただし,HDDは,あるアドレスのデータを指定した1回目と2回目以降で大きな差があったため,1回目の測定結果と2回目以降10回の平均データを測定値としています.
Data (Bytes) | Micron | Intel | Fujitsu(1回目) | 2回目以降 |
16384 | 17847 | 89086 | 22631699 | 8991 |
32768 | 21162 | 96576 | 22406493 | 18937 |
65536 | 29708 | 100863 | 22166764 | 22291 |
131072 | 47279 | 117734 | 22267025 | 39351 |
262144 | 81721 | 152894 | 22361292 | 73668 |
524288 | 150623 | 220313 | 22714070 | 139418 |
1048576 | 288487 | 359220 | 24054287 | 1328815 |
2097152 | 564220 | 636032 | 24851922 | 2510372 |
4194304 | 1115403 | 1189188 | 27255657 | 5043538 |
HDDの読み取り時間が圧倒的に短くなるのはキャッシュの効きだと思われますが…効果覿面ですね.といいつつも連続で1MB(=2048セクタ)以上読むときには,がくっと性能が下がるという結果がみてとれたのですが…
スループットを計算してグラフにすると,↓のように.そこそこの性能がでている…でよさそうです.
もう少し細かく
せっかくなので,もう少し細かく見てみましょう.というわけで,Chipscopeで,どんな風にデータがでてきているのかみてみました.
まずは,データリクエストを仕掛けてからデータがでてくるまでの一連の様子をみてみたところです.Micronのディスクへのアクセスです.
最初のデータがでてくるまでに,とっても時間がかかった後,バースト的にデータがでてきます(コア内部で,そうしているから,なのですが.).
SATAのパけット単位であるFISのペイロードは最大2048DWORDS(8192KB)です.そのため8KBを超えるデータを要求した場合には,複数のFISに分けてデータが出力されています.その様子が↓の通り.
隙間なくデータが並んでやってきている様子が見えます.
HDDではどうか,というのを見てみたのが次のキャプチャ.(おそらく)キャッシュにのっていない場合,ぽこぽことデータがやってきます.
たしかに,これでは速度がでない気がします.
しかして,同じセクタに続けてアクセスしたときの様子が↓の通り.
これなら,速そうですね!!
さいごに
e7SATAボード(+ e7SATA IPコア)を使って,SSD/HDDからデータを読み出すのにかかる時間をはかってみました.ある程度まとまったサイズのデータであれば,250MBps程度のスループットで高速に読み出すことができそうだ,ということがわかりました.これで,大量のデータの読み込みが必要なFPGAアプリケーションも怖くない!?
ちなみに,実際の用途ではFMC越しでメインボードに転送して処理しなければなりません.FPGA内部のブロックRAMやe7SATAボード上のDRAMを使うなどして限られたボード間転送帯域を効率よく使うことが肝要ですね.
コメント