3

私はこのスレッドから来ました:FLOPS IntelコアとCでのテスト(内部積)

簡単なテスト スクリプトを書き始めたとき、いくつかの疑問が頭に浮かびました。

  1. なぜ浮動小数点?考慮しなければならない浮動小数点の重要な点は何ですか? 単純な int ではないのはなぜですか?

  2. FLOPS を測定したい場合、2 つのベクトルの内積を計算しているとします。2 つのベクトルは float[] でなければなりませんか? int[] を使用すると測定値はどのように変化しますか?

  3. 私は Intel アーキテクチャに詳しくありません。次の操作があるとします。

    float a = 3.14159; float b = 3.14158;
    for(int i = 0; i < 100; ++i) {
        a + b;
    }
    

    これはいくつの「浮動小数点演算」ですか?

  4. 単純化された 32 ビット MIPS アーキテクチャを調べたので、少し混乱しています。すべての命令には、オペランド 1 に 5 ビット、オペランド 2 に 5 ビットなどの 32 ビットがあるため、Intel アーキテクチャ (具体的には前のスレッドと同じアーキテクチャ) の場合、レジスタは 128 ビットを保持できると言われました。SINGLE PRECISION 浮動小数点の場合、浮動小数点数ごとに 32 ビットですが、これは、プロセッサに供給される命令ごとに 4 つの浮動小数点数を使用できることを意味しますか? オペランドや命令の他の部分に含まれるビットも考慮する必要があるのではないでしょうか? これに特定の意味を持たずに、どうすれば4つの浮動小数点数をCPUに供給することができますか?

すべてをバラバラに考えるという私のアプローチが理にかなっているのかどうかはわかりません。そうでない場合、視点のどの「高さ」を見ればよいですか?

4

9 に答える 9

4

1.) 浮動小数点演算は、固定幅整数よりも広い範囲の数学を単純に表します。さらに、数値的または科学的なアプリケーション (通常、CPU の純粋な計算能力を実際にテストするアプリケーション) は、おそらく何よりも浮動小数点演算に依存しています。

2.) どちらも float でなければなりません。CPU は整数と浮動小数点数を追加しません。どちらか一方が暗黙的に変換されます (ほとんどの場合、整数は float に変換されます)。そのため、浮動小数点演算のままです。

3.) それは、100 の浮動小数点操作、100 の整数操作、およびいくつか (100?) の制御フロー/分岐/比較操作になります。通常、ロードとストアもありますが、値を保存していないようです:)

4.) これをどうやって始めればよいかわかりません。資料について一般的な見方をしているようですが、詳細の一部を混乱させています。はい、個々の命令は次のようなセクションに分割できます。

|OP CODE | Operand 1 | Operand 2 | (among many, many others)

ただし、オペランド 1 とオペランド 2 には、加算される実際の値が含まれている必要はありません。追加するレジスタのみを含めることができます。たとえば、次の SSE 命令を使用します。

mulps      %%xmm3, %%xmm1

レジスタ xmm3 の内容と xmm1 の内容を乗算し、結果を xmm3 に格納するように実行ユニットに指示しています。レジスタは 128 ビット値を保持するため、128 ビット値で操作を行っています。これは、命令のサイズとは無関係です。残念ながら、x86 は CISC アーキテクチャであるため、MIPS と同様の命令の内訳はありません。x86 命令は、1 から 16 (!) バイトの間のどこにでも持つことができます。

あなたの質問に関しては、これはすべて知っておくととても楽しいことだと思います。これは、数学を多用するプログラムの速度についての直感を構築するのに役立つだけでなく、最適化の際に達成すべき上限の感覚を与えるのにも役立ちます。ただし、実際の最終パフォーマンスには他の要因が多すぎるため、これをプログラムの実際の実行時間と直接関連付けようとはしません。

于 2009-10-09T04:29:05.797 に答える
3
  1. 浮動小数点演算と整数演算は、チップ上で異なるパイプラインを使用するため、異なる速度で実行されます (単純な/十分に古いアーキテクチャでは、ネイティブの浮動小数点サポートがまったくない場合があり、浮動小数点演算が非常に遅くなります)。したがって、浮動小数点演算を使用する問題の実際のパフォーマンスを推定しようとしている場合は、これらの演算がどれだけ高速かを知る必要があります。

  2. はい、浮動小数点データを使用する必要があります。#1を参照してください。

  3. FLOP は通常、モデル化する現実世界の問題を表すことを目的とした、特定の操作の混合に対する平均として定義されます。ループでは、各追加を 1 回の操作としてカウントし、合計 100 回の操作を行います。BUT : これはほとんどの実際のジョブを代表するものではなく、コンパイラがすべての作業を最適化するのを防ぐための措置を講じる必要がある場合があります

  4. ベクトル化または SIMD (Single Instruction Multiple Data) はまさにそれを行うことができます。現在使用されている SIMD システムの例には、AltiVec (PowerPC シリーズ チップ上) および MMX/SSE/... が含まれます。Intel x86 と互換性があります。このようなチップの改善は、より多くの作業を行うことで功績が認められるはずです。そのため、フェッチと作業のサイクルが 25 回しかない場合でも、上記の簡単なループは 100 回の操作としてカウントされます。コンパイラーは非常にスマートである必要があるか、プログラマーから SIMD ユニットを利用するためのヒントを受け取る必要があります (ただし、最近の最前線のコンパイラーのほとんどは非常にスマートです)。

于 2009-10-09T13:16:48.483 に答える
1

1 秒あたりの浮動小数点演算。

http://www.webopedia.com/TERM/F/FLOPS.html

あなたの例は、100 の浮動小数点演算です (2 つの浮動小数点数を一緒に追加すると、1 つの浮動小数点演算になります)。浮動小数点数の割り当ては、カウントされる場合とカウントされない場合があります。

