インテル - ロゴOpenCL カスタム プラットフォーム用の FPGA SDK での異種メモリ システムの作成
説明書

インテル® FPGA SDK for OpenCL カスタム・プラットフォームでの異種メモリー・システムの作成

カスタム プラットフォームでの異種メモリの実装により、外部メモリ インターフェイス (EMIF) の帯域幅が増加し、より大規模で高速なメモリ アクセスが可能になります。 異種メモリアクセスと最適化されたメモリアクセスの組み合わせ
OpenCL ™(1) カーネルにより、OpenCL システムのパフォーマンスが大幅に向上します。
このアプリケーション・ノートでは、インテル® FPGA SDK for OpenCL(2) で使用するカスタム・プラットフォームでの異種メモリー・システムの作成に関するガイダンスを提供します。 インテルでは、読者が異種メモリ システムを含むカスタム プラットフォームを開発している経験豊富な FPGA 設計者であることを前提としています。
ヘテロジニアス・メモリー・システムを作成する前に、以下に指定されているインテル FPGA SDK for OpenCL のドキュメントをよく理解してください。
関連情報

  • インテル FPGA SDK for OpenCL プログラミング・ガイド
  • インテル FPGA SDK for OpenCL ベスト・プラクティス・ガイド
  • インテル FPGA SDK for OpenCL Arria 10 GX FPGA 開発キット リファレンス プラットフォーム移植ガイド

1.1. FPGA ボードと EMIF インターフェイスの機能の検証

各メモリ インターフェイスを個別に検証し、グローバル メモリを使用してカスタム プラットフォームをインスタンス化します。

  1. 各インターフェイスの速度と安定性をテストできるハードウェア設計を使用して、各メモリ インターフェイスを検証します。
  2. グローバル メモリを使用してカスタム プラットフォームをインスタンス化します。
    1. 例えばampたとえば、XNUMX つの DDR インターフェイスがある場合、そのうちの XNUMX つを異種メモリとしてマップする必要があります。 この場合、OpenCL スタックの機能を各 DDR インターフェイスで個別に検証します。
      OpenCL および OpenCL ロゴは、Khronos Group™ の許可を得て使用されている Apple Inc. の商標です。
    2.  インテル FPGA SDK for OpenCL は、公開されたクロノス仕様に基づいており、クロノス適合テスト・プロセスに合格しています。 現在の適合ステータスは、次の場所で確認できます。 www.khronos.org/conformance。

インテルコーポレーション。 全著作権所有。 Intel、Intelロゴ、およびその他のIntelマークは、IntelCorporationまたはその子会社の商標です。 インテルは、FPGAおよび半導体製品のパフォーマンスをインテルの標準保証に従って現在の仕様に保証しますが、通知なしにいつでも製品およびサービスを変更する権利を留保します。 インテルは、インテルが書面で明示的に同意した場合を除き、本書に記載されている情報、製品、またはサービスの適用または使用から生じる責任または義務を負わないものとします。 インテルのお客様は、公開されている情報を信頼する前、および製品やサービスを注文する前に、最新バージョンのデバイス仕様を入手することをお勧めします。 *他の名前やブランドは他人の所有物として主張される場合があります。
ISO 9001:2015登録
あるいは、XNUMX つの DDR インターフェイスと XNUMX つのクアッド データ レート (QDR) インターフェイスがある場合は、XNUMX つの DDR インターフェイスと QDR インターフェイスの OpenCL スタックの機能を個別に検証します。
インテルでは、PCI Express® (PCIe®) または EMIF 専用設計を使用してメモリー・インターフェースをテストすることをお勧めします。 各メモリ インターフェイスが機能し、OpenCL デザインがメモリ インターフェイスのサブセットで動作することを確認したら、次の手順に進みます。
完全に機能する異種メモリ システムを作成します。 
1.2. board_spec.xml の変更 File
board_spec.xml を変更する file OpenCL カーネルで使用できる異種メモリ システムのタイプを指定します。
カーネルのコンパイル中に、インテル FPGA SDK for OpenCL オフライン・コンパイラーは、指定されたバッファー位置引数に基づいてカーネル引数をメモリーに割り当てます。
1.board_spec.xml を参照します。 file カスタム プラットフォームのハードウェア ディレクトリにあります。
2.board_spec.xml を開きます。 file テキスト エディタで、XML を適宜変更します。
例えばampファイル、ハードウェア システムにデフォルトのグローバル メモリとして XNUMX つの DDR メモリと、異種メモリとしてモデル化した XNUMX つの QDR バンクがある場合は、board_spec.xml のメモリ セクションを変更します。 file 次のようになります。
















