Две головы не всегда лучше одной или найден bug в процессорах AMD X2

7 марта 2006, вторник 19:58
Большое количество пользователей двух ядерных процессоров, таких как AMD X2, Pentium D и даже Pentium 4 с HyperThreading - жаловались на странные проблемы с играми, приводящие к их полной или частичной неработоспособности. Наглядный пример такого поведения можно увидеть в Need for Speed: Most Wanted.

Это происходит потому, что производители материнских плат некорректно инициализируют процессоры. Если любая программа использует tick counter у процессора, эта программа может стать неработоспособной на любом двух ядерном процессоре. Windows постоянно балансирует нагрузку, постоянно переключаясь с одного процессора на другой. Если оба процессора были инициализированы синхронно, то проблема не возникает. Но большинство материнских плат не могут инициализировать процессоры синхронно. Если процессоры инициализированы не синхронно, то переключение с одного процессора на другой будет приводить к временным броскам, как прямым, так и обратным. Время начинает течь рывками, что делает работу большинства игр не стабильной.

Вы можете подумать, что эта ошибка проявляется только в играх. К сожалению, эта ошибка проявляется так в различных драйверах для USB HDD, flash плееров и т.д. Странным образом эта ошибка исчезает, если заставить Windows на этом-же компьютере работать в одно процессорном режиме.

Легко проверить, имеется эта ошибка в Вашем компьютере или нет. Просто запустите этот тест:
http://cp.people.overclockers.ru/cgi-bin/dl.pl?id=13003&filename=ICEAffinityTest.exe
. Если Ваш компьютер не идеален, этот тест покажет время сдвига между процессорами. Этот тест очень прост. Ниже приведен код из теста, позволяющий измерить этот временной сдвиг:

TLargeInteger Tmp;

QueryPerformanceFrequency(&Tmp);
__int64 Freq = Tmp.QuadPart;

QueryPerformanceCounter(&Tmp);
__int64 Value = Tmp.QuadPart;
__int64 LastValue = Tmp.QuadPart + Freq;
__int64 Shift = 0;

while(Value < LastValue)
{
QueryPerformanceCounter(&Tmp);
if (Value - Tmp.QuadPart > Shift) Shift = Value - Tmp.QuadPart;
Value = Tmp.QuadPart;
}

double TimeShift = double(Shift) / Freq; //seconds

Для материнских плат без данного дефекта переменная TimeShift равна нулю. Если переменная TimeShift не равна нулю, то значит Вы можете требовать от производителя Вашей материнской платы исправить этот дефект.
Оценитe материал

Возможно вас заинтересует

Популярные новости

Сейчас обсуждают