Подскажите пожалуйста где можно узнать как происходит выподнение логических операций в процессоре AMD??? Кароче говоря такое задание: определить производительсноть системы при выполнении логических операций. Ну число лог. операций в секунду я смогу подсчитать, а вот как объяснить полученный результат не знаю. Прошу помочь в решении задачи.
Да не в подсчете проблем то нету) Мне нужно еще и объяснить как я понял почему именно такое число оп\сек получится. То есть мне нужно знать как происходит вычисление логических операций в конкретном процессоре, в частности у меня AMD. Так вот чего то ищу в инете и не могу найти эту информацию..Может кто подскажет где ее можно найти?
Честно говоря не понял какой я из этого должен сделать вывод) Ну конечно, я не собираюсь объяснять выполнение операций на уровне цифровой логики(тем более уровне физических устрйств), однако мне остается непонятным с точки зрения чего я должен объяснять буду полученные результаты...Потому что если я буду программировать свой тест на языке высокого уровня, то все что я смогу сказать это, то что конкретная операция занимает столько то времени и сколько например миллионов оп. в секнуду выполняется.. Но это все не то...Видмо мне нужно знать какие логические операции поддерживаются конкретным процессором, за сколько циклов выполняются и как происходит выборка и исполнение команд, но тут вы мне сказали что это информация закрытая, если я правильно понял..
Ну, выводы - делай, какие можешь. Я тоже не понял, что именно тебе нужно.
Насчет логических операций, думаю, насчет поддержки конкретным процессором - неактуально, т.к. практически наверняка имеется в видк х86, а там набор операций один и тот же. Сколько тактов - для современных процессоров не найдешь (последняя растактовка была для первого Пентиума), да и не может быть такой информации, т.к. внутри и снаружи процессоры устроены по-разному. Время выполнения операции зависит от ее окружения, так что можно оперировать лишь средними величинами.
Думаю, можно логические операции разбить на несколько групп, например, сдвиги, операции, сложность которых зависит от разрядности и операции, сложность которых не зависит от разрядности.
Если я правильно понял, требуется ПРАВИЛЬНО провести измерения, а также доказать, что измерения проведены правильно.
Ну может и так..у меня так проблема в том и состоит что не очень понимаю что нужно сделать(это конечно надо было мне уточнить).Просто помню то, что когда спросил насчет того чтобы провести тест на нескольких компах, мне сказали что лучше не надо ибо придется тогда объяснять и для других компов почему так получается.. Вот их этого я и сделал вывод что как то нужно объяснять происхождение полученных результатов на конкретном компе. Но и то что ты говоришь логично.Хотя непонятно как я буду доказывать, что измерения проведены правильно.Ну допустим разобью я на группы логические операции, подсчитаю за сколько каждая из них выполняется и все такое и что дальше?Ну можно подсчитать насколько производительность выполнения лог. операций зависит от разрядности операндов.ну и больше ничего в голову не лезет..
Ну для начала неплохо бы узнать, как именно ты собиаешься узнавать, сколько выполняется, скажем, циклический сдвих вправо.
Извеняюсь за такую задержку, просто были дела) Ну вот, наверное я бы сделал так вычисление MFLOPS для логических операций, хотя не уверен что правильно:
clock_t start,finish;
int i=0,b=1,c=0,j=0;
float d=0;
double duration;
start = clock(); //отсчитываем начало отсчета
for(i=0;i<=10000;i++){
for(j=0;j<=10000;j++){
b<<=1;
b>>=1;
}
}
finish=clock(); //после выполнения циклов
c=10000*(10000*2); //количество операций в циклах
duration=double(finish-start); //время в милисекундах
duration/=1000;
d=c/(duration*1000000); //вычисление MFLOPS
cout<<d;
Понятно.
Ну, во-первых, у тебя во время выполнения обмеряемого фрагмента кода входит время выполнения вложенного цикла. В принципе, это можно откорректировать примерно так:
start2 = clock(); //отсчитываем начало отсчета
for(i=0;i<=10000;i++){
for(j=0;j<=10000;j++){
}
}
finish2=clock(); //после выполнения циклов
...
duration=double((finish-start) - (finish2-start2)); //время в милисекундах
Ну да я думал об этом и твое исправление тоже понимал просто лень было писать) Ну мне кажется что от меня не будут требовать такой точности в этом я уверен. А что за тип register честно говоря не знаю... Кароче говоря таким макаром считаю возможным высчитывать производительность, ибо нету смысла париться когда спросу нет) Так что следующиим вопросом остается что же дальше делать мне. Ну допустим я подсчитаю еще операцию сравнения, логического ИЛИ и НЕ таким же макаром. И что дальше..в чем собственно должно состоять доказательство?
Ну а все таки никак нельзя объяснить полученные результаты на более низком уровне? Ну хоть как нибудь с точки зрения ассемблера для данного процессора.может как нить так...
Ты пропустил мой вопрос о погрешности метода и максимально допустимой погрешности измерений. Пока ответа на них нет, дальше пытаться что-либо "объяснить" лишено смысла.
Ну значит не знаю как правильно ли я сделал. Кароче говоря я искал случайную погрешность измерений. Провел 10 измерений(10 запусков программы) и в большинстве случаев получил разные значения. Сначала вычислил среднее арифметическое: X=1207,759/10=120,776;
Затем можно найти среднее квадратичное отклонение: Sx_=6,02 и средняя квадратичная погрешность: Sx=60.2. А вот как в данном слкчае выразить полную погрешность не знаю..
Вот, скажем, тебе нужно измерить скорость падения кирпича на пол.
Ты берешь линейку и измеряешь. 10 раз. (то же самое можно ппытаться сделать при помощи вольтметра. С тем жерезультатом)
Потом чисто формальными методами обрабатываешь результаты измерения и получаешь некоторые величины матожидания и дисперсии.
Как ты думаешь, означает ли это, что ты получил правильный результат?
Прежде всего нужно убедиться, что ты меряешь именно то, что нужно. Т.е. что ты используешь правильный МЕТОД.
PS. Я тут немножко поэкспериментировал и пришел к выводам (для Pentium M).
1. Хотя "пустой" цикл занимает некоторое время, в случае "непустого" цикла операции по организации самого цикла времени практически не занимают. Вероятно, из-за того, что выполняются параллельно сдвигам.
2. 1 сдвиг выполняется 1 такт процессора. Т.е. производительность численно равна тактовой частоте.
То есть как, если у меня 3000 MHz, то у меня в секунду должно выполняться 3 млрд. операций. Однако мой результат это 120 млн.Что то не похоже на тактовую частоту. Или я чего то не понимаю?Или ты имел ввиду что операция выполняется за каждый цикл как одна?(без учета самого цикла)
Ну, процессоры у нас немного разные, но по порядку их производительность должна совпадать.
На древних процессорах длительность этой операции не превосходила 3 тактов. Сейчас она не может быть меньше.
Отсюда, мне кажется, можно сделать лишь один вывод: методическая погрешность у тебя составляет сотни процентов.
А можно по подробней для твоего процессора. Мог бы написать параметры твоего проца, испульзуемый метод измерения и результаты?
Проверил на AMD 64 3500+ (2.2GHz):
здесь результаты несколько отличаются:
- пустой цикл и папа сдвигов внутри цикла выполняется одинаковое время. Т.е. сдвиги идут параллельно циклу, не удлиняя время его выполнения.
- при наличии внутри цикла не менее 6 сдвигов за такт производится 3 сдвига.
Получается, производительность AMD на операциях сдвига вчетверо больше, чем Intel Pentium M.
Метод, в принципе, похожий, но, естественно, все на ассемблере + анализ получаемых цифр уже посредством "естественного" интеллекта.
Тебе же, мне кажется, надо начать с того, что точно сформулировать цель работы. Потому как методы выбираются именно, исходя из цели.
То есть я так понимаю нужно на ассемблере писать все таки. Ту программу которую я упоминал совсем использовать нельзя? И что значит определиться с целью работы? Цель вобще то мне известна) это Оценка производительсноти системы при выполнении логических операций. Хотя я лично из этого не много выводов могу сделать. Ну понятно что нужно подсчитать каким-нибудь методом например время выполнения операции, произвести это с различными операциями и соответственно получить различные результаты, подсчитать погрешность. Ну можно еще сказать точнее сопоставить результаты с тактовой частотой процесоора.ну и все. А ты мог бы сюда напистаь какой метод на ассемблере ты использовал, а то давно ассемблер не исполлзовал подзабыл уже(если знал вобще).
Ну насколько я понял мне нужно использовать базовые для данного процессора логические операции. Мне кажется будет достаточным измерить операции в секунду, ну к примеру как я уже писал то миллион операций в секунду.