問題タブ [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.
c - プログラムを最初から最後まで中断することなく確実に実行するにはどうすればよいですか?
Ubuntu 8.10でRDTSCを使用してコードの時間を計ろうとしています(私が試した他のプロファイリングソフトウェアは、必要な解像度まで時間を計ることができません)。しかし、タスクの切り替えや割り込みの発生から外れ値が発生し続け、統計が無効になっています。
私のプログラムが数ミリ秒で実行されることを考えると、私の環境ですべての割り込み (本質的にタスク スイッチをオフにする) を無効にすることは可能ですか? それとも、より強力な OS に移行する必要がありますか? 独自の OS カーネルを使用してこのタイミング コードを実行したほうがよいでしょうか? 私はアルゴリズムの最高/最悪のパフォーマンスを証明しようとしているので、タイミングが完全に安定している必要があります.
現在使用している関連コードは次のとおりです。
このコードでオーバーフロー条件を適切に処理していないことに気付いた人への追加のポイント。この段階では、プログラムがタイムスライスを失ったために突然ジャンプすることなく、一貫した出力を得ようとしています。
私のプログラムの適切な値は -20 です。
要約すると、OS からの中断なしにこのコードを実行することは可能ですか? それとも、IRQ とスケジューリングを無効にできるように、リング 0 のベア ハードウェアで実行する必要がありますか? 前もって感謝します!
assembly - マルチコアプロセッサでベンチマークする方法
マルチコアプロセッサでマイクロベンチマークを実行する方法を探しています。
コンテクスト:
ほぼ同時に、デスクトッププロセッサは、パフォーマンスの予測を困難にするアウトオブオーダー実行を導入しましたが、偶然ではないかもしれませんが、非常に正確なタイミングを取得するための特別な命令も導入しました。これらの手順の例はrdtsc
、x86およびrftb
PowerPCにあります。これらの指示により、システムコールで許可されるよりも正確なタイミングが得られ、プログラマーは、良くも悪くも、自分の心をマイクロベンチマークすることができました。
いくつかのコアを備えたさらに最新のプロセッサでは、一部はスリープ状態になることがあり、カウンタはコア間で同期されません。rdtsc
ベンチマークに使用するのはもはや安全ではないと言われていますが、代替ソリューションについて説明されたとき、私は居眠りをしていたに違いありません。
質問:
一部のシステムでは、パフォーマンスカウンターを保存および復元し、適切な合計を読み取るためのAPI呼び出しを提供する場合があります。この呼び出しがオペレーティングシステムに対して何であるかを知っている場合は、回答でお知らせください。
一部のシステムでは、コアをオフにして、1つだけを実行したままにすることができます。Mac OS X Leopardは、開発者ツールから適切な設定ペインがインストールされている場合に機能することを知っています。rdtsc
これで安全に再利用できると思いますか?
その他のコンテキスト:
マイクロベンチマークを実行しようとするときに、自分が何をしているのかを知っていると仮定してください。アプリケーション全体のタイミングで最適化のゲインを測定できない場合は、最適化する価値がないという意見がある場合は、同意しますが、
代替データ構造が完成するまで、アプリケーション全体の時間を計ることができません。これには長い時間がかかります。実際、マイクロベンチマークが有望でない場合は、今すぐ実装をあきらめることにすることができます。
締め切りを管理できない出版物で提供する数字が必要です。
assembly - 「rdtsc」の前に「cpuid」
命令で TSC を読み取るが、直前にrdtsc
呼び出すコードに遭遇することがあります。cpuid
通話はなぜcpuid
必要なのですか?TSC値を持つ異なるコアと関係があるかもしれないことは理解していますが、これら2つの命令を順番に呼び出すと、正確にはどうなりますか?
linux - CPU コア全体での rdtsc 精度
あるスレッドからネットワーク パケットを送信し、別の CPU コアで実行される 2 番目のスレッドで応答を受信しています。私のプロセスは、各パケットの送信と受信の間の時間を測定します (ping と同様)。rdtsc を使用して、実装に必要な高解像度、低オーバーヘッドのタイミングを取得しています。
すべての測定値は信頼できるように見えます。それでも、tsc がコア間で同期されていないことを示唆するテキストを読んでいるので、コア間の rdtsc の精度が心配です。
ウィキペディアでTSCに関する次の情報を見つけました
一定の TSC 動作により、各クロック ティックの持続時間が一定になり、プロセッサ コアの周波数が変化した場合でも TSC をウォール クロック タイマーとして使用できるようになります。これは、すべての Intel プロセッサで前進するアーキテクチャ上の動作です。
それでもコア全体の精度が心配です。これが私の質問です
より詳しい情報
- Intel nehalem マシンでプロセスを実行しています。
- オペレーティング システムは Linux です。
- すべてのコアに対して「constant_tsc 」CPU フラグが設定されます。
c - C/C++ Linux x86_64 での CPU サイクル カウント ベースのプロファイリング
次のコードを使用して操作をプロファイリングし、関数で使用される CPU サイクルを最適化しています。
2連呼でも「33」の差が出るのでベストとは思いません。助言がありますか ?
linux - タイムスタンプカウンター
レジスターを照会することにより、C++プログラムでタイムスタンプカウンターを使用しています。しかし、私が遭遇する問題の1つは、タイムスタンプを取得する関数が別のCPUから取得することです。関数が常に同じCPUからタイムスタンプを取得するようにするにはどうすればよいですか、それともCPUを同期する方法がありますか?ちなみに、私のプログラムはFedora1364ビットの4コアサーバーで実行されています。
ありがとう。
profiling - RDTSC が一定レートのカウンター値を返すかどうかを検出する方法は?
AMD と Intel の両方の新しい CPU のほとんどは、rdtsc を定数レート カウンターとして実装し、TurboBoost や省電力設定などの結果として周波数が変化することによって引き起こされる問題を回避しているようです。
rdtsc はオーバーヘッドがはるかに少ないため、QueryPerformanceCounter よりもパフォーマンス測定に適しているため、可能な限り使用したいと考えています。
rdtsc が一定レートのカウンターであるかどうかを確実に検出するにはどうすればよいですか?
assembly - 16ビットTurboPascalで高性能カウンターにアクセスする
WinXPDOSボックスで実行されている16ビットのTurboPascal7プログラム(質問しないでください...)で高性能カウンターを使用しようとしています。インライン$0F、$ 31でRDTSC命令を実行でき、AXとDXの内容は適切な値のように設定されていますが、EAX、EDXの上半分にアクセスして、結果を2つのロングワードグローバル変数に書き込むにはどうすればよいですか?
opcode - PPC の rdtsc オペコードに相当するものは何ですか?
次のコードを含むアセンブリ プログラムがあります。このコードは、Intel プロセッサ用に正常にコンパイルされます。しかし、PPC (クロス) コンパイラを使用すると、opcode が認識されないというエラーが発生します。PPC アーキテクチャに相当するオペコードがあるかどうかを調べています。
c++ - RDTSCオーバーヘッドの差異
いくつかのプリミティブな画像処理操作でSIMD命令組み込み関数を使用して実験するときに、パフォーマンスの変化を測定するためのマイクロベンチマークを構築しています。ただし、有用なマイクロベンチマークを作成することは難しいため、最初に、できるだけ多くの変動とエラーの原因を理解する(そして可能であれば排除する)ことを望んでいます。
私が説明しなければならない1つの要因は、測定コード自体のオーバーヘッドです。私はRDTSCで測定しており、次のコードを使用して測定オーバーヘッドを見つけています。
このコードを実行すると、次のような出力が得られます。
私の質問は次のとおりです。
- 上記のコードによって生成されたサイクルカウントのバイモーダル分布の考えられる原因は何ですか?
- 最速の時間(234サイクル)がほんの数回しか発生しないのはなぜですか?非常に珍しい状況でカウントを減らすことができますか?
さらに詳しい情報
プラットホーム:
- Linux 2.6.32(Ubuntu 10.04)
- g ++ 4.4.3
- Core 2 Duo(E6600); これは一定レートのTSCを持っています。
SpeedStepがオフになっています(プロセッサがパフォーマンスモードに設定され、2.4GHzで実行されています)。「オンデマンド」モードで実行している場合、243サイクルと252サイクルで2つのピークが得られ、360サイクルと369サイクルで2つの(おそらく対応する)ピークが得られます。
sched_setaffinity
プロセスを1つのコアにロックするために使用しています。各コアで順番にテストを実行すると(つまり、コア0にロックして実行し、次にコア1にロックして実行)、234サイクルの最速時間がわずかに発生する傾向があることを除いて、2つのコアで同様の結果が得られます。コア0よりもコア1の方が少ない回数。
コンパイルコマンドは次のとおりです。
GCCがコアループ用に生成するコードは次のとおりです。