Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Общие вопросы разработки программ _ Подсчет производительности системы

Автор: Янычар 8.03.2009 1:12

Подскажите пожалуйста где можно узнать как происходит выподнение логических операций в процессоре AMD??? Кароче говоря такое задание: определить производительсноть системы при выполнении логических операций. Ну число лог. операций в секунду я смогу подсчитать, а вот как объяснить полученный результат не знаю. Прошу помочь в решении задачи.

Автор: andriano 8.03.2009 19:09

Цитата(Янычар @ 7.03.2009 21:12) *

Подскажите пожалуйста где можно узнать как происходит выподнение логических операций в процессоре AMD??? Кароче говоря такое задание: определить производительсноть системы при выполнении логических операций. Ну число лог. операций в секунду я смогу подсчитать, а вот как объяснить полученный результат не знаю. Прошу помочь в решении задачи.

А в каких единицах должна измеряться производительность в данном случае? Разве не в операциях в секунду?

Автор: Янычар 9.03.2009 0:38

Да не в подсчете проблем то нету) Мне нужно еще и объяснить как я понял почему именно такое число оп\сек получится. То есть мне нужно знать как происходит вычисление логических операций в конкретном процессоре, в частности у меня AMD. Так вот чего то ищу в инете и не могу найти эту информацию..Может кто подскажет где ее можно найти?

Автор: andriano 9.03.2009 14:39

Цитата(Янычар @ 8.03.2009 20:38) *

Да не в подсчете проблем то нету) Мне нужно еще и объяснить как я понял почему именно такое число оп\сек получится. То есть мне нужно знать как происходит вычисление логических операций в конкретном процессоре, в частности у меня AMD. Так вот чего то ищу в инете и не могу найти эту информацию..Может кто подскажет где ее можно найти?

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

Кстати, процессор внутри совершенно не соответствует той программной модели которая досталась от Intel 8086, и которая видна снаружи. Процессор оснащен кэш-памятью и способен выполнять несколько инструкций параллельно, причем его максимальная загрузка практически не достигается, а реальная зависит от того, какие инструкции и в каком порядке он обрабатывает. В частности, скорость работы зависит от перестановки одних и тех же инструкций. Так что, вероятно, нужно еще и показывать устойчивость результатов к перестановке инструкций или, о крайней мере, учитывать этот факт при вычислении погрешности измерений.

Автор: Янычар 9.03.2009 20:14

Честно говоря не понял какой я из этого должен сделать вывод) Ну конечно, я не собираюсь объяснять выполнение операций на уровне цифровой логики(тем более уровне физических устрйств), однако мне остается непонятным с точки зрения чего я должен объяснять буду полученные результаты...Потому что если я буду программировать свой тест на языке высокого уровня, то все что я смогу сказать это, то что конкретная операция занимает столько то времени и сколько например миллионов оп. в секнуду выполняется.. Но это все не то...Видмо мне нужно знать какие логические операции поддерживаются конкретным процессором, за сколько циклов выполняются и как происходит выборка и исполнение команд, но тут вы мне сказали что это информация закрытая, если я правильно понял..

Автор: andriano 10.03.2009 0:40

Ну, выводы - делай, какие можешь. Я тоже не понял, что именно тебе нужно.
Насчет логических операций, думаю, насчет поддержки конкретным процессором - неактуально, т.к. практически наверняка имеется в видк х86, а там набор операций один и тот же. Сколько тактов - для современных процессоров не найдешь (последняя растактовка была для первого Пентиума), да и не может быть такой информации, т.к. внутри и снаружи процессоры устроены по-разному. Время выполнения операции зависит от ее окружения, так что можно оперировать лишь средними величинами.
Думаю, можно логические операции разбить на несколько групп, например, сдвиги, операции, сложность которых зависит от разрядности и операции, сложность которых не зависит от разрядности.
Если я правильно понял, требуется ПРАВИЛЬНО провести измерения, а также доказать, что измерения проведены правильно.

Автор: Янычар 10.03.2009 0:59

