![]() Vitis™ アプリケーション アクセラレーション開発フロー チュートリアル |
HBM 帯域幅の確認¶
このセクションでは、1 つの HBM マスターポートを使用した場合に達成可能な帯域幅を確認します。また、カーネル マスター ポートによってさまざまなトランザクション サイズが開始されるため、単一または複数の擬似チャネルへのアクセスについても説明します。
トポロジ (たとえば、M0 からスイッチを経由した単一 PC0 への直接接続、または M0 からグループ PC0-1 への直接接続、または M0 からグループ PC0-3 への接続)。
トランザクションのバイト数は 64 バイトから 1024 バイトに変化します。
使用されるアドレス指定: シーケンシャル/リニア アクセスまたはランダム アクセス
Random Access Memory Attachment (RAMA) IP を使用すると結果が改善します。RAMA IP は、特に理想的でないトラフィック マスターやユース ケースの HBM ベースのデザインを支援するために設計されています。詳細は『RAMA LogiCORE IP 製品ガイド』 (PG310) を参照してください
このセクションでは、上記の異なるコンフィギュレーションを使用して、十分なデータを解析し、開発者がデザインを理解して、より適切な決定を下すことができるようにします。
アプリケーションがメモリ バウンドの場合は、DDR または HBM のいずれであっても、64 バイトのデータにアクセスすることをお勧めします。このプロジェクトでは、makefile の dwidth
変数を使用して、データ幅はデフォルトで 512 ビットに設定されています。この変数を変更して、データ幅を小さくすることもできます。さらに、測定されるパフォーマンスは M_AXI インターフェイス メモリの読み取り専用パフォーマンスに基づいています。このセクションでは、書き込みパフォーマンスは測定されません。測定される帯域幅は C++ std::chrono を使用して、カーネル エンキューの直前と queue finish コマンドの直後の時間を記されます。帯域幅は、達成された GB/s でレポートされます。
カーネルポート in1、in2、および out は、すべての HBM チャネルに接続されています。このシナリオでは、各カーネル ポートがすべての HBM チャネルにアクセスできます。アプリケーションがこの接続をインプリメントする必要があるのは、アプリケーションがすべてのチャネルにアクセスする必要がある場合のみです。HBM メモリ サブシステムは接続されたすべてのメモリへの最適なアクセス (たとえばカーネル ポート in1 から HBM サブシステムの M11 または M12) をカーネルに提供しようとします。このアプリケーションでは、中間マスター M12 から PC0 または PC31 などの極端な場所の擬似チャネルにアクセスするために、余分なレイテンシが発生します。このため、アプリケーションは、カーネル ポートに接続された AXI インターフェイスでより優れたトランザクション設定を必要とする場合があります。
このモジュールでは、わかりやすくするため、すべてのカーネル ポートがすべての Psudeo チャネルに接続されています。
まず、順次アクセスを使用した帯域幅から始めましょう。
順次アクセス¶
この手順では、まず 64 バイト、128 バイト、256 バイト、512 バイト、1024 バイトなどのトランザクション サイズをサポートできる xclbin を構築します。次に、HBM の擬似チャネル 1 つ (256 MB)、擬似チャネル 2 つ (512 MB)、および擬似チャネル 4 つ (1024 MB) にアクセスする達成可能な帯域幅を確認できます。
次に、PC0 にアクセスするマスター 0 の次のターゲットを使用してアプリケーションを構築する例を示します。(このコマンドは実行しないでください)
make build TARGET=hw memtype=HBM banks=0_31 dsize=256 addrndm=0 txSize=64 buildxclbin=1
このプロジェクトには、引数を使用してアプリケーションを実行するための次のような柔軟性があります。
ホスト サイズの datasize が 256 MB であるため、dsize=256 では擬似チャネル 1 つにしかアクセスできません。
txSize=64 は、カーネル ポートから 64 バイトに相当する各コマンドをキューに入れます。各転送は 64 バイトであるため、これはバースト長 1 に相当します。txSize=128 は、バースト長 2 と同じになります。
banks0_31 は、カーネルの AXI マスター ポートがすべてのバンクに接続するように設定します。構築中に、makefile はそれぞれの構築ディレクトリに HBM_connectivity.cfg ファイルを作成します。詳細は、
mem_connectivity.mk
を参照してください。 in_M0、in_M1、および out_M2 変数を更新して、カスタム接続を作成することもできます。addrndm=0 は、カーネルの実行時に生成されるアドレスが連続するようになります。前に確認したように、これはホスト コードから渡されたカーネルへの引数です。
上記の build コマンドは、次のディレクトリの下に xclbin を作成します。
次のコマンドを実行すると、64、128、256、512、1024 バイトの txSize のビルドを生成できます。
make build_without_rama
# このコマンドは、最初のモジュールで既に実行しています。
マシンに 6 つのジョブを並列で起動するのに十分なリソースがない場合は、次のように上記のコマンドを 1 つずつ実行できます。
make noramajob-64 noramajob-128 noramajob-256 noramajob-512 noramajob-1024
次のコマンドで、64、128、256、512、1024 バイトの txSize 用に作成され上記のビルドを使用し、1、2、4 個の擬似チャネルにアクセスするアプリケーションを実行します。
make all_hbm_seq_run
上記のターゲットは、次のデータを含む <Project>/makefile/Run_SequentialAddress.perf
出力ファイルを生成します。
Addr Pattern Total Size(MB) Transaction Size(B) Throughput Achieved(GB/s)
Sequential 256 (M0->PC0) 64 13.0996
Sequential 256 (M0->PC0) 128 13.0704
Sequential 256 (M0->PC0) 256 13.1032
Sequential 256 (M0->PC0) 512 13.0747
Sequential 256 (M0->PC0) 1024 13.0432
Sequential 512 (M0->PC0_1) 64 13.1244
Sequential 512 (M0->PC0_1) 128 13.1142
Sequential 512 (M0->PC0_1) 256 13.1285
Sequential 512 (M0->PC0_1) 512 13.1089
Sequential 512 (M0->PC0_1) 1024 13.1097
Sequential 1024 (M0->PC0_3) 64 13.148
Sequential 1024 (M0->PC0_3) 128 13.1435
Sequential 1024 (M0->PC0_3) 256 13.1506
Sequential 1024 (M0->PC0_3) 512 13.1539
Sequential 1024 (M0->PC0_3) 1024 13.1454
このユース ケースは、1 つのカーネル マスター M0 を使用して HBM にアクセスした場合の最大の結果を示しています。上記の表は、達成された帯域幅の測定値を GB/s で示しています。
上から 5 行は、さまざまなトランザクション サイズのポイント ツー ポイント アクセス (256 MB アクセス) を示しています。帯域幅は約 13 GB/s で一定しています。
次の 10 行は、2 つの擬似チャネル (512 MB) と 4 つの擬似チャネル (1024 MB) のグループを示し、帯域幅は一定しています。
まとめ: 順次アクセスで達成される帯域幅は、ほとんどがトポロジから独立しており、約 13 GB/s で一定しています。¶
ランダム アクセス¶
前の手順と同じトポロジですが、選択した範囲内のランダム アドレスを使用したアドレス指定方法です。
次の makefile ターゲットを使用してアプリケーションを実行しても、前の手順のようにすべてのバリエーションを実行できます。再度 xclbins を構築する必要はありません。
make all_hbm_rnd_run
上記のターゲットは、次のデータを含む出力ファイル <Project>/makefile/Run_RandomAddress.perf
を生成します。
Addr Pattern Total Size(MB) Transaction Size(B) Throughput Achieved(GB/s)
Random 256 (M0->PC0) 64 4.75379
Random 256 (M0->PC0) 128 9.59893
Random 256 (M0->PC0) 256 12.6164
Random 256 (M0->PC0) 512 13.1338
Random 256 (M0->PC0) 1024 13.155
Random 512 (M0->PC0_1) 64 0.760776
Random 512 (M0->PC0_1) 128 1.49869
Random 512 (M0->PC0_1) 256 2.71119
Random 512 (M0->PC0_1) 512 4.4994
Random 512 (M0->PC0_1) 1024 6.54655
Random 1024 (M0->PC0_3) 64 0.553107
Random 1024 (M0->PC0_3) 128 1.07469
Random 1024 (M0->PC0_3) 256 1.99473
Random 1024 (M0->PC0_3) 512 3.49935
Random 1024 (M0->PC0_3) 1024 5.5307
上の 5 行は、さまざまなトランザクション サイズのポイント ツー ポイント アクセス (256 MB アクセスなど) を示しています。アドレス パターンが連続している場合、帯域幅は前の手順の上から 5 行と比較すると低下しますが、トランザクション サイズが大きい場合でも、適切な帯域幅を使用できます。
帯域幅は、前の手順で順次アクセスを使用した 13GB/s の上から 5 行と比較すると低下します。ただし、トランザクション サイズが 64 バイトを超える場合でも、帯域幅は向上することはあります。128 バイト以上にアクセスする場合は、最初のアクセスのみがランダムで、トランザクション内の次のアクセスは順次になるため、メモリの使用効率が向上します。
2 つまたは 4 つの PC にアドレスを指定して、マスターがより広範囲にアクセスできるようにしている場合、帯域幅は大幅に低下します。このため、1 つの M_AXI が 1 つの PC に接続された場合の方が、複数の PC に接続した場合よりも優れた帯域幅になることを確認することが重要となります。
13 行目の具体的な例を見てみると、トランザクション サイズは 256 バイトで、ランダムにアクセスされる 1 GB のデータを使用しており、PC0-3 を使用しています。パフォーマンスは大体 2 GB/s です。これが実際に必要なパフォーマンスである場合は、そのデザインのマイクロアーキテクチャを変更し、4 つの M_AXI を使用して 4 つの PC に排他的にアクセスすることをお勧めします。つまり、カーネル コードがアクセスするインデックス/アドレスをチェックしてから、ポインター引数のいずれかを排他的に使用して (4 つの M_AXI のいずれかに変換して)、このメモリ アクセスを実行する必要があることを意味します。アクセス範囲は既にポインター/M_AXI ごとに 256 MB になったので、基本的には、1 つのマスターが 1 つの PC にアクセスするユース ケースに戻ったことになり、3 行目の状態とまったく同じになります。この結果、4 つのインターフェイスを使用して 12 GB/s 以上の帯域幅が提供されますが、一度に使用できる帯域幅は 1 つだけです。これら 4 つの M_AXI を使用して 2 つの並列アクセスを実行することで、この状態をさらに改善することはできますが、これは、インデックス/アドレスを提供するデザイン部分が 2 を並列で提供する必要があることを意味するので、これも課題となる可能性があります。
まとめ: 1 つの擬似チャネルに 256 MB 以上のデータ (またはそれ以下) でアクセスすると、複数の擬似チャネルにアクセスするよりも帯域幅が高くなります。¶
RAMA IP を使用したランダム アクセス¶
この手順では、前の手順と同じトポロジを使用しますが、RAMA IP を使用して全体的な帯域幅を向上させます。この手順では、新しい xclbins を生成する必要があります。
v++ リンカーは、RAMA IP を AXI マスター ポートに接続する Tcl ファイルを必要とします。詳細は、./makefile/rama_post_sys_link.tcl
ファイルを参照してください。
この makefile は。次に示す cfg-rama.ini ファイルを作成し、--config cfg-rama.ini
オプションを使用して v++ リンク段階を設定します。
[advanced]
param=compiler.userPostSysLinkTcl=<Project>/makefile/rama_post_sys_link.tcl
すべての xclbins を構築するには、次のターゲットを実行します。
make build_with_rama
# このコマンドは、最初のモジュールで既に実行しています。
マシンに 6 つのジョブを並列で起動するのに十分なリソースがない場合は、次のように上記のコマンドを 1 つずつ実行できます。
make ramajob-64 ramajob-128 ramajob-256 ramajob-512 ramajob-1024 -j6
次の makefile ターゲットを使用してアプリケーションを構築して実行しても、前の手順のようにすべてのバリエーションを実行できます。
`make all_hbm_rnd_rama_run`
上記のターゲットは、次のデータを含む出力ファイル <Project>/makefile/Run_RandomAddressRAMA.perf
を生成します。
Addr Pattern Total Size(MB) Transaction Size(B) Throughput Achieved(GB/s)
Random 256 (M0->PC0) 64 4.75415
Random 256 (M0->PC0) 128 9.59875
Random 256 (M0->PC0) 256 12.6208
Random 256 (M0->PC0) 512 13.1328
Random 256 (M0->PC0) 1024 13.1261
Random 512 (M0->PC0_1) 64 6.39976
Random 512 (M0->PC0_1) 128 9.59946
Random 512 (M0->PC0_1) 256 12.799
Random 512 (M0->PC0_1) 512 13.9621
Random 512 (M0->PC0_1) 1024 14.1694
Random 1024 (M0->PC0_3) 64 6.39984
Random 1024 (M0->PC0_3) 128 9.5997
Random 1024 (M0->PC0_3) 256 12.7994
Random 1024 (M0->PC0_3) 512 13.7546
Random 1024 (M0->PC0_3) 1024 14.0694
上から 5 行は、さまざまなトランザクション サイズのポイント ツー ポイント アクセス (256 MB アクセス) を示しています。達成される帯域幅は、RAMA IP を使用しない場合の前の手順と非常に似ています。 それぞれ 512 MB と 1024 MB にアクセスする次の 10 行は、RAMA IP を使用しなかった場合と比較して、達成される帯域幅が大幅に増加しているところを示しています。
まとめ: RAMA IP は、必要なメモリ アクセスが 256 MB (1 つの HBM 擬似チャネル) を超える場合に、メモリ アクセスの効率を大幅に向上させます。¶
まとめ¶
まとめこれで、このチュートリアルは終了します。
このチュートリアルでは、v++ フローを使用して DDR ベースのアプリケーションを HBM ベースのアプリケーションに移行することが比較的簡単であることを学習しました。また、HBM ベースのアプリケーション スループットが、アドレス パターンとカーネルがアクセスするメモリ全体に応じてどのように変化するかについても試しました。
Copyright© 2020 Xilinx