1.3. Qsys での複数のメモリ ディバイダのセットアップ
現在、Qsys デザインの OpenCL メモリ バンク ディバイダは、2 のべき乗以外の数のメモリ バンクをサポートしていませんが、これは一般的な構成の制限ではありません。 ただし、2 のべき乗以外の数のメモリ インターフェイスが必要なシナリオもあります。 2 のべき乗以外の数のメモリ インターフェイスに対応するには、複数の OpenCL メモリ バンク ディバイダを使用して、2 のべき乗以外の数のメモリ バンクを持つ異種メモリ システムを作成します。 真の異種メモリ システムを使用する場合は、複数の OpenCL メモリ バンク ディバイダを作成する必要があります。 XNUMX つの DDR メモリ インターフェイスと XNUMX つの QDR メモリ インターフェイスを持つシステムを考えてみましょう。 XNUMX つのバンクは異なるメモリ トポロジを持っているため、これらを XNUMX つのグローバル メモリに結合することはできません。
図 1. XNUMX バンクの異種メモリ システムのブロック図
この異種メモリ システムには、XNUMX つの DDR メモリ インターフェイスと XNUMX つの QDR メモリ インターフェイスが含まれています。intel OpenCL カスタム プラットフォーム用の FPGA SDK での異種メモリ システムの作成 - 図 1インテル Quartus® Prime ソフトウェアのバージョン 16.0、16.0.1、または 16.0.2 と OpenCL 用アルテラ SDK を使用している場合、OpenCL メモリー・バンク・ディバイダーはアドレス境界を越えたメモリー・バーストを誤って処理します。 この既知の問題を回避するには、バースト サイズ 1 のパイプライン ブリッジを追加し、その Avalon ®Memory-Mapped (Avalon-MM) マスターを OpenCL Memory Bank Divider のスレーブ ポートに接続します。
注記:
この既知の問題は、 インテル Quartus Prime ソフトウェアおよびインテル FPGA SDK for OpenCL バージョン 16.1 で修正されています。
図 2. パイプライン ブリッジを備えた XNUMX バンクの異種メモリ システムのブロック図 intel OpenCL カスタム プラットフォーム用の FPGA SDK での異種メモリ システムの作成 - 図 21.4. 異種メモリ ソリューションのボードテスト プログラムとホスト コードの変更
インテル FPGA SDK for OpenCL カスタム・プラットフォーム・ツールキットに付属するboardtest.cl カーネルを使用して、カスタム・プラットフォームの機能とパフォーマンスをテストします。
ボードテスト プログラムは、ホストからデバイスへの帯域幅、メモリ帯域幅、およびカスタム プラットフォームの一般的な機能をテストできる OpenCL カーネルです。

  1. を参照してください/board/custom_platform_toolkit/tests/boardtest ディレクトリ。
  2. ボードテスト.clを開きます file テキスト エディタで、各グローバル メモリ引数にバッファの場所を割り当てます。
    例えばamp上:
    __カーネルボイド
    mem_stream (__global__attribute__((buffer_location(“DDR”))) uint *src, __global __attribute__((buffer_location(“QDR”))) uint *dst, uint arg, uint arg2)
    ここで、uint *src は DDR メモリに割り当てられ、uint *dst は QDR メモリに割り当てられます。 board_spec.xml file 両方のメモリ システムの特性を指定します。
  3. OpenCL システムで異種メモリ ソリューションを活用するには、clCreateBuffer 呼び出しに CL_MEM_HETEROGENEOUS_INTELFPGA フラグを追加してホスト コードを変更します。
    例えばamp上:
    ddatain = clCreateBuffer(context, CL_MEM_READ_WRITE | memflags
    CL_MEM_HETEROGENEOUS_INTELFPGA, sizeof(unsigned) * VectorSize, NULL, &status);
    インテルでは、バッファーを書き込む前に、カーネル引数としてバッファーの場所を設定することを強くお勧めします。 単一のグローバル メモリを使用する場合、バッファをカーネル引数に割り当てる前または割り当てた後に書き込むことができます。 異種メモリ システムでは、ホストはバッファに書き込む前にバッファの場所を設定します。 つまり、ホストは clEnqueueWriteBuffer 関数を呼び出す前に clSetKernelArgument 関数を呼び出します。
    ホスト コードで、clCreateBuffer、clSetKernelArg、および clEnqueueWriteBuffer 呼び出しを次の順序で呼び出します。
    ddatain = clCreateBuffer(context, CL_MEM_READ_WRITE | memflags |
    CL_MEM_HETEROGENEOUS_INTELFPGA, sizeof(unsigned) * VectorSize, NULL, &status);
    … status = clSetKernelArg(kernel[k], 0, sizeof(cl_mem), (void*)&ddatain);
    … status = clEnqueueWriteBuffer(queue, ddatain, CL_FALSE, 0, sizeof(unsigned) * VectorSize,hdatain, 0, NULL, NULL);
    ALTERAOCLSDKROOT/board/custom_platform_toolkit/tests/boardtest/host/memspeed.cpp file は、これらの関数呼び出しの同様の順序を示しています。
  4.  boardtest.cl を変更した後 file ホスト コードとカーネル コードをコンパイルし、それらの機能を確認します。
    カーネル コードをコンパイルするときは、-no-interleaving を含めてすべてのメモリ システムのバースト インターリーブを無効にする必要があります。 aocコマンドのオプションです。

