Intel® FPGA SDK for OpenCL™: ベスト・プラクティス・ガイド

ID 683521
日付 12/08/2017
Public
ドキュメント目次

7.4. ローカルメモリーのバンキングによるカーネル・パフォーマンスの向上

numbanks( Nおよびbankwidth( Mの高度なカーネル属性を指定すると、並列メモリーアクセス用にローカル・メモリー・バンクを構成できます。 これらの高度なカーネル属性によって記述されたバンキングジオメトリは、カーネルがローカル・メモリー・システムのどの要素を並列にアクセスできるかを決定します。

次のコード例は、単一のバンクに実装された8 x 4ローカル・メモリー・システムを示しています。その結果、システム内の2つの要素に並列にアクセスすることはできません。

local int lmem[8][4]; #pragma unroll for(int i = 0; i<4; i+=2) { lmem[i][x] =; }
図 80. 8 x 4ローカル・メモリー・システムへのシリアルアクセス

パフォーマンスを向上させるために、 numbanks( Nbankwidth( Mをコードに追加して、メモリーバンクの数とバンク幅をバイト単位で定義することができます。次のコードは、それぞれ16バイト幅の8つのメモリーバンクを実装しています。このメモリーバンク構成により、8×4アレイのパラレルメモリーアクセスが可能になります。

local int __attribute__((numbanks(8), bankwidth(16))) lmem[8][4]; #pragma unroll for (int i = 0; i < 4; i+=2) { lmem[i][x & 0x3] =; }
重要:

パラレルアクセスをイネーブルするには、下位の配列インデックスの動的アクセスをマスクする必要があります。下位の配列インデックスに動的アクセスをマスクすると、 Intel® FPGA SDK for OpenCL™オフライン・コンパイラー xはインデックスの下限を超えません。

図 81. 16バイト幅の8つのメモリーバンクを備えた8×4ローカル・メモリー・システムへの並列アクセス

numbanks( Nおよびbankwidth( Mカーネル属性に異なる値を指定することで、パラレル・アクセス・パターンを変更できます。次のコードは、それぞれ4バイト幅の4つのメモリーバンクを実装しています。このメモリーバンク構成は、8×4アレイ全体にわたる並列メモリーアクセスをイネーブルします。

local int __attribute__((numbanks(4), bankwidth(4))) lmem[8][4]; #pragma unroll for (int i = 0; i < 4; i+=2) { lmem[x][i] =; }
図 82. 4つの4バイト幅のメモリーバンクを備えた8×4ローカル・メモリー・システムへの並列アクセス