Скорее всего TSC(тот что вы читаете при помощи RDTSC) тикает в разных ядрах по разному. При старте биоса стартует всегда одно ядро(нулевое) и уже потом специальный код стартует остальные ядра, потому на разных ядрах может оказаться разное значение TSC. Винда кидает процессы между ядрами. Когда вы выставляете Affinity. Кстати TSC ещё и переполняться может за долгое время работы, ничего в этом страшного нет. Мы даже писали в него с драйвера, всё прекрасно работает. Вообще от использования TSC надо уходить. На многоядерных машинах с плавающей частотой, да ещё и асинхронно, когда одни ядра разгоняются быстрее чем другие вообще чёрт в этом TSC сломит.
Винда действительно кидает программу между ядрами, даже если поток всего один. Глюк заключается в Cool'n'Quiet — первое ядро простаивает, второе работает, первое получает инструкцию, которую надо выполнить, второе получает за ним, но второе выполняет инструкцию раньше, чем первое, потому что первое простаивает.
Я тоже раньше так думал, и сам имею только интел на всех компьютерах, но знакомым иногда рекомендую AMD тупо по соотношению цена/производительность. А всем топовые решения навязывать просто бессмысленно.
У меня смутное ощущение что АМД выпускала дрова для своих процов, которые решали указанные глюки.
Но могу ошибаться.
Просто у меня никогда не было Интел процессоров, и эти глюки видел очень ограниченный промежуток времени
Та же проблема есть и в Linux при использовании clocksource TSC ядром. При смене на hpet проблема решается. :) На Intel ее нет (собственно и tsc там почему-то не выбирается по-дефолту). А диагностика та же — многократный запуск команды date из шелла может показывать разное время, которое отличается на 2-3 секунды. Отрицательные пинги и т.д.
попробовать hpet можно вот так:
echo hpet > /sys/devices/system/clocksource/clocksource0/current_clocksource
На самом деле на интелах тоже бывает. Просто почему-то в программах вообще не проявляется. Если с драйвера напрямую ассемблером регистр читать то тоже разное. Даже если писать туда ноль постоянно никому крышу не рвёт.
Счетчик тактов уходит из-за технологий энергосбережения с понижением частоты. У Интела одно время были проблемы с TSC на SMP, но потом (начиная с P4 0xF30) они придумали «constant tsc» (гуглите, www.tomshardware.co.uk/forum/128629-10-intel ). Эта фича говорит о том, что rstsc будет выдавать монотонный и синхронный счетчик на любых ядрах вне зависимости от текущих технологий энергосбережения, от текущей частоты.
Эээ, ну так просто драйвер поставить и все.
CnQ отключать глупость. Запрет на использования больше одно ядра, тоже.
Ну и да, кстати минусовые пинги тоже свидетельство.
в GTA San Andreas при включенных двух ядрах атлона игра значительно ускорена, так что порой невозможно играть
поэтому после включения приходится сворачивать и отключать второй процессор в диспетчере задач
Вот инвалиды, блин, сделали бы общий регистр на все ядра. Это же самый удобный по моему способ мерять время. без оверхедов и системных вызовов, будь они неладны.
Такое решение не универсально. На одном многоядерном камне сработает, а вот если много отдельных камней? Тут один регистр на всех не сделать. Тут нужно какое-то другое решение. Думаю, это должна ось рулить.
SetTime(0,0,0,0); {засекаем время, т.е. устанавливаем системное время равным 0 ч 0 мин 0.00 сек }
For i:=1 to NumDist do
begin
d:=dist[i];
For CurGroup:=1 to d do
InsertSort(d,CurGroup);
end;
GetTime(hour,minute,second,hund); {Получаем время сортировки}
via govnokod.ru/1122
просто у вас компьютер стоит вертикально, ядра находятся на разной высоте от земли, время для верхнего течет медленнее, вот разница накапливается и однажды проявляется ошибка. Положите компьютер горизонтально.
Шутка, если что ;)
Это не баг. Прото они не гарантируют, что на разных ядрах выполняется одинаковое количество инструкций. Так что amd ни при чём, а дело в системе: использование любой фичи не по назначению всегда чревато.
Может не в тему, но на моей тачке со включенным Cool&Quiet USB-audio временами издавал достающие клики, особенно при нагрузне на графику. Подозреваю, что причиной является то же самое.
Развели тут флуду, амд у вас во всём виновата…
Проблеме на самом деле сто лет в обед, и решаетя 1000+ способом.
Но на самом деле процессоры АМД здесь не при чём, проблема в материнской плате.
BiSeTrojanov, какой бы ты себе не вставил многоядерный процессор в свою материнскую плату, она не сможет запустить ядра синхронно, проблема в мамке, решается вполне софтово.
Детальное описание проблемы, и программка которая проверяет систему. www.ice-graphics.com/ICEAffinity/IndexR.html
Причина — сугубо в криворукости программистов. Им в голову не прийти, что бывают много процессорные системы. Там кроме этого ещё вагон багов есть — например, задача может поочерёдно исполняться на разный ядрах, что при эксклюзивном кэше даёт сильную потерю в производительности.
И нечего тут на AMD валить — криворуким программистам, чего не дай — все затормозят и испоганят.
пардон, в таком ключе — понятно :)
Извиняюсь за предыдущий коммент, тогда это косяки установщика от AMD.
Просто в Boot Loader вообще ключи не пишут… вот я и ошибся x)
Временной парадокс в многоядерных процессорах AMD