SlideShare a Scribd company logo
AHCIを用いたPCとFPGA間の
汎用インターフェースの実装と評価
三好健文 船田悟史
(株)イーツリーズ・ジャパン
2015.06.20
RECONF研@京都
このスライドは,現在開発中のシステムに基づいてデータ計測/リソース使用量を評価しています.
今後の開発/デバッグの進捗で良くも悪くもなり得ます.データの利用には,ご注意ください.
2
モチベーション
✔ FPGAを使ったシステム(PC+FPGA)の実装の需要が増えている
✔ PCとFPGAに求める負荷はプロジェクトそれぞれ
✔ 既存のPCなシステムにFPGAを埋めこみたいというのは多い
✔ 手軽にFPGAとPCを接続したい
✔ PC(OS)のドライバは書きたくない
✔ LinuxやWindowsなどいろんなOSでFPGA
(で作ったアクセラレータ)を扱いたい
3
PC-FPGAインターフェースの候補
UART USB PCIe TCP/IP, UDP/IP
速度 ~数Mbps
~480Mbps(2.0)
~5Gbps(3.0)
~4GBps(Gen2x4)
~8GBps(Gen3x4)
~Gbps@GbE
~10Gbps@xGbE
プログラミング termios
Libusb
専用デバドラ
Mmap
専用デバドラ
socket
接続の容易さ 簡単 簡単 ちょっと面倒
簡単
(世界の裏側でも)
接続数
対向/
マルチドロップ
~127 ~数10個? たくさん
アクセスタイプ ストリーム
ストリーム/
メモリマップ
ストリーム/
メモリマップ
ストリーム
4
PC-FPGAインターフェースの候補
UART USB PCIe TCP/IP, UDP/IP
速度 ~数Mbps
~480Mbps(2.0)
~5Gbps(3.0)
~4GBps(Gen2x4)
~8GBps(Gen3x4)
~Gbps@GbE
~10Gbps@xGbE
プログラミング termios
Libusb
専用デバドラ
Mmap
専用デバドラ
socket
接続の容易さ 簡単 簡単 ちょっと面倒
簡単
(世界の裏側でも)
接続数
対向/
マルチドロップ
~127 ~数10個? たくさん
アクセスタイプ ストリーム
ストリーム/
メモリマップ
ストリーム/
メモリマップ
ストリーム
遅い
デバドラ書くの大変
FPGAで使うのは面倒
ランダムアクセスは...
5
PC-FPGAインターフェースの候補
UART USB PCIe TCP/IP, UDP/IP
速度 ~数Mbps
~480Mbps(2.0)
~5Gbps(3.0)
~4GBps(Gen2x4)
~8GBps(Gen3x4)
~Gbps@GbE
~10Gbps@xGbE
プログラミング termios
Libusb
専用デバドラ
Mmap
専用デバドラ
socket
接続の容易さ 簡単 簡単 ちょっと面倒
簡単
(世界の裏側でも)
接続数
対向/
マルチドロップ
~127 ~数10個? たくさん
アクセスタイプ ストリーム
ストリーム/
メモリマップ
ストリーム/
メモリマップ
ストリーム
デバドラ書くの大変
速い.FPGAで使いやすい ...デバドラさえ書ければ
6
PC-FPGAインターフェースの候補
UART USB PCIe TCP/IP, UDP/IP
速度 ~数Mbps
~480Mbps(2.0)
~5Gbps(3.0)
~4GBps(Gen2x4)
~8GBps(Gen3x4)
~Gbps@GbE
~10Gbps@xGbE
プログラミング termios
Libusb
専用デバドラ
Mmap
専用デバドラ
socket
接続の容易さ 簡単 簡単 ちょっと面倒
簡単
(世界の裏側でも)
接続数
対向/
マルチドロップ
~127 ~数10個? たくさん
アクセスタイプ ストリーム
ストリーム/
メモリマップ
ストリーム/
メモリマップ
ストリーム
デバドラ書くの大変
速い.FPGAで使いやすい
AHCIを実装して,
ディスクに見せてしまおう!!
7
AHCI
✔ Advanced Host Controller Interface
✔ SATAなHDDやSSDを接続するためのインターフェース
✔ 最近のOSのほとんどでサポートされている
= 標準のデバドラでブロックデバイスにみえる
✔ SATAなHDDやSSD以外に接続してはいけない,ことはない
8
一般的なAHCIによるディスク接続
ディスクに送るコマンドを預かる
ディスクからのリプライを返す
作業用メモリのポインタの確認
複数コマンドをOoOで発行(NCQ)
ディスクへのFISの発行
ディスクからのFISの受信
ステータス管理
9
AHCIのメモリチェイン
どのコマンドが
有効かはPxCI
レジスタをみる
ディスクに
送るべきコマンド
PCIeのBAR5に
レジスタ空間への
ポインタがある
ディスクとの
やり取りに使う
メモリ領域への
ポインタ
近代的なOSでは大量の仮想メモリを複数の細かい実メモリに分割して扱う
ディスクとの
やり取りに使う
メモリ領域
P0CLB
HBAからは
P0CLBの
値でたどる
10
AHCI越しのデータ授受のフロー
PCIe越しの通信
11
AHCI
✔ Advanced Host Controller Interface
✔ SATAなHDDやSSDを接続するためのインターフェース
✔ 最近のOSのほとんどでサポートされている
= 標準のデバドラでブロックデバイスにみえる
✔ スキャッタギャザーDMAとしてよくできてる
✔ PCIe越しの煩雑な通信オーバヘッドが心配
✔ どこまでディスクなしでOSをだませるものだろうか?
12
今回の取り組みの趣旨
✔ AHCIをPC-FPGA間汎用インターフェースとして使ってみる
→ HBA(ホストバスアダプタ)をFPGAに実装してみる
✔ FPGA内ロジックへのアクセスとAHCIの親和性
✔ 回路規模は?
✔ 転送性能は?
✔ 実装の複雑さは?
設計と実装
14
実装するシステムの概要
OSからのリクエストに
ディスクにアクセスしたフリをしつつ
AXI空間のデバイスにアクセスする
Gen2 x4
レジスタマップは
PCIe経由で
ホストから叩かれる
ディスクアクセスのためのLBAは
素直に(LBA*512)AXIアドレスに対応づける
15
実装するシステムの足回り
今回はXilinxのIPコアで組立て.
16
HBAでディスクの状態を補完
= ないディスクのふりをする
✔ HBAレジスタのディスク状態の”適当”な設定例
レジスタ 値 概要
CAP 40240000 NCQ有効.転送レートはGen2相当.AHCIのみサポート
GHC 80000000 AHCIを有効
PI 00000001 ポート0のみ有効
VS 00010000 サポートするAHCIバージョン(1.0)
CCC_CTL 00010100 タイムアウトとコマンドコンプリージョンリセット値
P0CMD 00110006 ディスクがコマンド待機状態に見えるように設定
P0TFD 00000058 RegD2Hが成功したように設定しておく
P2SSTS 00000123 ディスクが電源ONの状態に設定
P0SCTL 00000320 ディスクが正常動作中にみえるように設定
17
HBAの動作フロー
ここはディスクの代わりにHBA内で処理してしまう
少なくとも
 IDENTIFY
 FPDMA_READ/FPDMA_WRITE
