本Computer Systems: A Programmer's Perspectiveの演習 5.5 は、多項式の値を計算するためのコードを示しています。
double poly(double a[], double x, int degree)
{
long int i;
double result = a[0];
double xpwr = x;
for (i = 1; i <= degree; i++) {
result += a[i] * xpwr;
xpwr = x * xpwr;
}
return result;
}
この演習では、倍精度浮動小数点の加算と乗算に必要なクロック サイクルがそれぞれ 3 と 5 であると想定しています。読者は、測定された CPE (Cycles Per Element) 値が 5 である理由を説明するよう求められます。
演習の答えによると、反復ごとに変数xpwr
とを更新するresult
必要があり、必要な操作は浮動小数点加算 ( の場合result
) と浮動小数点乗算 ( の場合xpwr
) であるため、後者がレイテンシを支配し、最終的な CPE は 5 です。
しかし、データフローは次のようにする必要があると思います。
xpwr result
| |
+-----+ +--[load] |
| | | |
[mul] [mul] |
| | |
| +---+ +-----+
| | |
| [add]
| |
| +------+
| |
xpwr result
したがって、最長パスは の前の値xpwr
から の新しい値までであり、実行ユニットおよびresult
を通過します。したがって、最長時間は 8 サイクルです。[mul]
[add]
聞きたい
- クリティカル パスの正確な意味は何ですか? そして、それをどのように決定するのですか?
- どちらの答え(私のものと本)がより合理的ですか?
CPU、アーキテクチャ、実行ユニット、パイプライン、浮動小数点ユニットに関する説明をいただければ幸いです。