問題タブ [x87]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - x87 FP スタックはまだ関連していますか?
double
演算が使用されるたびに、コンパイラが SIMD レジスタを対象とするコードを生成することに気付きました。これは、最適化されていないコードと最適化されたコードに適用されます。これは、x87 FP ユニットが廃止され、下位互換性のためにのみ存在すると見なすことができるということですか?
また、他の「人気のある」プラットフォームも、スタックとして設計された FP ではなく、それぞれの SIMD 実装に依存していることに気付きました。
また、SIMD 実装は少なくとも 128 ビット幅になる傾向があるため、演算の (内部) 精度は x87 FP ユニットよりも高いということでしょうか?
SIMD がベクトル実行を念頭に置いて考えられていることを考えると、パフォーマンス、スループット、およびレイテンシーについても疑問に思うので、スカラーをどのように処理するのだろうか。
assembly - 80x87 命令セットが「スタックベース」の設計を使用するのはなぜですか?
Intel が最初に 8087 を設計したとき、なぜ彼らは浮動小数点レジスタをスタックとして編成することを選択したのでしょうか? そのような設計からどのような利点が得られるでしょうか? 任意のレジスタをソースオペランドおよびデスティネーションオペランドとして使用できるようにするよりも、柔軟性が低く、操作が難しいようです。
c - アセンブリ関数の浮動小数点リターンへのアクセス
私たちのコース演習では、GNU アセンブリで delta = b2 - 4ac 関数を作成し、C からアクセスするように求められます。これはコンパイラに関するコースであり、アセンブリに関するコースではないため、教授は整数機能のみを示すことを選択し、整数を期待しています。関数。
しかし、私は個人的な学習が義務の要求を少し超えて、整数ではなく浮動小数点を返す使用可能な関数を作成したいと考えています.
私はこのCを思いつきました(グローバルを気にしないでください。次の演習の目的は、パラメーターを使用して適切な関数を作成することです):
そしてこのGNU GAS:
Google から、浮動小数点スタックの一番上に浮動小数点の結果を残す必要があると信じるようになりましたが、これは機能せず、C 呼び出し元に出力される結果は常に 0.0000000 です。
私は非常に小さな何かを見逃す必要がありますが、グーグルでそれを表示する量はありません.誰かが私を正しい方向に向けることができますか? ご清聴ありがとうございました。
delphi - SSE: FPU よりも SSE の方が質量整数変換 + 乗算が遅い?
私は非常に頻繁に 6 から 8 の符号付き 32 ビット整数を 32 ビット実数に変換する必要があるアプリケーションに取り組んでいます。Delphi コードをカスタム アセンブラー コードに置き換えたところ、非常に驚いたことに、FPU 変換は常に高速で、一部のコンピューターでは SSE 変換よりもかなり高速です。これを示すコードを次に示します。
変換中に再スケーリング (つまり乗算) が必要なため、そこに 1 つ含まれています。使用した値はランダムに選んだものですが、どの値を使用しても結果は同じでした。また、FPU と SSE の丸めにはごくわずかな違いがありますが、この場合は問題になりません。
しかし、そのコードを実行すると、FPU パスが SSE パスより遅くなることはなく、意味がないことがわかります。何が起こっているのか誰にも分かりますか?
編集:アセンブラーでループを使用した別のソース コードを次に示します。結果は本当に興味深いものです。インクリメント命令がコメントアウトされている場合、SSE バージョンは FPU バージョンよりもかなり高速ですが、インクリメント命令が含まれている場合は、ほぼ同じ速度になります。
delphi - FSIN/FCOS の結果を単位円内に収める
与えられた角度の理想的な世界では、アイデンティティ FSIN * FSIN + FCOS * FCOS = 1 が常に成り立ちますが、浮動小数点数の制限により、完全には成り立ちません。たとえば、小さな値 (単一の 0x2F800001 など) を FCOS に渡すと結果は 1 になりますが、FSIN はゼロより大きい結果を返します。したがって、この場合は FSIN * FSIN + FCOS * FCOS > 1 になります。
私が取り組んでいる現在のアプリケーションでは、これは受け入れられませんが、受け入れられるのは FSIN * FSIN + FCOS * FCOS <= 1 の場合です。悲しいことに、ゼロ FPU 丸めモードへの丸めでも、上記の結果が引き続き発生するため、何かを行う必要があります。
このソリューションのパフォーマンスはかなり低いため、次のように FSIN または FCOS を再定義するよりも高速なソリューションを誰かが持っているかどうか疑問に思っています: FSIN = sqrt(1- FCOS * FCOS ) 。
クライアントを満足させるために外部ライブラリを使用したくないので、アセンブラまたはデルファイのいずれかのソリューションが必要です(クライアントはデルファイ2009を使用しています)。
編集:
これは、FSIN * FSIN + FCOS * FCOS <= 1 で、すべての有効な角度に対して切り捨てフラグを設定した場合とまったく同じように機能します。したがって、明日仕事に戻ると、トレースしてクライアントのコンパイラが丸めモードをリセットする場所を見つけるか、計算のアセンブラ バージョンを作成する必要があるようです。