問題タブ [fpu]
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.
iphone - iPhone4およびiPad2:浮動小数点に対する固定小数点演算の利点
iPhone 4とiPadにはVFPと呼ばれるfpuがあり、浮動小数点演算を何らかの方法で最適化し、SIMDを許可していると聞きました(GCCがそれを利用するかどうかは疑わしいですが)。ただし、一部のAndroidデバイスでは、浮動小数点よりも固定小数点を使用する速度を上げると、パフォーマンスが20倍向上する可能性があることを読みました。
これらのデバイスで浮動小数点よりも固定小数点演算を使用して、コードの浮動小数点を多用する部分を実装することの利点は何でしょうか。
x86 - インラインx86を介して関数にdoubleを渡す
私は決してアセンブリの専門家ではなく、コードを実行すると次のエラーが発生します。「ランタイムチェックの失敗#0-ESPの値が関数呼び出し全体で適切に保存されませんでした。」
私は現在、CPythonライブラリを使用してCスタイルの関数をPython 3.2にバインドする作業を行っていますが、コードでdoubleを渡す際に問題が発生しました。そのようにプロトタイプ化されたC関数を呼び出すために使用される単一のテンプレート関数があります。
現在、私のメソッドはPythonとC / C ++の間で整数型を渡すために機能しますが、doubleで問題が発生しています。たぶん、x86アセンブリに精通している人が、私が間違っていることに気付くことができます。スニペットにdoubleを含まないすべてのコードを抽出しました。
私が使用した次の関数についての説明は、誰にとっても明確ではないかもしれません。
上記の関数はすべて、エラーチェックを追加するためにCPythonメソッドの周りに書いたラッパーです。
windows - サードパーティのコードがFPU制御ワードを変更しています
はじめに-長くて退屈な部分
(質問は最後にあります)
FPU制御ワードを変更し続けるサードパーティのCOMコンポーネントでひどい頭痛がします。
私の開発環境はWindowsとVisualC++ 2008です。通常のFPU制御ワードは、さまざまな条件で例外がスローされないように指定しています。_CW_DEFAULT
で見つかったマクロとfloat.h
、起動時にデバッガーで制御ワードを確認することで、これを確認しました。
COMオブジェクトを呼び出すたびに、制御ワードは戻り時に変更されます。これは簡単に防御できます。制御ワードをリセットするだけで、すべて問題ありません。問題は、COMコンポーネントがイベントシンクの呼び出しを開始したときです。イベント呼び出しを受信するとすぐに制御ワードをリセットすることでコードを保護できますが、イベント呼び出しから戻るとすぐに何もできません。
このCOMコンポーネントのソースはありませんが、作成者と連絡を取り合っています。私が彼から受けた反応は「え?」でした。彼は私が話していることについて少しも手がかりを持っていないと思うので、私はこれについて自分で何かをしなければならないのではないかと心配しています。彼のランタイム(DLLはすべて大文字のTで始まるシンボル名でいっぱいなので、DelphiまたはBorland C ++のいずれかだと思います)、または彼が使用している他のサードパーティのコードが問題の原因であると思います。彼のコードがFPU制御ワードを明示的に変更しているとは思いません。
それで、なにかお手伝いできますか?ビジネスの観点からは、このサードパーティコンポーネントを使用することが不可欠です。技術的な観点から、私はそれを捨てて、通信のプロトコルを自分で実装することができました。ただし、このプロトコルにはクレジットカード取引の処理が含まれるため、これは非常にコストがかかります。私たちは責任を負いたくありません。
コンポーネントの作成者に渡すことができる、ハックアラウンド、またはBorland製品のFPU設定に関するいくつかの有用な情報がどうしても必要です。
質問
何かできることはありますか?コンポーネントの作成者は、それを修正するために必要なものを持っていないと思います(彼のかなり無知な応答から判断して)。
私は自分の例外ハンドラーをインストールするというアイデアをいじくり回してきました。このハンドラーでは、ハンドラーの制御ワードをリセットし、Windowsに実行を続行するように指示します。でハンドラーをインストールしてみましSetUnhandledExceptionFilter()
たが、何らかの理由で例外がキャッチされません。
- なぜ例外をキャッチしないのですか?
- FPU例外のキャッチに成功し、FPU制御ワードをリセットし、何も起こらなかったので実行を続行させた場合、すべての賭けは無効になりますか?
アップデート
皆様のご提案に感謝申し上げます。私だけでなく、彼のコードの他の多くのクライアントの生活を楽にするために彼が何ができるかについて、著者に指示を送りました。私は彼に、でFPU制御ワードをサンプリングし、DllMain(DLL_PROCESS_ATTACH)
後で使用するために制御ワードを保存して、イベントハンドラーを呼び出し、呼び出しから戻る前にFPUCWをリセットできるようにすることを提案しました。
今のところ、誰かが興味を持っているなら、私はハックアラウンドを持っています。彼のコードに何が起こるかわからないので、ハックアラウンドは潜在的に悪いものです。彼がコードで浮動小数点数を使用していないという確認を以前に受け取ったので、FPU例外に依存するサードパーティのコードを除いて、これは安全であるはずです。
アプリに加えた2つの変更:
- メッセージポンプをラップする
WH_CALLWNDPROC
メッセージポンプがバイパスされるコーナーケースをキャッチするためにウィンドウフック( )を取り付けます
どちらの場合も、FPUCWが変更されているかどうかを確認します。ある場合は、にリセットし_CW_DEFAULT
ます。
android - ARMv6 デバイスの fpu 命令で Android NDK SIGILL がクラッシュする
APP_ABI=armeabi を使用して ARMv5 CPU をターゲットとする NDK プロジェクトをコンパイルしています。浮動小数点を扱うコードがあり、ローエンドの HTC Wildfire ARMv6 デバイスで実行すると、SIGILL でクラッシュすることがわかりました。
バイナリを逆アセンブルすると、まさにここでクラッシュすることがわかります
APP_ABI=armeabi を指定したときに NDK が fp 命令を生成するのはなぜですか? 明示的なネオン コードではなく、eabi 呼び出しではないのですか? トラブルシューティングのために、これを mk ファイルに追加しました。
それでも、上記のバイナリ コードが生成されます。float 命令が実際にソフト コードを生成するようにするには、どのパラメーターを指定すればよいですか? それとも、このデバイスは完全に壊れていますか? CPU 情報は次のとおりです。
android - Android での FPU の存在の検出
Android でモバイル アプリケーションのパフォーマンスを最大限に高めたいと考えています。電話にFPUがあるかどうかを確認するトリックを誰かが知っているかどうか知りたい.
いくつかの調査FloatMath
の結果、FPU を搭載したユニットではクラスの使用が遅くなるように思われるため、両方の長所を生かしたいと考えています。
ほとんどの新しい携帯電話には FPU が搭載されていますが、デバイスが提供できる最大のパフォーマンスを得たいと考えています。
opcode - 特定のx87FPU命令のデコードのあいまいさ
x87FPU命令のデコードに関してあいまいなケースに直面しています。Vol2AIntelの命令セットマニュアル[1]の3-380ページから抜粋した次の命令を参照してください。
これらの命令は両方とも同じシングルバイトベースのオペコードを持っています0xD9
。最初の命令の拡張オペコードは0x00
。です。拡張オペコードは、ModR/Mバイトの「reg」フィールドで指定されます。ただし、2番目の命令は、「レジスタを取得するために追加」機能を備えた2バイトのオペコードです。この意味は:
これら2つの指示を区別することに関して私は小さな問題を抱えています。小さな例は次のとおりです。
ここで、オペコードシーケンスを取得するとします"D9 C1"
。それが命令"FLD m32fp"
であるかどうかを確認する必要がある場合は、ModR/Mバイトの「reg」フィールドが0x00であるかどうかを確認する必要があります。もしそうなら、それは確か"FLD m32fp"
に使用されている命令です。
のバイナリ表現はC1
です"1100 0001"
。bit0がLSBであるとすると、bit3-bit5(両端を含む)はModR/Mバイトの「reg」フィールドを構成します"C1"
。0x00
確かに(3つのゼロ)であることがわかります。
そこで、オペコードシーケンス"D9 C1"
を命令にマッピングし"FLD m32fp"
ます。"ecx"
さらにデコードすると、この場合、オペランドが実際になることがわかります。しかし、これに"FLD ST1"
もオペコードシーケンス"D9 C1"
があり、これがそのオペコードシーケンスに使用されている実際の命令であることがわかります。
"D9 C1"
本質的に、オペコードシーケンスが命令に対応し、では"FLD ST1"
ないことをどのように確認でき"FLD ecx"
ますか?
"FMUL"
ここと同じようにオペランドをとるので、命令についても非常によく似た問題が発生"FLD"
します。
[1] http://www.intel.com/design/intarch/manuals/243191.HTM
よろしくお願い
いたします。HrishikeshMurali
assembly - 組み立て CW の RC ビットを設定する方法は?
RC の FPU ビットのコントロール ワードを 3 に設定する方法を教えてください。
回答(編集者注:質問の一部として回答を投稿しないでください。ただし、今のところここにあります)
performance - ピクセル変更コードは、メイン アプリではすばやく実行されますが、Delphi 6 DirectShow フィルタでは他の問題により非常に遅くなります
ビットマップを DirectShow DLL にリアルタイムで 25 フレーム/秒で送信する Delphi 6 アプリケーションがあります。DirectShow DLL も私のコードであり、DSPACK DirectShow コンポーネント スイートを使用して Delphi 6 で記述されています。特定のフラグが設定されている場合、ビットマップ内の各ピクセルを通過して画像の明るさとコントラストを変更する単純なコード ブロックがあります。それ以外の場合、ビットマップは変更されずに DirectShow DLL にプッシュされます (プッシュ ソース ビデオ フィルタ)。コードはメイン アプリケーションにありましたが、それを DirectShow DLL に移動しました。それがメインアプリケーションにあったとき、それはうまくいきました。期待どおりにビットマップの変更を確認できました。ただし、コードが DirectShow DLL に存在するため、次の問題があります。
以下のコード ブロックがアクティブな場合、DirectShow DLL は非常に遅くなります。私はクアッドコア i5 を持っていますが、とても遅いです。また、CPU 消費量に大きなスパイクが見られます。対照的に、メイン アプリケーションで実行されているまったく同じコードは、古いシングル コア P4 で正常に実行されました。その古いマシンでは CPU にかなりの負荷がかかりましたが、ビデオはスムーズで問題はありませんでした。画像のサイズはわずか 352 x 288 ピクセルです。
表示されているビットマップに期待される変更が見られません。DirectShow DLL のコードをトレースすると、各ピクセルの数値がコードによって適切に変更されていることがわかりますが、グラフ編集 ActiveMovie ウィンドウに表示される画像はまったく変更されていないように見えます。
コードを非アクティブ化すると (リアルタイムで実行できます)、ActiveMovie ウィンドウにはガラスのように滑らかなビデオが表示され、CPU にほとんど触れずに完全にレンダリングされます。コードを再アクティブ化すると、ビデオが途切れ途切れになり、おそらく最初のフレームが表示されるまでに長い遅延があり、1 秒に 1 ~ 2 フレームしか表示されず、CPU がスパイクします。完全ではありませんが、予想をはるかに超えています。
範囲チェック、オーバーフロー チェックなどを含むすべてを使用して DirectShow DLL をコンパイルしようとしましたが、実行時に警告やエラーは発生しませんでした。次に、最速でコンパイルしようとしましたが、上記とまったく同じ問題が発生しました。何かが本当に間違っていて、何が原因かわかりません。ビットマップを変更する前にキャンバスをロックし、完了後にロックを解除することに注意してください。上記の「すべてオン」のコンパイル実行がなければ、FPU 例外が発生し、すべてのピクセル計算で静かに飲み込まれたように感じたと思いますが、前述したように、エラーや例外は発生していません。
更新:Roman Rのコメントの1つに埋め込まれているソリューションがはっきりと見えるように、これをここに入れています。ScanLine プロパティにアクセスする前にPixelFormatプロパティをpf24Bitに設定していなかったという問題。ローマンが示唆したように、これを行わないと、TBitmap コードでビットマップの一時コピーを作成する必要があります。問題の下にコード行を追加するとすぐに、変更が表示されないこととソフトページフォールトの両方がなくなりました。影響を受ける唯一のオブジェクトは、ビットマップの一時コピーへのポインターが含まれているため (仮定)、ScanLine プロパティにアクセスするために使用するポインターであるため、これは潜行的な問題です。これが、ビットマップの元のコピーで機能したため、後続の TextOut() 呼び出しがまだ機能していた理由であるに違いありません。
私が参照しているコードブロックは次のとおりです。
decimal - 小数演算は FPU を使用しますか?
小数演算は FPU を使用しますか?
答えはイエスだと思いますが、小数は浮動小数点ではなく固定精度の数値であるため、よくわかりません。
私は主に.NETを探していますが、一般的な回答も役に立ちます。
assembly - fpu がスタックベースの方法でレジスタを実装する動機は何ですか?
fpu がスタックベースの方法でレジスタを実装する動機は何ですか? 私の理解では、x86/sse などの他の命令セットは名前付きレジスタを使用しています。スタックベースのプロパティは、一般的な関数の考え方に対応しているため、アセンブリ プログラマにとってより直感的な設計になっていると想像できます。
しかし、もっと具体的な動機、つまり技術的な利点があるかどうかに興味がありました。