ここで私のコメントを拡張します。これは大きすぎて詳細で、コメントに収めることができません。
あなたがやろうとしていることは非常に困難です-以下の理由で非現実的であるという点まで:
- プロセッサ周波数を取得するためのポータブルな方法はありません。SpeedStepやTurboBoostなどの効果により、常に正しい周波数が得られるとは
rdtsc
限りません。
- 周波数を測定するためのすべての既知の方法は、時間を正確に測定する必要があります。ただし、決定された詐欺師は、システム内のすべてのクロックとタイマーを改ざんする可能性があります。
- 不正開封防止の方法でプロセッサの周波数と時間を正確に読み取るには、カーネルレベルのアクセスが必要です。これは、Windowsのドライバー署名を意味します。
プロセッサ周波数を取得するためのポータブルな方法はありません。
CPU周波数を取得する「簡単な」方法はrdtsc
、一定の期間を挟んで2回呼び出すことです。次に、差を分割すると、頻度がわかります。
問題はrdtsc
、プロセッサの真の周波数が得られないことです。ゲームなどのリアルタイムアプリケーションはこれに依存しているため、rdtsc
CPUスロットリングとターボブーストを通じて一貫性を保つ必要があります。したがって、システムが起動rdtsc
すると、常に同じ速度で実行されます(SetFSBなどでバス速度をいじり始めない限り)。
たとえば、私のCore i7 2600Kでは、rdtsc
常に。の周波数が表示され3.4 GHz
ます。しかし実際には、でアイドル状態になり、でオーバークロックされたターボブーストマルチプライヤを介して負荷がかかった状態1.6 GHz
でクロックアップします。4.6 GHz
46x
しかし、真の周波数を測定する方法を見つけたら(または、十分満足している場合)、スレッドアフィニティrdtsc
を使用して各コアの周波数を簡単に取得できます。
真の周波数を取得する:
プロセッサの実際の周波数を取得するには、MSR(モデル固有のレジスタ)またはハードウェアパフォーマンスカウンタのいずれかにアクセスする必要があります。
これらはカーネルレベルの命令であるため、ドライバーを使用する必要があります。したがって、配布を目的としてWindowsでこれを試行する場合は、適切なドライバー署名プロトコルを実行する必要があります。さらに、コードはプロセッサのメーカーとモデルによって異なるため、プロセッサの世代ごとに異なる検出コードが必要になります。
この段階に到達すると、頻度を読み取るさまざまな方法があります。
Intelプロセッサでは、ハードウェアカウンタを使用して生のCPUサイクルをカウントできます。リアルタイムを正確に測定する方法(次のセクション)と組み合わせると、真の周波数を計算できます。MSRを使用すると、CPU周波数乗数などの他の情報にアクセスできます。
周波数を測定するためのすべての既知の方法では、時間を正確に測定する必要があります。
これはおそらくより大きな問題です。周波数を測定するにはタイマーが必要です。有能なハッカーは、C /C++で使用できるすべての時計を改ざんすることができます。これには、次のすべてが含まれます。
clock()
gettimeofday()
QueryPerformanceCounter()
- 等...
リストはどんどん増えていきます。言い換えれば、有能なハッカーがすべてのタイマーをスプーフィングできるため、どのタイマーも信頼できません。たとえばclock()
、gettimeofday()
OS内でシステムクロックを直接変更することでだまされる可能性があります。だましQueryPerformanceCounter()
は難しいです。
時間の真の測定値を取得する:
上記のすべてのクロックは、同じシステムベースクロックから何らかの方法で派生していることが多いため、脆弱です。そして、そのシステムベースクロックは、多くの場合、システムベースクロックに関連付けられています。これは、システムがオーバークロックユーティリティを使用してすでに起動した後に変更できます。
したがって、信頼性が高く改ざんされない時間測定を行う唯一の方法は、HPETやACPIなどの外部クロックを読み取ることです。残念ながら、これらもカーネルレベルのアクセスを必要とするようです。
要約する:
あらゆる種類の改ざん防止ベンチマークを構築するには、ほぼ確実に、Windowsの証明書署名を必要とするカーネルモードドライバーを作成する必要があります。これは、多くの場合、カジュアルなベンチマークライターにとっては負担が大きすぎます。
これにより、改ざん防止ベンチマークが不足し、近年の競争力のあるオーバークロックコミュニティの全体的な衰退の一因となった可能性があります。