2

専用ハードウェアと固定ハードウェアでの浮動小数点演算の速さに興味があります。

固定小数点では、数値 555 があり、1.54 を掛けたいとします。値 555、154、および 100 をレジスタにロードし (3 クロック)、555 を 154 で乗算し (4 クロック)、100 で割ります。 (4 クロック)、出力レジスタをメモリにロードします (1 クロック)。

浮動小数点では、値 555 と 1.54 をレジスタにロードし (2 クロック)、より大きなスケーリング/指数を取得し (1 クロック)、スケーリングを減算し​​ (1 クロック)、1 を正規化し (乗算の場合は 4 クロック)、乗算します。 (4 クロック)、出力レジスタをメモリに保存します (1 クロック)。

固定で 12 クロック、フローティングで 13 クロック。それで、私は何かが欠けていて、本当のパフォーマンス上の利点がありますか、それとも使いやすさだけですか? 乗算に 4 つのクロックを使用しました。明らかに、すべてのプロセッサで同じになるわけではありませんが、一般的なアイデアが得られます。

4

2 に答える 2

1

固定小数点数 1.54 を使用すると、適切な形式で既に格納されます。次に、整数の乗算に続いて、丸め誤差を補正するための定数の加算と、基数を正しくするためのふるい分けを行う必要があります。Wikipedia:Q 数値形式を参照してください。

たとえば、Q15.16 形式 (整数部に 15 ビット、小数部に 16 ビット) を想定すると、次のように乗算を実行できます。

int32_t a = 555 * (1 << 16);  /* constant */
int32_t b = 1.54 * (1 << 16); /* constant, no calculations needed at run time */

int64_t temp = ((((int64_t) a) * b) + (1 << 15)) >> 16;
int32_t result = (int32_t) temp;

除算やその他の計算は必要ありません(外部から入力を読み取る必要がない限り) 1.54b想定される CPU の 2 つのロード、倍精度乗算、定数による加算 (一度に多くの乗算を実行する場合は既にレジスタにある)、およびシフトを使用します。

専用ハードウェア (DSP コアや命令拡張など)を使用Qn.mすると、ベクトル化された方法で直接サポートされるタイプもあります。高レベルの CPU (最新の Intel または AMD) では、浮動小数点命令はすでに非常に効率的であるため、固定小数点を使用する利点はおそらくそれほどないと思います。

于 2012-12-25T07:36:27.520 に答える
1

最新のプロセッサでは、個々の命令のパフォーマンスを調べることはあまり役に立ちません。多くはパイプライン化され、スーパースカラーであるため、複数の命令がさまざまな段階で同時に実行されます。

プロセッサの仕様とコードからパフォーマンスを計算することは非常に困難です。通常、まだ存在しないプロセッサのパフォーマンスを見積もるためにのみ行います。プロセッサとコードの両方が存在する場合、測定ははるかに簡単です。

于 2012-12-25T09:49:30.290 に答える