関連情報
グローバル メモリのバースト インターリーブの無効化 (-no-interleaving) )

1.5. 異種メモリの機能の検証 システム
異種メモリ システムが正しく機能することを確認するには、ホスト コードで CL_CONTEXT_COMPILER_MODE_INTELFPGA フラグを設定解除します。
同種メモリを備えた OpenCL システムでは、.aocx の読み取りを無効にするには、ホスト コードで CL_CONTEXT_COMPILER_MODE_INTELFPGA=3 フラグを設定する必要があります。 file そしてFPGAの再プログラミング。 CL_CONTEXT_COMPILER_MODE_INTELFPGA=3 フラグを設定すると、フロアプランを設計したり LogicLock™ 領域を指定したりせずに、ボードをインスタンス化してカスタム プラットフォームの機能を検証するときに役立ちます。
異種メモリ システムでは、ランタイム環境は、.aocx ファイルに記述されている各バッファのバッファ位置を読み取る必要があります。 file、メモリシステムの機能を確認します。 ただし、フロアプランの設計や LogicLock 領域の指定など、ボード設計の最終機能を実装せずに、カスタム プラットフォームの機能を検証したい場合があります。

  1. ホスト コードで CL_CONTEXT_COMPILER_MODE_INTELFPGA フラグが設定されていないことを確認します。
  2. ボードを参照/ カスタム プラットフォームの /source/host/mmd ディレクトリ。
  3. acl_pcie_device.cpp メモリマップドデバイス (MMD) を開きます。 file テキストエディタで。
  4.  acl_pcie_device.cpp の再プログラム関数を変更します。 file return 0 を追加することで; 以下に示すように、行:
    int ACL_PCIE_DEVICE::reprogram(void *data, size_t data_size)
    {
    0を返します。
    // 失敗を仮定します
    int reprogram_failed = 1;
    // fpga.bin に rbf またはハッシュがないと仮定します
    int rbf_or_hash_not_provided = 1;
    // ベース ハッシュとインポート リビジョン ハッシュが一致しないと仮定します
    int hash_mismatch = 1;

    }
  5. acl_pcie_device.cpp を再コンパイルします file.
  6. CL_CONTEXT_COMPILER_MODE_INTELFPGA フラグが設定されていないことを確認します。
    注意: 追加した後は 0 を返します。 再プログラム機能を追加し、MMD を再コンパイルします。 file、ランタイム環境は .aocx を読み取ります。 file バッファの位置を割り当てますが、FPGA は再プログラムされません。 FPGA イメージと .aocx を手動で一致させる必要があります。 file。 この動作を元に戻すには、return 0 を削除します。 再プログラム機能からMMDを再コンパイルします。 file.

1.6.ドキュメントの改訂履歴

日付 バージョン 変更点
17月XNUMX日 2017.12.01 • CL_MEM_HETEROGENEOUS_ALTERA を CL_MEM_HETEROGENEOUS_INTELFPGA にブランド変更しました。
16月XNUMX日 2016.12.13 • CL_CONTEXT_COMPILER_MODE_ALTERA を CL_CONTEXT_COMPILER_MODE_INTELFPGA にブランド変更しました。

インテル - ロゴインテル® FPGA SDK for OpenCL での異種メモリー・システムの作成
カスタムプラットフォーム
intel OpenCL カスタム プラットフォーム用の FPGA SDK での異種メモリ システムの作成 - アイコン 1 フィードバックを送信
intel OpenCL カスタム プラットフォーム用の FPGA SDK での異種メモリ システムの作成 - アイコン オンライン版
intel OpenCL カスタム プラットフォーム用の FPGA SDK での異種メモリ システムの作成 - アイコン 1 フィードバックを送信
ID: 683654
バージョン: 2016.12.13

ドキュメント / リソース

intel OpenCL カスタム プラットフォーム用の FPGA SDK での異種メモリ システムの作成 [pdf] 説明書
OpenCL カスタム プラットフォーム用 FPGA SDK でのヘテロジニアス メモリ システムの作成, ヘテロジニアス メモリ システムの作成, OpenCL カスタム プラットフォーム用 FPGA SDK

参考文献

コメントを残す

あなたのメールアドレスは公開されません。 必須項目はマークされています *