問題タブ [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.
.net - .NETがSIMDに固有ではない数学演算にx87ではなくSIMDを使用するのはなぜですか?
これは何よりも好奇心の問題です。私はこのコードの逆アセンブル(C#、64ビット、リリースモード、VS 2012 RC)を見ていました:
...そしてコンパイラがここのログにx87命令を使用していないのは奇妙だとわかりました(Powerはログを使用します)。もちろん、呼び出し場所にどのコードがあるのかはわかりませんが、SIMDにはログ機能がないため、この選択はさらに奇妙になります。さらに、ここでは何も並列化されていないのに、なぜ単純なx87ではなくSIMDなのですか?
控えめに言っても、x87 FYL2X命令が使用されていないのも奇妙だと思いました。これは、コードの最初の行に示されているケースのために特別に設計されたものです。
誰かがこれに光を当てることができますか?
assembly - LLVM で fsincos 命令を呼び出すと、libc sin/cos 関数を呼び出すより遅くなりますか?
私はLLVMでコンパイルされた言語に取り組んでいます。楽しみのために、いくつかのマイクロベンチマークを実行したいと思いました。1 つは、数百万回の sin/cos 計算をループで実行します。擬似コードでは、次のようになります。
LLVM IR インライン アセンブリを次の形式で使用して sin/cos を計算している場合:
これは、fsincos の代わりに fsin と fcos を別々に使用するよりも高速です。ただし、少なくとも使用しているターゲット設定 (SSE が有効な x86_64) では、C math lib 関数への呼び出しにコンパイルする組み込み関数と を個別llvm.sin.f64
に呼び出す場合よりも遅くなります。llvm.cos.f64
LLVM は、単精度/倍精度 FP 間の変換を挿入しているようです。これが原因である可能性があります。何故ですか?申し訳ありませんが、私はアセンブリの比較的初心者です:
llvm sin/cos 組み込み関数の呼び出しによる同じテスト:
fsincos で理想的なアセンブリがどのように見えるかを教えてください。PS。-enable-unsafe-fp-math を llc に追加すると、変換が消えて double (fldl など) に切り替わりますが、速度は変わりません。
assembly - Intel x87 レジスタが 80 ビット幅なのはなぜですか?
このような「奇妙な」レジスタ サイズが使用されるのはなぜですか? これらのレジスタに 64 ビットまたは 128 ビットを使用することが好ましくない理由に関するドキュメントはありますか?
performance - fpu を単精度に切り替える
古い fpu では、fpu の数年前に単精度モードに切り替えたときに除算と sqr が通常モードの 2 倍の速さで行われたことを読みました。
(ソースを確認してください http://stereopsis.com/FPU.html)
それでもそうで、そのように切り替えると、いくつかのループが高速化され、内部に多くの浮動小数点コードが作成されますか?
関連する 2 番目の質問、たとえば、システム (winapi) 呼び出しを行うときに、コードで FPU の精度を自由に操作できますか? fpu 丸めモードとシステム側と同じです。
assembly - asm(x87)で配列にlookとputする方法
私にはタスクがあります-関数の6つの結果を計算します(Y =(20 * x)/(5 * x2 – 8,5))x-1から開始し、各計算は4ずつ増加する必要があります(1、5、9 .. )。
私はいくつかのコードを書いていますが、ループを作成してデータを配列に入れる方法を理解していません。すべての操作は asm で行う必要があります - ループして配列に入れます。1 回の反復 - 配列内の 1 つの要素
私のコードがあります:
}
assembly - sin()の合計はasm(x87)になります
y(i) = sin(5*i)
度の合計を計算する必要があります。ここで、i
は反復ごとに増加します。3より大きくなる前に合計を計算し、合計i
がいつ大きくなるかを見つける必要があります。
以下のコードで、無限ループが発生します。
assembly - asm(x87)でループが失敗した理由
asm in loopで計算を行っています。これは、Sumが3になる前でなければなりませんが、ループは常に機能し、終了することはありません。これがmuコードです:
assembly - fpu状態(x87)
現在のfpu状態の一部と見なすことができる値の数(浮動小数点コードの計算が依存する値を意味します)に関する情報を探しています。これは、3モードの精度、4モードの丸め、約5になることを知っています。 fpu例外に関連するビットフラグですが、他に何がありますか?tnx
assembly - 洞はスケーラブルですか?
副鼻腔とは、ここで c stdlib sin() / fpu assembl;y fsin を意味します。
この sinus 引数には、10 進数で約 16 桁以上の精度を与えることができます。たとえば、sin(1.1e-14); です。sin(1.2e-14) 次に結果を取得し、
sinus は、このような小さなデルタではほぼ線形ですが、同じ 16 桁の精度でも計算できるにもかかわらず、そのような小さなデルタでも正確に計算されますか?
(引数と特に出力値の両方でこれほどの精度で計算するのはしばらくの間私にとって少し珍しいように思えたので、私はそれについて尋ねます。
assembly - FFREE および FDECSTP の使用
私はこのことを理解できません: そのようなコマンド (FFREE、FDECSTP) の使用は何ですか? fpuスタックから値をポップするために使用できますか、それとも別の目的のためですか? 私はそれを理解していません:/誰かがそれを説明できますか、tnx