Проблема такая: function add32:real; begin takt1:=1; asm rdtsc push eax mov ecx, 0 @Loop: // цикл start add eax,edx add eax,edx add eax,edx add eax,edx add eax,edx add eax,edx add eax,edx add eax,edx // цикл end inc ecx cmp ecx,1 jl @Loop rdtsc pop ecx sub eax,ecx mov takt,eax end; add32:= takt / 8; //8 повторений в цикле (получается => затрачено тактов на операцию) end; если я увеличиваю размер цикла и уменьшаю тело цикла, то количество тактов на операцию растет (ПРОИЗВЕДЕНИЕ НЕ МЕНЯЕТСЯ) если я увеличиваю тело цикла, и уменьшаю размер цикла то количестео тактов на операцию падает (ПРОИЗВЕДЕНИЕ НЕ МЕНЯЕТСЯ) Короче че когда растет, а когда падает я может и перепутал (мозг уже отказывает), но факт , что значение НЕПОСТОЯННО!!! И изменяется ЗАКОНОМЕРНО в 1 и 2 случаях. Получается если: 1хADD eax,edx =84 такта на одну инструкцию 2хADD eax,edx =44 такта на одну инструкцию 4хADD eax,edx =22 такта на одну инструкцию 8хADD eax,edx =11 тактов на одну инструкцию 16хADD eax,edx =5 тактов на одну инструкцию 32хADD eax,edx =3,125 такта на одну инструкцию 64хADD eax,edx =от 8 до 1,8 такта на одну инструкцию (постоянно разные значения в этих пределах) При этом все это делается с приоритетом РИАЛ ТАЙМ! Тут рождается мысль, что для Селерона 32хАdd оптимально, но например для того же пня4 это может быть не так, не говоря уже об AMD. Тут рождается вопрос: как написать универсальную прогу которая бы показывала СКОЛЬКО ТАКТОВ ТРАТИТ ПРОЦЕССОР НА ТУ ИЛИ ИНУЮ ОПЕРАЦИЮ, при этом чтобы никто не кричал: "ОНА ОПТИМИЗИРОВАНА ПОД AMD или Intel!" ?
>все это делается с приоритетом РИАЛ ТАЙМ! к команде процессора rdtsc приоритеты потоков Windows отношения не имеют. >СКОЛЬКО ТАКТОВ ТРАТИТ ПРОЦЕССОР НА ТУ ИЛИ ИНУЮ ОПЕРАЦИЮ это зависит от предыдущих операция (кеш и загрузка АЛУ), т.к. архитектура процессора распаривает вычисления. Так что для точного вычисления надо сперва все сбросить или проверить в цикле побольше. > Код (Text): inc ecx cmp ecx,1 jl @Loop цикл надо по нормальному писать (у тебя конечно правильно, но по HLL, т.е. так пишут психически нездоровые люди, которые программируют не процессоры, а собственные бредовые идеи, типа "структурное программирование", ООП и пр.) Код (Text): mov ecx, 55 @@loop: .... dec ecx jnz @@loop Ну и наконец: ты на ассемблере пишешь или на хреновне какой? Не считая того, что компилятор может впихнуть в код любую лажу, которая пришла в голову программистам, его писавшим; изучать ассемблер вызывая его из HLL, все равно что спорить какая вермишель быстрого приготовления вкусней- с "ароматом" того или иного. Аромат он и есть аромат- вони много, толко мало.
Товарищ locki, кроме того, что не совсем точно меряешь такты (из-за чего могут быть погрешности), ты не воспользовался поиском по форуму, там есть и проги для тестирования (как простые-универсальные, так и ссылки на профессиональные пакеты от конкретно Intel\AMD) и ответы на твои вопросы есть в статьях\доках по оптимизации (на wasm.ru), значение действительно НЕПОСТОЯННО!!! НО НЕ ПРОСТО так
Замерять количество тактов на выполнение имхо вообще не возможно с помощью подобного теста - процессор ведь не только выполнением занимается, но еще и выборкой, декодированием, диспетчеризацией и прочими полезными делами. Так-что выбрось эту блажь из головы, и займись изучением AMD CodeAnalyst по части Pipeline Simulation (на что потребуется их же процессор, желательно Athlon) - очень полезная иллюстрация как выполняется (и когда) код.
_BC_ Ах ну да, этот способ везде пригоден. Но автору сабжа как-никак требуется точно замерить кол-во тактов чисто программным способом (и видимо при разрешенных аппаратных прерываниях).
Можно программно замерить код с погрешностью максимум 1 такт, и то, только из-за того, что не ясно как учитывать инструкцию выполняющуюся 0.5 такта (округлять в большую или меньшую после rdtsc), тот код (что он привел) можно вообще посчитать в уме (для PIII так точно) благодаря Фогу, его табличкам и тестилкам. Единственное что не стоит брать результат первого(одного) прохода из-за погрешностей на загрузку кода в кеш и т.д. Таким макаром можно мерять код успевающий выполнится между прерываниями и не на камнях с HT, а иначе конечно точно не получится
Ну и че единого мнения решения проблеммы нет! Идея такой программы не реальна? (прога тест которая при запуске на том или ином процессоре показывала бы ссколько тактов он тратит на НАБОР команд типа add, div и т. д)???
locki НАБОРом команд процессор не занимается, объясняй тогда, что ты под этим словом понимаешь, ты смотрел AMD CodeAnalyst, wtest у Фога? Что они по твоему показывают, не такты?