問題タブ [rdtsc]

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.

0 投票する
1 に答える
414 参照

multithreading - rdtsc は簡単に修正できますか?

マルチコア プロセッサが登場する直前の時代に作成された非常に多くのプログラムは、rdtsc 命令を使用して正確なデータを取得します。

これは、競合する値で終了する可能性があるため、マルチスレッドのプログラムでは深刻な問題であり、これが原因で多くの完全なクラッシュが発生します (一部のシングルスレッド プログラムも、rtdsc の使用方法によってはクラッシュする可能性があります)。

少なくとも Windows では、「プロセッサ アフィニティ」を設定することを推奨するのが一般的ですが、残念ながらこれは、並列処理を使用するように (不適切に、明らかに) 設計された一部のプログラムを著しく不自由にします。

ソースコードがまったくなくても、クラッシュしたプログラムで rdtsc 呼び出しを探し出し、それを別のものに置き換えるのはどれほど難しいのでしょうか? (そして、それが何なのかはわかりません...)

0 投票する
3 に答える
505 参照

assembly - RDTSC のレガシー モードをトリガーする方法はありますか?

私は質問全体を書き直しましたが、人々は明らかにそれを理解していませんでした。

RDTSC は CPU サイクルをカウントするために使用され、CPU スロットリングによって変化しました。

現在、RDTSC は CPU スロットリングによって変化しません。

一部の古いアプリケーションでは、RDTSC が CPU スロットリングによって異なることが予想されます。

RDTSCに彼らが期待するものを与えるにはどうすればよいですか?

コードをプロファイリングしたくない、大量のコードを書き直したくない、ユーザーに BIOS やカーネルのアクセス許可をいじる義務を負わせたくない、レガシー アプリを本来のように動作させたいだけです。

0 投票する
3 に答える
2019 参照

c - C でプログラムのサイクル数を測定する最も信頼できる方法は何ですか?

私は 2 つのアプローチに精通していますが、どちらにも限界があります。

1 つ目は、命令を使用することRDTSCです。ただし、問題は、プログラムのサイクル数を単独でカウントしないため、同時プロセスによるノイズの影響を受けやすいことです。

2 番目のオプションは、clockライブラリ関数を使用することです。このアプローチは信頼できると思いました。これは、プログラムのサイクル数のみをカウントすることを期待していたからです (達成しようとしているもの)。ただし、私の場合、経過時間を測定してから掛けることがわかりました CLOCKS_PER_SEC。プロセッサの実際の周波数に対応しない にCLOCKS_PER_SEC設定されているため、これは信頼できないだけでなく、間違って います。1,000,000

提案されたアプローチの限界を考えると、一貫した結果を生成するためのより優れた信頼性の高い代替手段はありますか?

0 投票する
2 に答える
302 参照

c++ - Intel Xeon X5550 上の Linux で __rdtscp キャリブレーションが不安定になる

__rdtscpintrinsinc 関数を使用して時間間隔を測定しようとしています。ターゲット プラットフォームは Linux x64、CPU Intel Xeon X5550 です。このconstant_tscプロセッサにはフラグが設定されていますが、キャリブレーション__rdtscpを行うと非常に異なる結果が得られます。

ご覧のとおり、プログラム実行の違いは最大 3 倍 (125-360) になる可能性があります。このような不安定性は、どの測定にも適していません。

コードは次のとおりです (gcc 4.9.3、Oracle Linux 6.6、カーネル 3.8.13-55.1.2.el6uek.x86_64 で実行):

Windows 7、i7-4470、VS2015 で非常によく似たプログラムを実行すると、キャリブレーションの結果は非常に安定しており、最後の桁にわずかな違いしかありません。

それで質問です - その問題は何ですか?CPUの問題ですか、Linuxの問題ですか、それとも私のコードの問題ですか?

0 投票する
1 に答える
709 参照

c - プログラムで rdtsc() を使用して、シングル ワードおよびダブル ワード操作のクロック サイクル数を取得していますか?

理論的には、ダブル ワードの加算/減算のコストは、シングル ワードの 2 倍になります。同様に、1 ワードの乗算と加算のコスト比は 3 とします。Ubuntu LTS 14.04 で GCC を使用して次の C プログラムを作成し、Intel Sandy Bridge Corei5-2410M マシンのクロック サイクル数をチェックしました。ただし、ほとんどの場合、プログラムは 128 ビットの加算に対して 6 クロック サイクルを返しますが、私は最良のケースを取り上げました。コマンド (gcc -o ow -O3 cost.c) を使用してコンパイルした結果を以下に示します。

プログラムは次のとおりです。

この結果で気になる点が2つあります。

1) (64 ビット) 乗算のクロック サイクル数は 2 にできますか?

2) ダブルワード加算のクロックサイクル数がシングルワード加算の 2 倍以上なのはなぜですか?

主に(2)のケースが気になります。ここで、私のプログラム ロジックが原因なのかという疑問が生じます。それともGCCコンパイラの最適化によるものですか?

0 投票する
1 に答える
942 参照

gcc - RDTSCP のサポートを含む gcc cpu-type は何ですか?

RDTSCP を使用して LFENCE;RDTSC シーケンスを置き換え、またプロセッサ ID を取得して、スレッドが別の CPU に再スケジュールされた後に TSC 値を比較していることがわかるようにします。

古いマシンで RDTSCP を実行しないようにするために、(libcpuid を使用して) CPUID をチェックした後に RDTSC にフォールバックします。CPUID 呼び出しの代わりに、gcc の複数ターゲット属性機能を使用してみたいと思います。

gcc マニュアルには、多数の CPU ファミリ (haswell、skylake など) がリストされています。最初に RDTSCP を導入した CPU ファミリを見つけるにはどうすればよいですか?

0 投票する
1 に答える
176 参照

x86 - x86 の RDTSC に相当するアルファ版?

x86/Linux で完全に動作する次のコードがあります。このコードを gcc クロス コンパイラを使用して ALPHA に変換したいと考えています。次のようなエラーが発生しています。

「asm」の不明なレジスタ名「eax」

自分で行う適切なソースを見つけることができませんでした。

rpcc が rdts と同等の命令であることはほとんどわかりませんでした。cpuid と xorl は同じだと思います。ただし、eax、ebx は ALPHA ではなく x86 固有のレジスタです。Alpha ISA レジスタには、ここのように 0 から 31 までの番号が付けられます。

上記のコードを ALPHA に変換してもらえますか、または適切な情報を含むリンクをいくつか提供して、その方法を提案してもらえますか?

少なくとも次の行を ALPHA インラインに変換する方法を知っていれば十分です。

ありがとうございました