初めまして!「TechTeku Note」へようこそ!このブログでは電気系エンジニアとして働く一技術者が自己研鑽を目的に、様々な技術領域で紹介を行っていくブログになります。
最初の記事はXilinxのFPGAとホストPCをPCIeで接続する際、XDMA (Xilinx DMA) IPおよびドライバの話です。最近はデータセンター等での活用を見たPCIeカードとしての評価基板が増えてきています。
しかし、IPをインテグレートして、標準のテストツール(xdma_testなど)を動かしてみたものの、
「あれ…? PCIe Gen3 x4 (理論値 3.9GB/s) なのに、なぜか 500MB/s しか出ない!」
といった深刻なパフォーマンス問題に直面しているエンジニアは多いのではないでしょうか。
私自身もこの問題で深くハマった経験があります。 この記事では、XDMAのデータ転送パフォーマンスが期待通りに出ない時に確認すべき、5つの最適化TIPSを、ホストPC(Linux)側からFPGAロジック側まで、幅広く紹介します。
パフォーマンス最適化の基本方針
パフォーマンスが出ない時、原因は一つとは限りません。ホストPCのCPU、OS(Linuxカーネル)、XDMA IPのパラメータ、FPGAの内部ロジックなど、データが通る経路の「最も遅い部分(ボトルネック)」に全体のパフォーマンスが引っ張られます。
これから紹介するTIPSを一つずつ確認し、ボトルネックがどこにあるのかを特定していきましょう。
TIPS 1:【Linux側】割り込み vs ポーリング
問題
XDMAはデフォルトで「割り込みモード」で動作します。これは「転送が完了したら割り込みコントローラーからCPUに通知(割り込み)する」という効率的な仕組みですが、割り込みに伴うソフトオーバーヘッドが大きく、転送効率を落としてしまいます。
対策
純粋な最大スループットを計測する場合、ポーリングモードを試してください。 XDMAのポーリングモードは、CPUが「転送終わった?」とひたすらXDMAの状態を能動的にチェックし続けるモードです。
CPUが常に転送完了の確認を能動的に行うためため、CPU使用率は高くなりますが、多くの場合、割り込みモードよりも高いスループットを記録できます。 (実アプリケーションでは、CPU負荷とのトレードオフになります)
なお、ポーリングモードはXDMAドライバをアタッチする際に以下のコマンドで選択することができます。$ sudo modprobe xdma poll_mode=1
TIPS 2:【Linux側】CPUコアアイソレーション
これは、ソフトウェア側で最も効果が出やすいTIPSの一つです。
問題
Linuxは、OSのタスク(マウスの移動、ネットワーク処理、他のプロセス)と、あなたのDMA転送アプリ(xdma_test)やXDMAの割り込み処理を、すべてのCPUコアで平等に処理しようとします。
これにより、データ転送中に別のタスクが割り込む(コンテキストスイッチ)ことで、前述のCPUによる転送確認が阻害された結果、転送パフォーマンスが著しく低下します。
対策
GRUBの起動時パラメータで isolcpus を指定し、**特定のCPUコアをOSのスケジューラから分離(アイソレート)**します。
例えば、CPUコア2と3を分離する場合、/etc/default/grub に isolcpus=2,3 と追記し、update-grub を実行します。
そして、taskset コマンドを使い、あなたのDMA転送アプリを、分離したコア(例:コア2)に、XDMAの割り込み処理を別の分離したコア(例:コア3)に割り当てることで、他のOSタスクに邪魔されずにデータ転送に集中させることができます。
TIPS 3:【Linux側】HugePagesの利用
問題
DMA転送は大量のメモリを連続して読み書きします。 しかし、Linuxの標準的なメモリ管理単位(ページ)は 4KB と非常に小さく、例えば 1GB の転送を行うには 262,144回 もメモリアドレスの変換(TLBルックアップ)が必要になり、これがオーバーヘッドとなります。
対策
HugePages を有効にします。 HugePagesは、4KB の代わりに 2MB や 1GB といった巨大なメモリページを使う仕組みです。
1GB の転送を 1GB のHugePageで行えば、アドレス変換はたった1回で済みます。 xdma_test ツールもHugePagesを利用するオプションをサポートしています。OS側でHugePagesを設定し、転送に利用することで、メモリ管理のオーバーヘッドを劇的に削減できます。
TIPS 4:【FPGAロジック側】AXIバスのクロックとバス幅
問題
ホストPCとIPコアが最適化されても、その「データの源泉」であるFPGA側のユーザロジックが遅ければ、それがボトルネックになります。
対策
以下の3点を確認してください。
- AXIクロック周波数: あなたのユーザロジックとAXIインターフェイスは、十分高速なクロック(例:150MHz, 250MHz)で動作していますか?
- AXIバス幅: XDMAがサポートするバス幅(例:512bit)をフルに使っていますか? もし32bit幅のロジックから512bit幅のAXIに接続する場合、適切なデータ幅変換(FIFOやData Width Converter IP)を行わないと、バスの帯域を使い切れません。
- AXISインターフェース: XDMA IPからはAXI MM(メモリマップ)もしくはAXI ST(ストリーム)で接続することができますが、より高スループットでデータ転送を行うにはAXI STを選択するのがベストです。
まとめと次のステップ
XDMAのパフォーマンスが出ない時、確認すべき5つのTIPSを紹介しました。
- 割り込み vs ポーリング
- CPUコアアイソレーション
- HugePagesの利用
- AXIバスのクロックとバス幅
私自身の環境では、TIPS 1と2(ポーリングとCPU分離)を適用しただけで、スループットが 1.2 GB/s から 2.8 GB/s に改善した経験があります。
パフォーマンスチューニングは、ホストPCのCPUアーキテクチャ、Linuxカーネル、FPGAロジックの深い理解が求められる、地道な作業です。
この「ハードウェアとソフトウェアの境界」をさらに深く探求したい方へ。 私がこのチューニング作業でバイブルとして参照した、2冊の良書を紹介します。
参考文献
LinuxカーネルがDMAやメモリをどう扱っているのか、デバイスドライバの観点から理解を深めるには、この一冊は外せません。HugePagesや割り込み処理の「なぜ」が分かります。
[Linuxデバイスドライバ 第3版 | Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman, 山崎 康宏, 山崎 邦子, 長原 宏治, 長原 陽子 |本 | 通販 | Amazon]
「なぜCPUキャッシュやTLBがパフォーマンスに効くのか」を体系的に理解するには、コンピュータアーキテクチャの知識が不可欠です。少し難しいですが、一生モノの知識になります。
[コンピュータアーキテクチャ[第6版]定量的アプローチ | ジョン L ヘネシー, デイビッド A パターソン, 発行:エスアイビー・アクセス 発売:星雲社, 中條 拓伯, 天野 英晴, 鈴木 貢 |本 | 通販 | Amazon]
この記事が、あなたのXDMAパフォーマンス問題の解決に「テクテク」と一歩近づく助けになれば幸いです。

コメント