Ну может и так..у меня так проблема в том и состоит что не очень понимаю что нужно сделать(это конечно надо было мне уточнить).Просто помню то, что когда спросил насчет того чтобы провести тест на нескольких компах, мне сказали что лучше не надо ибо придется тогда объяснять и для других компов почему так получается.. Вот их этого я и сделал вывод что как то нужно объяснять происхождение полученных результатов на конкретном компе. Но и то что ты говоришь логично.Хотя непонятно как я буду доказывать, что измерения проведены правильно.Ну допустим разобью я на группы логические операции, подсчитаю за сколько каждая из них выполняется и все такое и что дальше?Ну можно подсчитать насколько производительность выполнения лог. операций зависит от разрядности операндов.ну и больше ничего в голову не лезет..

Автор: andriano 10.03.2009 2:02

Ну для начала неплохо бы узнать, как именно ты собиаешься узнавать, сколько выполняется, скажем, циклический сдвих вправо.

Автор: Янычар 12.03.2009 23:32

Извеняюсь за такую задержку, просто были дела) Ну вот, наверное я бы сделал так вычисление 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;



Автор: andriano 13.03.2009 1:44

Понятно.
Ну, во-первых, у тебя во время выполнения обмеряемого фрагмента кода входит время выполнения вложенного цикла. В принципе, это можно откорректировать примерно так:


start2 = clock(); //отсчитываем начало отсчета
for(i=0;i<=10000;i++){
for(j=0;j<=10000;j++){
}
}
finish2=clock(); //после выполнения циклов
...
duration=double((finish-start) - (finish2-start2)); //время в милисекундах

Далее: тебя интересует производительность процессора по выполнению логических операций? Чтобы избежать включения в обмеряемый фрагмент времени загрузки из памяти в регистр и выгрузки из регистра в память я бы описал переменную b как register.
А вообще нормальный оптимизирующий компилятор должен вырезать из кода оба цикла, и тот, что написал ты, и тот, что добавил я. Поэтому при подобных измерениях обмеряемые фрагменты кода обычно пишут на ассемблере. В противном случае необходимо предпринимать очень серьезные меры для борьбы с оптимизатором и, кроме того, доказывать, что эти меры привели к успеху.

Автор: Янычар 13.03.2009 2:25

Ну да я думал об этом и твое исправление тоже понимал просто лень было писать) Ну мне кажется что от меня не будут требовать такой точности в этом я уверен. А что за тип register честно говоря не знаю... Кароче говоря таким макаром считаю возможным высчитывать производительность, ибо нету смысла париться когда спросу нет) Так что следующиим вопросом остается что же дальше делать мне. Ну допустим я подсчитаю еще операцию сравнения, логического ИЛИ и НЕ таким же макаром. И что дальше..в чем собственно должно состоять доказательство?

Автор: andriano 13.03.2009 3:05

Цитата(Янычар @ 12.03.2009 22:25) *
Ну мне кажется что от меня не будут требовать такой точности в этом я уверен.
Ну тогда хотелось бы услышать оценку погрешности предпрлагаемого метода в процентах, а также величину максимально допустимой погрешности.
Цитата
Так что следующиим вопросом остается что же дальше делать мне. Ну допустим я подсчитаю еще операцию сравнения, логического ИЛИ и НЕ таким же макаром. И что дальше..в чем собственно должно состоять доказательство?
С моей точки зрения достаточным было бы правильно оценить погрешность измерения.

Автор: Янычар 13.03.2009 3:54

Ну а все таки никак нельзя объяснить полученные результаты на более низком уровне? Ну хоть как нибудь с точки зрения ассемблера для данного процессора.может как нить так...

Автор: andriano 13.03.2009 12:06

Ты пропустил мой вопрос о погрешности метода и максимально допустимой погрешности измерений. Пока ответа на них нет, дальше пытаться что-либо "объяснить" лишено смысла.

Автор: Янычар 13.03.2009 22:32

Ну значит не знаю как правильно ли я сделал. Кароче говоря я искал случайную погрешность измерений. Провел 10 измерений(10 запусков программы) и в большинстве случаев получил разные значения. Сначала вычислил среднее арифметическое: X=1207,759/10=120,776;
Затем можно найти среднее квадратичное отклонение: Sx_=6,02 и средняя квадратичная погрешность: Sx=60.2. А вот как в данном слкчае выразить полную погрешность не знаю..

Автор: andriano 14.03.2009 1:56

Вот, скажем, тебе нужно измерить скорость падения кирпича на пол.
Ты берешь линейку и измеряешь. 10 раз. (то же самое можно ппытаться сделать при помощи вольтметра. С тем жерезультатом)
Потом чисто формальными методами обрабатываешь результаты измерения и получаешь некоторые величины матожидания и дисперсии.
Как ты думаешь, означает ли это, что ты получил правильный результат?

