レジスターを照会することにより、C++プログラムでタイムスタンプカウンターを使用しています。しかし、私が遭遇する問題の1つは、タイムスタンプを取得する関数が別のCPUから取得することです。関数が常に同じCPUからタイムスタンプを取得するようにするにはどうすればよいですか、それともCPUを同期する方法がありますか?ちなみに、私のプログラムはFedora1364ビットの4コアサーバーで実行されています。
ありがとう。
Intelマニュアルからの次の抜粋を見てください。セクション16.12によると、以下の「新しいプロセッサ」とは、pentium 4よりも新しいプロセッサを指していると思います。サポートされている場合は、rdtscp命令を使用してtsc値とコアIDを同時にアトミックに決定できます。私はそれを試していません。幸運を。
インテル64およびIA-32アーキテクチャーソフトウェア開発者マニュアル
第3巻(3Aおよび3B):システムプログラミングガイド:
第16.12.1章不変TSC
新しいプロセッサのタイムスタンプカウンタは、不変TSCと呼ばれる拡張機能をサポートしている場合があります。不変TSCに対するプロセッサのサポートは、CPUID.80000007H:EDX[8]で示されます。
不変TSCは、すべてのACPI P-、C-で一定の速度で実行されます。およびT状態。これは、前進するアーキテクチャの動作です。不変のTSCをサポートするプロセッサでは、OSは(ACPIまたはHPETタイマーの代わりに)ウォールクロックタイマーサービスにTSCを使用する場合があります。TSC読み取りははるかに効率的であり、リング遷移またはプラットフォームリソースへのアクセスに関連するオーバーヘッドは発生しません。
Intelには、CPUとrdtscの関連付けについて説明するコード実行ベンチマークに関するガイドもあります-http ://download.intel.com/embedded/software/IA/324264.pdf
私の経験では、個々のコア/CPU の個々のクロック サイクルを本当に測定したい場合を除き、TSC を完全に避けるのが賢明です。
TSC の潜在的な問題:
これは基本的に、スレッドのアフィニティーを強制する場合、TSC を使用して、単一のスレッド化されたアプリケーションの単一の CPU で経過した CPU サイクル (経過時間ではない) を測定することしかできないということになります。
推奨される代替方法は、システム関数を使用することです。(Unix/Mac で) 最も移植性が高いのはgettimeofday()で、通常は非常に正確です。より適切な関数はclock_gettime()かもしれませんが、最初にシステムでサポートされているかどうかを確認してください。Windows では、 QueryPerformanceCounter()を安全に使用できます。
または cpuset 機能を使用sched_setaffinity
して、cpuset を作成し、タスクをセットに割り当てることができます。