AMDマルチコアプロセッサのタイムパラドックス

最後に、新しいコンピューターを購入することで苦しめられた問題を見つけました。

一部のゲーム(Neverwinter nights 1/2; SW:KoToR 1/2; WarCraft 3; Avatar)では、ほとんどのフレームがスキップされたかのようにグラフィックがジャンプしました。 10分も届かず、時間が1時間もかかりませんでした)。 2007年に、私はfireについて考え、それらを変更し、DirectXを更新しました-感情ゼロ。 2008年に、私はWindowsを考えて、それを再インストールしました-すべては以前のままでした。 2009年に、私はビデオカードに3番目のカードを置きましたが、結果はゼロになりましたが、以前のゲームは以前のコンピューターで正常に動作しました(通常256 MBのRAMで実行されたゲームから)。 ジャンプグラフィックス以外のコンピューターの唯一の不具合は、トレーサーとping.exeにありました-異常に大きな数のms(10億を超える)、さらにはネガティブなものも発行されました。 私の意見では、pingはグラフィックスとはまったく関係ないので、グリッチの原因が同じ場所にあるとは思いませんでした。



理由
Cool'n'Quietがオンのときに、AMDプロセッサを搭載したマルチコアシステムの同期曲線の理由が判明しました。 ここに、かなりの結果を生み出した私のコードがあります。



uses windows, SysUtils;

var

Frequency, lpPerformanceCount1, lpPerformanceCount2, k:Int64;

{$apptype console}

begin

QueryPerformanceFrequency(Frequency);

writeln(Frequency);

writeln('Looking for a bug');

while true do begin

k:=0;

repeat

QueryPerformanceCounter(lpPerformanceCount1);

QueryPerformanceCounter(lpPerformanceCount2);

inc(k);

until lpPerformanceCount1>lpPerformanceCount2;



writeln(TimeToStr(now),': A bug found!');

writeln(k,': ',IntToStr(lpPerformanceCount2 - lpPerformanceCount1));

end ;

end .








QueryPerformanceCounterはrdtscプロセッサ命令に基づいており、最後のプロセッサリセット以降のクロックサイクル数を渡された引数に書き込みます。 つまり、クロックが次の秒の1秒前の時刻を表示できないのと同じように、この関数が後で起動された場合、結果を少なくすることはできません。 当然、このコードは「found」行に到達できませんが、到達します。 ここにそのような時間のパラドックスがあります。 この小さなプログラムは、コンピューター、別のAMDデュアルコア、仮想マシン( 1つの AMD核システムがエミュレートされた)、Intelデュアルコアで起動されました。 私と他の2コアAMDでのみエラーがポップアップしました。 また、互換性モードでこのプログラムの動作を確認しました-Win98 / WinME互換性モードの一部のゲームでは、加速の不具合はなくなりましたが、トレースとpingを開始できません-私のプログラムでは見つかりませんでした。



解決策
3つのソリューション:
  1. プロセッサーにドライバーをインストールします 。 私のプログラムは「見つかりました」に到達するのを止め、ping /トレースでは1ミリ秒未満/ 10億ミリ秒以上の数値が表示されず、ゲームではグラフィックがついに正常になりました。
  2. Cool'n'Quietを無効にします。
  3. タスクマネージャーを使用して、複数のコアで必要なプログラムの使用を強制的に禁止します。
ちなみに、AMDのインストーラーは、boot.iniに追加のパラメーターを作成して書き込みます。 システムをboot.ini設定で起動するには、「デフォルト」を「ブートローダー」セクションから削除する必要がありました(「オペレーティングシステム」からではなく) / usepmtimer 。 私のコンピューターに特有の非互換性はここでは可能ですが。



TimTowdy は1年前のことを教えてくれます。



All Articles