言葉は厳密に定義される必要がある.
ハードウェアの演算能力を測るときによく使われる言葉がレイテンシとスループットだ. じゃあ「実際にスループットとレイテンシはどれくらいですか?」となるとちょっと戸惑うだろう. 自分でもときおり意味が曖昧なのでメモしておく.
以下ではほとんど『Advanced FPGA Design』[1]による.
例として『Advanced FPGA Design』のp.2にあるソースコードを挙げる. ここではx3をFPGAに実装する場合について議論されている. 以下がそのソースコードだ.
/* | |
* This code is based on "Advanced FPGA Design"(p.2) | |
*/ | |
module power3( | |
output [7:0] XPower, | |
output finished, | |
input [7:0] X, | |
input clk, start); // the duration of start is a single clock | |
reg [7:0] ncount; | |
reg [7:0] XPower; | |
assign finished = (ncount == 0); | |
always@(posedge clk) | |
if(start) begin | |
XPower <= X; | |
ncount <= 2; | |
end | |
else if(!finished) begin | |
ncount <= ncount - 1; | |
XPower <= XPower * X; | |
end | |
endmodule |
これの波形は以下のようになる(たぶん).
X[7:0]
に2
を代入してその3乗である8
が得られるまで3クロック(CLK)だけかかっている. またfinished
が0
の間, 入力X[7:0]
は同じ値でなければならない. よってスループットとレイテンシは
スループット[data/CLK] | レイテンシ[CLK] |
---|---|
1/3 | 3 |
である.
これに入力されたデータのレジスタを用意すると入力データはクロック毎に入力することができる.
/* | |
* This code is based on "Advanced FPGA Design"(p.3) | |
*/ | |
module power3( | |
output reg [7:0] XPower, | |
input clk, | |
input [7:0] X | |
); | |
reg [7:0] XPower1, XPower2; | |
reg [7:0] X1, X2; | |
always @(posedge clk) begin | |
// Pipeline stage 1 | |
X1 <= X; | |
XPower1 <= X; | |
// Pipeline stage 2 | |
X2 <= X1; | |
XPower2 <= XPower1 * X1; | |
// Pipeline stage 3 | |
XPower <= XPower2 * X2; | |
end | |
endmodule |
この波形は以下のようになる.
この回路では入力X[7:0]
に対して出力は3CLKだけかかっており先の回路とは変わらないが, クロック毎の入力データの変化に対して同一の速さで出力が変化している. よってスループットとレイテンシは
スループット[data/CLK] | レイテンシ[CLK] |
---|---|
1 | 3 |
である. このようにスループットとレイテンシは単に反比例する関係ではない. 処理の並列化によって大きく変化する.
つまりスループットは入力データの変化に対する出力データの応答の速さ. レイテンシはある入力データが出力データに反映されるまでの時間である. スループットを一言で表してもあまりピンとこないが, 上記のように入力と出力の平均的な動きを意味している.
参考
[1] Advanced FPGA Design: Architecture, Implementation, and Optimization, Steve Kilts, 2007, John Wiley & Sons, Inc.
0 件のコメント:
コメントを投稿