インテル® FPGA SDK for OpenCL™プロ・エディション: プログラミング・ガイド

ID 683846
日付 4/01/2019
Public
ドキュメント目次

5.10. レジスターの推論

インテル® FPGA SDK for OpenCL™オフライン・コンパイラーでは、プライベート・アドレス空間のデータをレジスターまたはブロックRAMに実装することが可能です。 変数へのアクセスが固定されており、動的インデックスを必要としない場合、オフライン・コンパイラーは通常レジスターを選択します。 可変インデックスで配列にアクセスすると、配列は通常ブロックRAMに実装されます。プライベート・データをレジスターとして実装することは、単一のサイクルで発生する必要があるデータのアクセス (例えば、単一ワークアイテムのループでのフィードバックなど) に有効です。

オフライン・コンパイラーは、プライベート配列を単一の値のレジスター、または区分的なレジスターとして推論します。区分的な実装は非常に効率的なハードウェアをもたらしますが、オフライン・コンパイラーがデータのアクセスを静的に決定できなければなりません。区分的な実装を容易にするために、アクセスポイントを配列にハードコードします。また、配列にアクセスするループを展開することで、レジスターの推論を容易にすることもできます。

配列のアクセスを静的に推論できない場合、オフライン・コンパイラーは配列をレジスターとして推論する場合があります。ただしオフライン・コンパイラーは、単一のワークアイテム・カーネルに対し、それらの配列のサイズを64バイトに制限します。複数のワークアイテムを有するカーネルには実質的にサイズ制限はありません。

次のコードを例に示します。

int array[SIZE];
for (int j = 0; j < N; ++j)
{
    for (int i = 0; i < SIZE - 1; ++i)
    {
        array[i] = array[i + 1];
    }
}

array[i]へのインデックスは、ループが展開されていないため静的に推論することができません。array[SIZE]のサイズが、単一ワークアイテム・カーネルにおいて64バイト以下である場合、オフライン・コンパイラーはarray[SIZE]を単一の値としてレジスターに実装します。array[SIZE]のサイズが、単一ワークアイテム・カーネルにおいて64バイトより大きい場合、オフライン・コンパイラーは配列全体をブロックRAMに実装します。複数のワークアイテム・カーネルの場合、サイズが1キロバイト (KB) 未満である限り、オフライン・コンパイラーは単一の値としてarray[SIZE]をレジスターに実装します。