倍精度浮動小数点演算は単精度演算よりも時間がかかり、乗算と除算は加算と減算よりも時間がかかることは明らかであるため、この項は明らかに正確な測定値ではありません。ウィキペディアの記事が証明しているように、最終的にはパフォーマンスを測定するためのより良い方法があります。

于 2009-10-09T04:06:23.917 に答える
0

浮動小数点演算は、特定の計算問題の制限要因です。問題がそれらの 1 つでない場合は、フロップの評価を安全に無視できます。

Intel アーキテクチャは単純な 80 ビット浮動小数点命令から始まりました。この命令は、丸めを使用して 64 ビットのメモリ位置にロードまたはストアできます。その後、128 ビット レジスタを使用し、1 つの命令で複数の浮動小数点演算を実行できるSSE命令を追加しました。

于 2009-10-09T04:13:28.223 に答える
0
  1. 浮動小数点の速度は、科学計算とコンピュータ グラフィックスにとって非常に重要でした。
  2. 定義上、いいえ。その時点で整数のパフォーマンスをテストしています。
  3. 302、以下を参照してください。
  4. x86 と x64 は MIPS とは大きく異なります。RISC (縮小命令セット コンピュータ) アーキテクチャである MIPS は、Intel および AMD の製品の CISC (複雑な命令セット コンピュータ) アーキテクチャと比較して命令がほとんどありません。命令デコードの場合、x86 は可変幅命令を使用するため、命令の長さは 1 ~ 16 バイトです (プレフィックスを含めると、それよりも大きくなる可能性があります)。

128 ビットのことは、プロセッサ内の float の内部表現に関するものです。丸めエラーを回避するために内部で本当にビットの浮動小数点数を使用し、数値をメモリに戻すときにそれらを切り捨てます。

fld  A      //st=[A]
fld  B      //st=[B, A]
Loop:
fld st(1)   //st=[A, B, A]
fadd st(1)  //st=[A + B, B, A]
fstp memory //st=[B, A]
于 2009-10-09T04:14:46.117 に答える
0

うん、単純化されたMIPS。通常、入門コースではこれで問題ありません。ヘネシー/パターソンの本だと思いますか?

Intel アプローチについては、Pentium アーキテクチャの MMX 命令 (586) を参照してください。または、より一般的には、ベクトル プロセッサ アーキテクチャとも呼ばれる SIMD アーキテクチャについて調べます。それらは Cray スーパーコンピューターによって最初に普及しました (ただし、いくつかの先駆者がいたと思います)。最新の SIMD アプローチについては、NVIDIA によって作成された CUDA アプローチまたは市場に出回っているさまざまな DSP プロセッサを参照してください。

于 2009-10-09T04:17:07.240 に答える
0

1) 浮動小数点数は重要です。なぜなら、非常に大きな数や非常に小さな数を表現したい場合があり、整数はそれにはあまり適していないからです。IEEE-754 規格を読んでください。ただし、仮数部は整数部分に似ており、一部のビットを指数として使用するために交換します。これにより、はるかに広い範囲の数値を表すことができます。

2) 2 つのベクトルが int の場合、FLOPS は測定されません。1 つのベクトルが int で別のベクトルが float の場合、多くの int->float 変換を行うことになり、おそらくそのような変換を FLOP と見なす必要があります。

3/4) Intel アーキテクチャでの浮動小数点演算は、非常に風変わりです。実際には、スタックベースの単一オペランドの命令セットです (通常)。たとえば、あなたの例では、メモリ オペランドを FPU スタックの一番上にロードするオペコードで 1 つの命令を使用し、FPU スタックの一番上にメモリ オペランドを追加するオペコードで別の命令を使用します。 、そして最後に、FPUスタックのトップをメモリオペランドにポップするオペコードを持つ別の命令。

このWebサイトには、多くの操作がリストされています。

http://www.website.masmforum.com/tutorials/fptute/appen1.htm

本当に興味があるなら、インテルは実際のオペコードをどこかに公開していると確信しています。

于 2009-10-14T05:18:43.127 に答える
0

1) 多くの現実世界のアプリケーションは多くの浮動小数点数を処理して実行されるため、たとえば、すべてのベクトル ベースのアプリ (ゲーム、CAD など) はほぼ完全に浮動小数点演算に依存しています。

2) FLOPS は浮動小数点演算用です。

3) 100. フロー制御は整数演算を使用します

4) そのアーキテクチャは ALU に最適です。浮動小数点表現では、96 ~ 128 ビットを使用できます。

于 2009-10-09T04:08:56.663 に答える
0
  1. 浮動小数点演算が整数演算よりもはるかに優れていることがたくさんあります。ほとんどの大学のコンピュータ サイエンスのカリキュラムには、「数値解析」と呼ばれるコースがあります。

  2. ベクトル要素は、float、double、または long double でなければなりません。内積の計算は、要素が int の場合よりも遅くなります。

  3. それは 100 個の浮動小数点加算になります。(つまり、コンパイラが結果に対して何も行われず、すべてを最適化しないことに気付いた場合を除きます。)

  4. コンピュータは、さまざまな内部形式を使用して浮動小数点数を表します。あなたが言及した例では、CPUは数値の操作を行う前に、32ビットの浮動小数点数を内部の128ビット形式に変換します。

他の回答が言及した用途に加えて、「クオンツ」と呼ばれる人々は最近、金融に浮動小数点演算を使用しています。David E. Shaw という名前の男は、1988 年にウォール街のモデリングに浮動小数点演算を適用し始めました。

したがって、浮動小数点演算について少し学ぶ価値があります。

于 2009-10-09T05:13:19.077 に答える