は必須
メモリチェインをたどる(本来のHBAの処理)
18
HBAの動作フロー/FIS取得まで
private int wait_for_command(){
while(reg.values[P0CI] == 0) ;
reg.values[P0CMD] = 0x10110007; // 処理開始
int id = get_port_id(reg.values[P0CI]); // '1'のbitを選ぶ
axi.fetch(reg.values[P0CLB] + (id << 5), 4); // command headerを取得
dw0 = axi.read(0); // PRDTL, PMP, RCBRPWA, CFL
dw1 = axi.read(1); // PRD Byte Count
dw2 = axi.read(2); // CTBA0
dw3 = axi.read(3);
prdtl = (dw0 >> 16) & 0x0000FFFF;
ctba = dw2;
axi.fetch(ctba, 5);// CFIS取得
cfis_dw0 = axi.read(0); // Features,
// Command,…
cfis_dw1 = axi.read(1);
cfis_dw2 = axi.read(2);
cfis_dw3 = axi.read(3);
return (dw0 >> 16) & 0x000000FF;
}
P0CLB
19
FISに対する処理: FISとは
✔ SATAとコマンド/リプライをやりとりするパケット
✔ いくつかのフォーマットがある
✔ RegH2D: ホスト(PC)からデバイス(ディスク)へ
✔ RegD2H: デバイス(ディスク)からホストPCへ
✔ DMAリード/ライト
✔ FPDMAリード/ライト
✔ ...
20
FISの例
RegH2D
FPDMA_READ/WRITE
21
FISへの対応例: IDENTIFY
private void return_identify(){
// get PRDT entry
axi.fetch(ctba + 0x80, 4);
int dba = axi.read(0); // DBA
for(int i = 0; i < 128; i++){
axi.write(i, identify.data[i]);
}
axi.flush(dba, 128);
// reply fis
axi.write(0, 0x0058605f);
axi.write(1, 0xe0000000);
axi.write(2, 0x00000000);
axi.write(3, 0x500000ff);
axi.write(4, 0x00000200);
axi.flush(reg.values[P0FB] + 0x20, 5);
}
P0CLB
22
FISへの対応例: FPDMA_READ
private void do_fpdma_read(){
int ncq_tag = (cfis_dw3 >> 3) & 0x0000001F;
int lba = (cfis_dw1 & 0x00FFFFFF);
int lba_exp = (cfis_dw2 & 0x00FFFFFF);
int sectors = ((cfis_dw0>>24)&0x000000FF) +
(((cfic_dw2>>24)&0x000000FF)<<8);
int offset = lba * 512; // アクセスするAIX空間上のアドレス
for(int i = 0; i < prdtl; i++){
axi.fetch(ctba + 0x80 + (i<<4), 4);
// ホストメモリ上のアドレス
int prdtl_addr = axi.read(0);
int prdtl_len =
(axi.read(3)&0x003FFFFF)+1;
copy_storage2pcie_all(offset,
prdtl_addr,
prdtl_len);
offset = offset + prdtl_len;
}
}
P0CLB
動作例
24
動作例
PCIデバイス→AHCIデバイス→ディスクに見えている
XilinxのPCIe<->AXIブリッジは
BAR5が使えないのでBAR0で代用.
この対応パッチだけデバドラに適用
標準AHCIデバドラが
アタッチされていることがわかる
FPGA
25
動作例
PCIデバイス→AHCIデバイス→ディスクに見えている
うまくOSを
だませている
/dev/sdbらしい
ddとかできる
26
動作例
ディスクなのでfdiskでパーティションを作ることも可能
これはFPGA fdisk!!
FPGA上(AXI越しのメモリの上)に
パーティションができた
27
動作例
フォーマットしてファイル作成も可能
フォーマットして
ファイルを書くこともできる
評価
29
評価環境
✔ ホストPC
✔ Intel Core i3-4130 3.40GHz
✔ メモリDDR3 16GB
✔ OS Ubuntu 14.04.2 (Kernel 3.13.11-ctk17)
✔ FPGAボード/開発環境
✔ Xilinx K705
✔ Vivado 2014.4
✔ AXI内部バス32bit,512bit
30
実装するシステムの概要
Gen2 x4
内部バス32bitのシステム
31
リソース使用量
項目 使用数 使用率
システム全体 スライスLUT 37386 18%
スライスレジスタ 32733 8.0%
占有スライス 15045 30%
ブロックRAM 25 5.6%
HBA  スライスLUT 4241 2.0%
スライスレジスタ 8467 2.0%
占有スライス 2620 5.1%
ブロックRAM 2 0.5%
内部バス32bitのシステム
32
転送性能
内部バス32bitのシステム
33
実装するシステムの概要
このバス幅として,
512bitのバージョンを試す
Gen2 x4
内部バス512bitのシステム
制御用に32bit AXIバスを残す
34
リソース使用量
項目 使用数 使用率
システム全体 スライスLUT 46525 23%
スライスレジスタ 45109 11%
占有スライス 17825 35%
ブロックRAM 53 12%
HBA  スライスLUT 11499 5.6%
スライスレジスタ 8982 2.2%
占有スライス 5002 9.8%
ブロックRAM 30 6.7%
内部バス512bitのシステム
35
転送性能
内部バス512bitのシステム
36
比較
✔ Xilinx EDKのIPコアで作ったシステム on KC705
✔ ホストメモリは連続領域を確保
Host PC
Host PC
Main Memory
Software
FPGA Board
FPGA Board
DDR3 Memory
Main controller
PCIe Memory
Controller
DMA engine
Kick
Done
User Application
Logic
Host Memory → DDR3 Memory/FPGA Board
DDR3 Memory/FPGA Board → Host Memory
128bit 256bit
@100MHz
@800MHz
37
比較
Throughput (MBps)
Transfer unit (Bytes)
FPGA→Host: 1GBps
Host→FPGA: 850MBps
38
AHCI越しのデータ転送の様子
データ転送開始直後(4KB単位のブロック転送)
39
(1)
(2)
AHCI越しのデータ転送の様子
(2') (1) 4KB
CTRL ARVALID: 0
CTRL RVALID : 104(104)
SRC ARVALID : 180( 76)
DATA RVALID : 234( 54)
DATA RLAST : 314( 80)
COPY START : 338( 24)
COPY DONE : 405( 67)
DEST AWVALID: 426( 21)
DEST WVALID : 430( 4)
DEST WLAT : 688(258)
(2) 4KB
CTRL ARVALID: 476( 0)
CTRL RVALID : 1238(762)
SRC ARVALID : 1315( 76)
DATA RVALID : 1369( 54)
DATA RLAST : 1449( 80)
COPY SART : 1472( 24)
COPY DONE : 1539( 67)
DEST AWVALID: 1560( 21)
DEST WVALID : 1564( 4)
DEST WLAT : 1822(258)
40
AHCI越しのデータ転送
しばらくデータ転送が継続したあと(60KB単位の転送)
41
まとめ
✔ AHCIをPC-FPGA間汎用インターフェースとして使ってみる
→ HBA(ホストバスアダプタ)をFPGAに実装してみる
✔ FPGA内ロジックへのアクセスとAHCIの親和性
→AXI-MMと親和性は高い
✔ 回路規模は?→内部バスを512bitと奢ってもXC7K325Tの約35%
→比較相手よりやや大きい
✔ 転送性能は?→約900MBps→比較相手よりやや遅い
✔ 実装の複雑さは?→HBA自体は軽量.移植性も高い.
42
今後の展開
✔ FPGA側でOSのファイルシステムを扱いたい
✔ Zynqでも利用したい
✔ NVMeではどうだろうか?
43
今後の展開
PC
FPGA
ディスク?
何かの
処理
ディスク
インターネット
✔ なんでもディスクに見せてしまうのは楽しそう
✔ たとえば
BRAM
44
まとめ
✔ AHCIをPC-FPGA間汎用インターフェースとして使ってみる
→ HBA(ホストバスアダプタ)をFPGAに実装してみる
✔ FPGA内ロジックへのアクセスとAHCIの親和性
→AXI-MMと親和性は高い
✔ 回路規模は?→内部バスを512bitと奢ってもXC7K325Tの約35%
→比較相手よりやや大きい
✔ 転送性能は?→約900MBps→比較相手よりやや遅い
✔ 実装の複雑さは?→HBA自体は軽量.移植性も高い.

More Related Content

PDF
Synthesijer fpgax 20150201
PDF
PDF
Fpgax 20130604
PDF
Reconf_201409
PDF
Hls friends 20161122.key
PPTX
Abstracts of FPGA2017 papers (Temporary Version)
PDF
ICD/CPSY 201412
PDF
Synthesijer fpgax 20150201
Fpgax 20130604
Reconf_201409
Hls friends 20161122.key
Abstracts of FPGA2017 papers (Temporary Version)
ICD/CPSY 201412

What's hot (20)

PPTX
Gpgpu tomoaki-fp16
PDF
20130819 jjugnslt
PDF
Synthesijer.Scala (PROSYM 2015)
PDF
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみる
PDF
PostgreSQL v9.5の新機能~CustomScan/Join Interface
PDF
FPGA+SoC+Linux実践勉強会資料
PDF
FPGAのトレンドをまとめてみた
PPTX
ラプラシアンフィルタをZedBoardで実装(ソフトウェアからハードウェアにオフロード)
PDF
FPGAアクセラレータの作り方
PDF
V6 unix vol.2 in okinawa
PDF
C/C++プログラマのための開発ツール
PDF
FPGA・リコンフィギャラブルシステム研究の最新動向
PDF
Pythonによる並列プログラミング -GPGPUも-
PPTX
Javaで簡単にgpgpu aparapi
PDF
Synthesijer zynq qs_20150316
PDF
(JP) GPGPUがPostgreSQLを加速する
PDF
A100 GPU 搭載! P4d インスタンス 使いこなしのコツ
PDF
Automatic Mixed Precision の紹介
PDF
FPGAX6_hayashi
PDF
OpenCLに触れてみよう
Gpgpu tomoaki-fp16
20130819 jjugnslt
Synthesijer.Scala (PROSYM 2015)
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみる
PostgreSQL v9.5の新機能~CustomScan/Join Interface
FPGA+SoC+Linux実践勉強会資料
FPGAのトレンドをまとめてみた
ラプラシアンフィルタをZedBoardで実装(ソフトウェアからハードウェアにオフロード)
FPGAアクセラレータの作り方
V6 unix vol.2 in okinawa
C/C++プログラマのための開発ツール
FPGA・リコンフィギャラブルシステム研究の最新動向
Pythonによる並列プログラミング -GPGPUも-
Javaで簡単にgpgpu aparapi
Synthesijer zynq qs_20150316
(JP) GPGPUがPostgreSQLを加速する
A100 GPU 搭載! P4d インスタンス 使いこなしのコツ
Automatic Mixed Precision の紹介
FPGAX6_hayashi
OpenCLに触れてみよう
Ad

Similar to Reconf 201506 (20)

PDF
Reconf 201901
PDF
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
PDF
Tremaで試すFirewall
PDF
Fpga online seminar by fixstars (1st)
PPTX
GPU-FPGA協調プログラミングを実現するコンパイラの開発
ODP
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
PDF
C base design methodology with s dx and xilinx ml
PDF
高速ネットワーク最新動向と具体例 (ENOG58 Meeting)
PDF
20191211_Apache_Arrow_Meetup_Tokyo
PDF
20180217 FPGA Extreme Computing #10
PDF
kagamicomput201714
PDF
IEICE technical report (RECONF), January 2015.
PDF
seccamp2012 チューター発表
PDF
SQL+GPU+SSD=∞ (Japanese)
PDF
kagami_comput2016_14
PDF
Xbyakの紹介とその周辺
PPTX
Linux kernelのbspとupstream
PDF
第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会
PDF
20171220_hbstudy80_pgstrom
KEY
NVIDIA Japan Seminar 2012
Reconf 201901
GPU-FPGA 協調計算を記述するためのプログラミング環境に関する研究(HPC169 No.10)
Tremaで試すFirewall
Fpga online seminar by fixstars (1st)
GPU-FPGA協調プログラミングを実現するコンパイラの開発
「前回の COMSTAR ネタに刺激されてしまったので、オレも COMSTAR を使ってみた。」(仮)
C base design methodology with s dx and xilinx ml
高速ネットワーク最新動向と具体例 (ENOG58 Meeting)
20191211_Apache_Arrow_Meetup_Tokyo
20180217 FPGA Extreme Computing #10
kagamicomput201714
IEICE technical report (RECONF), January 2015.
seccamp2012 チューター発表
SQL+GPU+SSD=∞ (Japanese)
kagami_comput2016_14
Xbyakの紹介とその周辺
Linux kernelのbspとupstream
第162回情報処理学会ハイパフォーマンスコンピューティング研究発表会
20171220_hbstudy80_pgstrom
NVIDIA Japan Seminar 2012
Ad

More from Takefumi MIYOSHI (18)

PDF
ACRi_webinar_20220118_miyo
PDF
DAS_202109
PDF
ACRiルーム1年間の活動と 新たな取り組み
PDF
RISC-V introduction for SIG SDR in CQ 2019.07.29
PDF
Misc for edge_devices_with_fpga
PDF
Cq off 20190718
PDF
Synthesijer - HLS frineds 20190511
PDF
Hls friends 201803.key
PDF
Synthesijer and Synthesijer.Scala in HLS-friends 201512
PDF
Microblaze loader
PDF
Synthesijer jjug 201504_01
PDF
Synthesijer hls 20150116
PDF
Vyatta 201310
PDF
Fpgax 20130830
PDF
Fpga local 20130322
PDF
Google 20130218
PDF
Bluespec @waseda(PDF)
ACRi_webinar_20220118_miyo
DAS_202109
ACRiルーム1年間の活動と 新たな取り組み
RISC-V introduction for SIG SDR in CQ 2019.07.29
Misc for edge_devices_with_fpga
Cq off 20190718
Synthesijer - HLS frineds 20190511
Hls friends 201803.key
Synthesijer and Synthesijer.Scala in HLS-friends 201512
Microblaze loader
Synthesijer jjug 201504_01
Synthesijer hls 20150116
Vyatta 201310
Fpgax 20130830
Fpga local 20130322
Google 20130218
Bluespec @waseda(PDF)

Reconf 201506