Прежде всего нужно убедиться, что ты меряешь именно то, что нужно. Т.е. что ты используешь правильный МЕТОД.


PS. Я тут немножко поэкспериментировал и пришел к выводам (для Pentium M).
1. Хотя "пустой" цикл занимает некоторое время, в случае "непустого" цикла операции по организации самого цикла времени практически не занимают. Вероятно, из-за того, что выполняются параллельно сдвигам.
2. 1 сдвиг выполняется 1 такт процессора. Т.е. производительность численно равна тактовой частоте.

Автор: Янычар 14.03.2009 20:04

То есть как, если у меня 3000 MHz, то у меня в секунду должно выполняться 3 млрд. операций. Однако мой результат это 120 млн.Что то не похоже на тактовую частоту. Или я чего то не понимаю?Или ты имел ввиду что операция выполняется за каждый цикл как одна?(без учета самого цикла)

Автор: andriano 14.03.2009 23:36

Ну, процессоры у нас немного разные, но по порядку их производительность должна совпадать.
На древних процессорах длительность этой операции не превосходила 3 тактов. Сейчас она не может быть меньше.
Отсюда, мне кажется, можно сделать лишь один вывод: методическая погрешность у тебя составляет сотни процентов.

Автор: Янычар 15.03.2009 20:25

А можно по подробней для твоего процессора. Мог бы написать параметры твоего проца, испульзуемый метод измерения и результаты?

Автор: andriano 15.03.2009 20:47

Проверил на AMD 64 3500+ (2.2GHz):
здесь результаты несколько отличаются:
- пустой цикл и папа сдвигов внутри цикла выполняется одинаковое время. Т.е. сдвиги идут параллельно циклу, не удлиняя время его выполнения.
- при наличии внутри цикла не менее 6 сдвигов за такт производится 3 сдвига.
Получается, производительность AMD на операциях сдвига вчетверо больше, чем Intel Pentium M.
Метод, в принципе, похожий, но, естественно, все на ассемблере + анализ получаемых цифр уже посредством "естественного" интеллекта.

Тебе же, мне кажется, надо начать с того, что точно сформулировать цель работы. Потому как методы выбираются именно, исходя из цели.

Автор: Янычар 16.03.2009 0:13

То есть я так понимаю нужно на ассемблере писать все таки. Ту программу которую я упоминал совсем использовать нельзя? И что значит определиться с целью работы? Цель вобще то мне известна) это Оценка производительсноти системы при выполнении логических операций. Хотя я лично из этого не много выводов могу сделать. Ну понятно что нужно подсчитать каким-нибудь методом например время выполнения операции, произвести это с различными операциями и соответственно получить различные результаты, подсчитать погрешность. Ну можно еще сказать точнее сопоставить результаты с тактовой частотой процесоора.ну и все. А ты мог бы сюда напистаь какой метод на ассемблере ты использовал, а то давно ассемблер не исполлзовал подзабыл уже(если знал вобще).

Автор: andriano 16.03.2009 3:26

Цитата(Янычар @ 15.03.2009 20:13) *
То есть я так понимаю нужно на ассемблере писать все таки.
Это зависит от задачи.
Цитата
Ту программу которую я упоминал совсем использовать нельзя? И что значит определиться с целью работы? Цель вобще то мне известна) это Оценка производительсноти системы при выполнении логических операций.
Это не цель, это - название.
Неплохо бы определиться, что именно ты подразумеваешь под словом "система", в каких единицах собираешься оценивать, над какими данными должны выполняться логические операции и список этих самых операций (система из одной операции штрих Шеффера, например, является полной. Равно как и стрелки Пирса.).
Цитата
А ты мог бы сюда напистаь какой метод на ассемблере ты использовал, а то давно ассемблер не исполлзовал подзабыл уже(если знал вобще).
Метод не зависит от языка реализации.
Он - такой же, как и у тебя - измерение времени по обе стороны от цикла. Другое дело, что я использую несколько циклов с различным количеством операторов сдвига внутри.

Автор: Янычар 16.03.2009 23:44

Ну насколько я понял мне нужно использовать базовые для данного процессора логические операции. Мне кажется будет достаточным измерить операции в секунду, ну к примеру как я уже писал то миллион операций в секунду.