KC705でPCIeの通信性能を測定してみた

PCIe gen1 x1の転送速度は理論(規格)上では2.5GTps,0.25GBpsです.

しかし,実際にはPCIe上のデータを駆動するエンジンの処理時間や,データ供給源からの読み出し,書き込み先での書き出し時間など,いろいろなオーバヘッドが入ってきます.

で,実際どのくらいなのよ?というのを EDKでPCIe+DDR3のアクセラレータフレームワークを作る(1) で作ったシステムをベースに評価してみました.

結果

で,いきなりですが,結果です.

result1

測定したのは,

転送速度は次の4パタン,

  • Gen1 x1
  • Gen2 x1
  • Gen1 x4
  • Gen2 x4

DMA転送単位は次の7パタンを試しました

  • 1KB
  • 4KB
  • 16KB
  • 64KB
  • 256KB
  • 1MB
  • 4MB

Gen2 x4の場合は,

  • DMA転送単位が1KBのときにHost→DDR3/FPGAとDDR3/FPGA→Hostのどちらも約58MBps
  • DMA転送単位が4MBのときにHost→DDR3/FPGAが約850MBps,DDR3/FPGA→Hostが約1035MBps

でした.

結構速いと思うのですが,PCIeの理論的な転送レートはGen2 x4の場合2GBpsなので,それからすると半分くらいの速度がでいてるということになります.

もう少し詳しく考えてみましょう.

結果について考える前に,評価した環境を示しておきます.

実験するシステムのコンポーネント構成

実験に用いるシステムのコンポーネント構成は次の通りで,これは,単純にEDKのAXI I/Fなコアを組み合わせたシステムです.

system_overview

評価の動作は,

  1. ソフトウェアがDMAに適切なパラメタをセット
  2. DMAを開始(ここが開始時刻)
  3. 終わったら割り込みがかかるので,その時刻が終了時刻
  4. 終了時刻-開始時刻がデータの転送にかかった時間
というシンプルなものです.
これで,
  • ホストPCのメモリの内容をFPGAボードのメモリに書き込む(Host→DDR3/FPGA)
  • FPGAボードのメモリの内容をホストPCのメモリに書き込む(DDR3/FPGA→Host)
をそれぞれ測定します.
なお,ホストPCのメモリは,カーネル管理外にしておいてFPGAから自由にアクセスできるようにしておきます。

ホストPCのスペック

実験に使ったホストPCの素性は,こんな感じ.

  • CPU:Core i5-4430
  • マザーボード:GA-Z87X-UD5H セット
  • メモリ:CML32GX3M4A1600C10B (PC3-12800/DDR3-1600)

FPGAボード関連のスペック

FPGA側のパラメタは,こんな感じ.

  • FPGAボード:Xilinx KC705
  • メモリ:MT8JTF12864HZ-1G6G1(データパス幅 64bit,最大転送レート: 1600MT/s)
  • AXIまわりのパラメタ
    • クロック
      • CDMAなどの基本的な回路 100MHz
      • メモリ 800MHz (200MHzを1:4で供給)
      • PCIe 100MHz(供給クロック)→125MHz(内部処理クロック)
    • データ幅
      • AXIメインネットワーク 256bit
      • PCIeデータ幅 128bit
      • メモリコアへのAXIバス幅 256bit
なんというか,結構ゴージャスな構成です.リソース使用率はだいたいKC705に搭載されているFPGAの1/3程度でした.
ちなみに,元々の構成では,メモリコアへのAXIバス幅とメインネットワークのバス幅を64bitにしていたのですが,その状態では,今回のようには性能がでていませんでした.

結果をよく眺めてみよう

PCIeの転送速度が,Gen1 x1,Gen2 x1,Gen1 x4,Gen2 x4で1,2,4,8倍になっていて,メモリやオペレーション処理にかかる時間がPCIeの転送速度と無関係だと仮定してみます.

すると,xバイトのデータを転送するのにかかる時間yは,Gen1 x1の転送レートをa,メモリやオペレーション処理にかかる時間をbとすると,

  • Gen1 x1: y = x/a + b
  • Gen2 x1: y = x/2a + b
  • Gen1 x4: y = x/4a + b
  • Gen2 x4: y = x/8a + b

になります.先の実験値を元に最小二乗法でaとbを求めてみましょう.xは1 Byte,yはスループットの逆数です.

転送単位が1024BytesのHost→DDR3/FPGAの場合は↓のように

result_1024_1

転送単位が4MBytesのHost→DDR3/FPGAの場合は↓のように

result_4M_1

なりました.

積み上げグラフの赤の部分と青の部分が,それぞれ,計算で求めたPCIeの転送時間とメモリアクセスやその他の処理にかかった時間に相当します.また,緑の折れ線が実験値です(1 Bytesの転送にかかる時間).

傾向として大きくずれてはいないので,”PCIeの転送時間はスケールしている”,”メモリアクセスとオペレーションの時間は一定”という上記の仮定は大きく間違ってはいないようです.

ちなみに,計算で求めた4MByteのときのPCIeの転送レートは,理論性能の86%程度でした.うーん,まあ,こんなものかなぁ,と.

結果を踏まえて

システムとしては4KBくらいの転送単位のなら50MBpsくらい,4MBくらいの転送単位なら1GBpsくらいですよー,という感じでいいのかな.

小さなデータ転送が多いようなアプリでも,256KBから512KB単位での転送ができるようにするといいのかも.

また,最初に示した測定結果,そして上記の積み上げグラフをみてみると,PCIe gen2 x8やPCIe gen3 x4といった,もう一つ上のグレード,あるいは,それ以上を採用しても,システムとしては単純に倍の性能が得られる,というわけではないのかな,ということも言えそうですね.

シェアする

  • このエントリーをはてなブックマークに追加

フォローする