インテルのみ表示可能 — GUID: mwh1391807508964
Ixiasoft
7. メモリーアクセス効率向上のための戦略
メモリーアクセス効率は、しばしばOpenCL™カーネルの全体的なパフォーマンスを左右します。 OpenCLコードを開発する際には、グローバル・メモリー・アクセスの回数を最小限に抑えることが有効です。 OpenCL仕様バージョン1.0では、 globalメモリー、 constantメモリー、 localメモリー、およびprivateメモリーの4種類のメモリータイプが記述されています。
相互接続トポロジーは、共有されたグローバル、定数、およびローカル・メモリー・システムをそれらの基礎となるメモリーに接続します。相互接続はメモリーポートへのアクセスアービトレーションを含みます。
メモリーアクセスは、共有メモリーリソース(つまり、グローバル、ローカル、および定数メモリー)を競合します。 OpenCLカーネルが多数のメモリーアクセスを実行する場合、 Intel® FPGA SDK for OpenCL™オフライン・コンパイラーはメモリーアクセス要求を処理するための複雑なアービトレーション・ロジックを生成する必要があります。複雑なアービトレーションロジックにより、最大動作周波数(f max )が低下し、カーネルの性能が低下する可能性があります。
以下のセクションでは、メモリーアクセスの最適化について詳しく説明します。要約すると、グローバル・メモリー・アクセスを最小限にすることは、以下の理由から有益である。
- 一般に、OpenCLカーネルのパフォーマンスが向上すると、グローバルメモリー帯域幅要件が増加します。
- グローバルメモリーの最大帯域幅は、最大ローカルメモリー帯域幅よりもずっと小さくなります。
- FPGAの最大計算帯域幅は、グローバルメモリー帯域幅よりもはるかに大きくなります。
重要: 可能であれば、ローカル、プライベート、または定数メモリーを使用して、カーネルのメモリー帯域幅を増やしてください。
- メモリーアクセスの最適化に関する一般的なガイドライン
OpenCL™カーネルのメモリーアクセスを最適化すると、カーネル全体のパフォーマンスが向上します。 - グローバル・メモリー・アクセスの最適化
オフライン・コンパイラーは、グローバルメモリーを各外部メモリーバンクにインターリーブします。 - 定数、ローカルまたはプライベート・メモリーを使用したカーネル計算の実行
メモリーアクセス効率を最適化するには、 OpenCL™カーネルの計算を定数メモリー、ローカルメモリー、またはプライベート・メモリーで実行することによって、グローバル・メモリー・アクセスの数を最小限に抑えます。 - ローカルメモリーのバンキングによるカーネル・パフォーマンスの向上
numbanks( N )およびbankwidth( M )の高度なカーネル属性を指定すると、並列メモリーアクセス用にローカル・メモリー・バンクを構成できます。 - メモリー・レプリケーションファクタの制御によるローカルメモリーへのアクセスの最適化
メモリー複製因子を制御するには、お使いのOpenCLカーネル™のsinglepumpまたはdoublepumpカーネル属性が含まれます。 - ループパイプラインのメモリー依存性の最小化
インテル® FPGA SDK for OpenCL™ Offline Compiler は、同じスレッドからのメモリーアクセスがプログラムの命令に従うことを保証します。 NDRangeカーネルをコンパイルするときは、障壁を使用して同じワークグループ内のスレッド間でメモリーアクセスを同期させます。