Ryuz's tech blog

FPGAなどの技術ブログ

KV260 での APUからのキャッシュ有効でのPLアクセス

はじめに

筆者は過去に幾つかこの手のパフォーマンス検証を行い、下記のブログを書きました。

基本的には MPU を自由に弄りやすい、RPU(Cortex-R5) からの検証が主でしたが、今回 ikwzm氏のこちらの記事を読み

qiita.com

アルファ版ながらに uiomem という素晴らしいドライバを公開されておられることを知りました。 APU 側のメモリは Linux に管理されているため、おいそれと手が出せなかったのですが、これなら私にも使えそうです。

同氏の u-dma-buf の方も、キャッシュ制御機能があることは知っていましたが、利用できていなかったので今回いろいろと対応して実験することにしました。

などを整備中です。

実験環境

下記のような構成で AXI バスを 128bit 設定で 333.33MHz で 256kバイト分の Ultra-RAM にアクセスできるようにしました。

実験環境

下記のようにレイテンシ 4 まで増やさないとタイミング収束しませんでしたが、サイズがあまり小さいと計測精度が下がってしまうので致し方ないところです。専用回路をうまく組めば read はもう少し攻められるかも知れません。

メモリ設定

実験結果

実験結果を下記に張っておきます。

target driver Cache 方向 計測[MB/s] バイス限界[MB/s] 備考
DDR4 u-dma-buf disable read 62.78 19,200 64bit 2400MHz
OCM uiomem disable read 74.98 8,000 128bit 500MHz?
PL uiomem disable read 72.79 5,328 128bit 333MHz
DDR4 u-dma-buf disable write 788.50 19,200 64bit 2400MHz
OCM uiomem disable write 786.96 8,000 128bit 500MHz?
PL uiomem disable write 696.47 5,328 128bit 333MHz
DDR4 u-dma-buf enable read 963.49 19,200 64bit 2400MHz
OCM uiomem enable read 1025.47 8,000 128bit 500MHz?
PL uiomem enable read 963.35 5,328 128bit 333MHz
DDR4 u-dma-buf enable write 2034.31 19,200 64bit 2400MHz
OCM uiomem enable write 2094.54 8,000 128bit 500MHz?
PL uiomem enable write 2193.73 5,328 128bit 333MHz

今のところ

  • キャッシュON/OFF は非常に大きく性能に影響する
  • DDR4 や OCM はそれ自体の帯域はあるが、シングルコアのみでは上限がありそう
  • 逆に PL の 128bit @ 333MHz でもシングルコアの上限にかなり迫っている

というのが見えてきました。早い話がどこにアクセスしても性能はそこまで大きくは変わらなそうです。

ちなみに OCM のデバイス的な限界おぬりょくですが、バス幅が 128bit であることはTRMに記載がありましたが、周波数がよくわかりませんでした。 下記から類推するに 500MHz でしょうか?

DS

アクセス波形

書き込み波形

読み出し波形

読み書き共に SIZE=4 (128bit) で LEN = 3 (4バースト) の 64バイト単位でのアクセスが確認できており、それなりに帯域は埋まっているようです。

おわりに

PS と PL の通信では、メモリを経由する方法と、直接アクセスする方法があります。

DDR4 などはそれ自身はマルチコアのAPUやGPUなどから共有して使うという事もありそれなりの高帯域ですが、APUの1コアのみからのアクセスですと、そこまで驚く帯域にはならないようです。 一方で、シングルコアからの制御に限れば、PL の 128bit@333MHz という上限はそれほど大きな制約にはならないことが見えてきました。 ですので結局のところ APU においても RPU 同様にキャッシュなどの設定がとても重要になるようです。

筆者は以前から Zynq のメリットは PS と PL が密結合ししていることにあると主張してきました。、 DRAMやOCMを経由する場合も、一度キャッシュを Flush しなければ、PL や DMA に読ませることはできません。メモリを経由すると往復の帯域を消費してしまう上に、レイテンシは2倍かかってしまいます。

Linxu上でのキャッシュ制御という本来面倒な壁があったのですが、uiomem の登場によって、PS-PL 間の直接通信の利便性は今後ますます向上しそうに思います。

まだアルファ版のようですので、是非正式版を楽しみに待ちたいところです。