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 を作成します。 /build/HBM_addSeq_allBanks_d512_txSize64

次のコマンドを実行すると、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