Alveo U50のHBM

ひきつづきAlveo U50を動かすお話です。以前、FixstarsさんのところでU50のXDMAを動かした記事 を拝見して、同じように UltraRAM を接続して Core i3-6100 + DDR4-2133 Dual channelで動かしてみたら、こんな感じでした。

Write Performance 
** Average BW = 8388608, 10296.580078
Readback and Compare
** Average BW = 8388608, 4462.804199
Read Performance
** Average BW = 8388608, 9191.814453

Fixstars さんの POWER8 なホストでは 12GB/s とか出ているので、この差は CPU パワーだったりメモリシステムだったりするのでしょうか。単に DMA 転送しているだけだと CPU 使用率がスカスカで、すぐクロックが下がって DMA まで遅くなってしまうので、裏で yes > /dev/null してクロック周波数を維持しています (本当はちゃんとクロック周波数のコントロールを設定すればいいのですが。)

それで、HBM を XDMA に接続するのはなんとなくめんどくさそうで二の足を踏んでいたのですが、そろそろ本気出さないといけない感じになってきましたので、とりあえずやってみることにしました。方針としては、

  • あとで並列アクセスをする気がするので、とりあえず HBM IP コアの global addressing の機能はつかわない
  • とりあえず 1ch、512MB だけ動かす
  • HBM reference clock (100MHz) は SYSCLK3  (BC18, BB18) から
  • それ以外のクロックは SYSCLK2 (G16, G17) と、それで駆動する MMCM から
  • HBM IP の AXI インタフェイスは MMCM で 450MHz を作ってそれで駆動

ということにしました。いろいろと紆余曲折があって、今日も半日くらい使ったのですが、ブロックデザイン全体・HBM IP のチャネルの設定・アドレスマップは以下のようになっています。


CLK100 とか RST100_N はブロックデザインの外側の RTL で、CMC_CLK から作っています。アドレスマップをみると unmapped slaves があるので、あれ、と思う方もいらっしゃるかもしれませんが、global addressing を切ってしまうと、8つあるメモリチャネル (512MB) を半分ずつにした 256MB の (pseudo channel に対応した) 領域が 16あるAXIインタフェイスと1:1の関係になるようで、SAXI_00 だけでは正しく動作しませんでした。転送速度を UltraRAM のときと同じように測定すると、

Write Performance
** Average BW = 536870912, 10075.326172
Readback and Compare
** Average BW = 536870912, 4533.174316
Read Performance
** Average BW = 536870912, 9016.518555

ということで、ひとまずバンド幅はちゃんと出ているようですが、AXI Interconnect を性能側に振った設定にして、出力の register slice などを on にしないとタイミングが meet しなかったので、左右両スタックの HBM をこのまま 16ch + 16ch で AXI interconnect に直結するのはちょっと性能的に厳しそうで (AXI interconnect のポート数の制約もあるし) 、やはり global addressing を利用するのが賢いのかなあ、という気がしています。

Alveo U50のUART

Alveo U50 を使うことになって、ちょっとずついろいろ試しているのですが、ようやく Alveo U50 Getting Started に掲載されている Vivado 用の XDC ファイルが更新され、U50 SFP (Production版) のファイルになりました。

以前公開されていた U50DD (ES版) の XDC ファイルは中身がだめだめだったのですが、今回はわりとちゃんとしているようです。PCIe 関係などは XDC がなくてもボードファイルをのぞけばピン配置などがわかったのですが、XDC ファイルにはそれ以外の情報も掲載されていて、たとえば、

# Bank 65 and 68 FPGA UART Interface 0/1/2 to DMB-01 (User selectable Baud) 
#    FPGA_UART0/1/2_RXD  Input from DBM-01 UART to FPGA 
#    FPGA_UART0/1/2_TXD  Output from FPGA to DBM-01 UART 

とあって、どうやらプログラミングケーブルを経由して UART が使えるようです。

で、3つ使える、とあるのですが、試してみたところ使えるのは 0, 1 のみで、2 は未接続な感じです。プログラミングケーブルに搭載されているのは FT4232 で、4ポートの UART ポートがあるのですが、これはどうやら

  1. JTAG
  2. (未接続?)
  3. FPGA_UART0
  4. FPGA_UART1

というふうに接続されているようです。1. の JTAG ポートは、はじめ /dev/ttyUSBx として見えているのですが、Vivado や xsdb などで接続すると消えてしまうので、JTAG ポートということなのでしょう。

なお、プログラミングケーブルには「使わない」と書かれている MicroUSB ポートがもうひとつあるのですが、こちらに接続するとやはり FT4232 が現れます。Vivado の Hardware Manager でのぞいてみると、ARM DAP が現れますので、こちらはサテライトコントローラのMSP432と、その UART ポートが接続されていそうです。