インテルのみ表示可能 — GUID: rxr1533827311846
Ixiasoft
1.9.6. フラクタル合成の最適化
フラクタル合成は、演算集約型デザインに最適な方法でFPGAリソースを使用する複数の合成最適化の集合です。この合成最適化を構成しているのは、乗算器の正則化とリタイミング、および連続算術パッキングです。最適化の対象となるデザインでは、低精度の算術演算 (加算や乗算など) を多数備えています。フラクタル合成のイネーブルは、グローバルに、または特定の乗算器に対して行います。詳しくは、フラクタル合成のイネーブルとディスエーブル で説明します。
プロジェクト全体のフラクタル合成に関する考慮事項
- インテルFPGAデバイスでは、算術演算に最適なハードDSPブロックを数千個格納しています。デザインの算術関数の合計数が少ない場合は、フラクタル合成をイネーブルする必要はありません。このような場合、すべての算術関数はデフォルトでDSPに直接マップされます。グローバルフラクタル合成をイネーブルするのは、DSPブロックが十分ないために、実装できない算術コンポーネントがある場合のみです。フラクタル合成のイネーブルは、CompilerによるDSPへのマッピングを望まないモジュールに対してのみ行います。
- 現在のバージョンの インテル® Quartus® Primeプロ・エディション開発ソフトウェアの場合、フラクタル合成の最適化のターゲットは、低精度の乗算です。高精度 (各オペランドの幅が11ビットを超える) 乗算器の実装には、DSPブロックを使用します。
- フラクタル合成をプロジェクト全体でイネーブルすると、次のような情報メッセージ番号20193が、コンパイル中に生成されることがあります
Applied dense packing to "<entity>". Area: 2 LABs. Logic density: 0.775.
この情報によって分かるのは、Compilerでは、計算ロジックをパッキングして少数のLABにしようとしていることです。デザインの使用率がすでに高い場合、Compilerでは、このステージを省略できます。
- メッセージによるレポートで、Areaが100 LABを超えていないことを確認してください。もし100 LABを超えている場合は、フラクタル合成ブロックをサブブロックに分割し、フラクタル合成最適化をサブブロックに個別に割り当てます。
- メッセージによるレポートで、Logic密度が0.75より大きいことを確認してください。もし0.75未満の場合は、このエンティティーのFractal Synthesisをディスエーブルします。これは、標準的な合成では、より良好な密度が達成できるためです。
Area (LAB) | |||
---|---|---|---|
デバイス | ドット積 | フラクタル合成がONの場合 | フラクタル合成がOFFの場合 |
インテル® Arria® 10および インテル® Cyclone® 10 GX | 16 4x4smの合計 | 12 | 19 |
16 5x5smの合計 | 19 | 32 | |
16 6x6smの合計 | 25 | 36 | |
16 7x7smの合計 | 34 | 44 | |
16 8x8smの合計 | 45 | 60 | |
インテル® Stratix® 10および インテル® Agilex™ デバイス | 16 4x4smの合計 | 15 | 22 |
16 5x5smの合計 | 21 | 39 | |
16 6x6smの合計 | 29 | 47 | |
16 7x7smの合計 | 39 | 55 | |
16 8x8smの合計 | 55 | 71 |
乗算器の正則化とリタイミング
乗算器の正則化とリタイミングでは、高度に最適化されたソフト乗算器の実装を推論します。Compilerでは、必要に応じて、後方リタイミングを2つ以上のパイプライン・ステージに適用します。フラクタル合成をイネーブルすると、Compilerでは、乗算器の正規化とリタイミングを、符号ありおよび符号なし乗算器に対して適用します。
- 乗算器の正規化では、ロジックリソースのみを使用し、DSPブロックは使用しません。
- 乗算器の正規化とリタイミングは、FRACTAL_SYNTHESIS QSF 割り当てが設定されているモジュールの符号あり乗算器と符号なし乗算器の両方に適用されます。
乗算器の正則化の例
次のシンプルな符号なしドット積のデザイン例には、5ビットオペランドの乗算演算子が含まれています。この短い乗数は、乗算器の正則化に最適な候補です。
(* altera_attribute = "-name FRACTAL_SYNTHESIS ON" *)
module dot_product(
input clk,
input [4:0] a, b, c, d, e, f, g, h,
output reg [11:0] out
);
reg [9:0] ab, cd, ef, gh;
reg [10:0] ab_cd, ef_gh;
always @(posedge clk)
begin
ab <= a * b;
cd <= c * d;
ef <= e * f;
gh <= g * h;
ab_cd <= ab + cd;
ef_gh <= ef + gh;
out <= ab_cd + ef_gh;
end
endmodule
module top(
input clk,
input [4:0] a1, b1, c1, d1, e1, f1, g1, h1,
input [4:0] a2, b2, c2, d2, e2, f2, g2, h2,
output [11:0] out1, out2
);
dot_product core1(.clk(clk), .a(a1), .b(b1), .c(c1), .d(d1),
.e(e1), .f(f1), .g(g1), .h(h1), .out(out1));
dot_product core2(.clk(clk), .a(a2), .b(b2), .c(c2), .d(d2),
.e(e2), .f(f2), .g(g2), .h(h2), .out(out2));
endmodule
インテル® Quartus® Prime合成では、次のメッセージをコンソールに出力します。
Chip Plannerでは、このデザインに符号なしドット積コアが2つあることが分かります。この2つのコアは、個別に最適化され、配置されます。LABリソースは、次の図に示すように、ほぼ100%最適化されます。
符号付きドット積は、ディープラーニング・アプリケーションでは一般的です。次で示しているのは、符号付きドット積の例です。
(* altera_attribute = "-name FRACTAL_SYNTHESIS ON" *)
module dot_product(
input clk,
input [4:0] a, b, c, d, e, f, g, h,
output reg [11:0] out
);
reg [9:0] ab, cd, ef, gh;
reg [10:0] ab_cd, ef_gh;
always @(posedge clk)
begin
ab <= a * b;
cd <= c * d;
ef <= e * f;
gh <= g * h;
ab_cd <= ab + cd;
ef_gh <= ef + gh;
out <= ab_cd + ef_gh;
end
endmodule
module top(
input clk,
input [4:0] a1, b1, c1, d1, e1, f1, g1, h1,
input [4:0] a2, b2, c2, d2, e2, f2, g2, h2,
output [11:0] out1, out2
);
dot_product core1(.clk(clk), .a(a1), .b(b1), .c(c1), .d(d1),
.e(e1), .f(f1), .g(g1), .h(h1), .out(out1));
dot_product core2(.clk(clk), .a(a2), .b(b2), .c(c2), .d(d2),
.e(e2), .f(f2), .g(g2), .h(h2), .out(out2));
endmodule
インテル® Quartus® Prime合成では、次のメッセージをコンソールに出力します。
Chip Plannerでは、このデザインに符号ありドット積コアが2つあることが分かります。
連続算術パッキング
連続算術パッキングでは、算術ゲートを最適なサイズのロジックブロックに再合成して、インテルFPGA LABにフィットさせます。この最適化により、LABリソースを最大100%、算術ブロックに対して使用できるようになります。
フラクタル合成をイネーブルすると、Compilerでは、この最適化をすべてのキャリーチェーンおよび2入力ロジックゲートに適用します。この最適化では、加算器ツリー、乗算器、およびその他の算術関連ロジックのパッキングができます。
連続算術パッキングは、乗算器の正則化とは無関係に機能します。したがって、使用している乗算器が正則化されていない場合 (独自の乗算器の作成など)、連続算術パッキングは引き続き機能します。