Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.02.11;
Скачать: [xml.tar.bz2];

Вниз

Длительность арифметических операций   Найти похожие ветки 

 
Зм1й ©   (2007-01-17 14:44) [0]

Подскажите, пожалуйста, сколько времени прощессора занимают основные арифметические операции (сложение, вычитание, извлечение корня и т. д.)? Что-то нигде не нашёл.


 
Сергей М. ©   (2007-01-17 14:50) [1]


> Что-то нигде не нашёл


Значит не искал, или не там искал, или не то искал.

Берешь мануал по архитектуре конкретного процессора конкретного производителя, находишь там свою "основную операцию" и смотришь сколько тактов требуется для ее выполнения. Зная число тактов и тактовую частоту ЦП получаешь искомое время.


 
wicked ©   (2007-01-17 14:51) [2]

смотря, для каких типов данных....

например, для целочисленных типов размером в машинное слово
сложение - такт или меньше
вычитание - суть то же сложение, см. выше
умножение - последние цифры, какие помню (80486) - 12 - 18 - 24 тактов
деление - не помню, но процентов на 20 больше от умножения
извлечение корня - много, зависит от алгоритма; алгоритм обычно итерационный


 
ProgRAMmer Dimonych ©   (2007-01-17 15:08) [3]

Для add...

8088: 3 или 4 такта, при работе с памятью - зависит от effective address
8086: те же самые значения, только работа с памятью при 16-битных операндах чуть-чуть быстрее.
80286: 2 такта при работе с регистрами, 3 - сложение регистра и immediate-значения, 7 в остальных случаях.
80386: 2 такта при RegReg, RegImm (см. ниже). 6 тактов - RegMem. 7 тактов - MemReg и MemImm.
80486: 1 такт для RegReg, RegImm. 2 такта для RegMem? 3 такта - MemReg и MemImm.
Pentium: то же, что и 80486.

Для других команд сейчас тоже сообщу.

P.S. RegReg - это когда оба операнда - регистры процессора. RegMem - регистр и память с помещением результата в регистр, MemReg - с результатом в память. RegImm - immediate-значение (явно заданная константа) + регистр с помещением в регистр, MemImm - с памятью в память.


 
ProgRAMmer Dimonych ©   (2007-01-17 15:13) [4]

sub (вычитание)

Операнды        8088       8086      80286     80386     80486     Pentium
=======================================================
RegReg              3            3            2            2           1            1
RegMem             *            *           7            7            2            2
MemReg             *            *           7            6            3            3
RegImm              4            4           3            2            1            1
MemImm            *            *           7             7            3           3

* - зависит от адреса в памяти.


 
ProgRAMmer Dimonych ©   (2007-01-17 15:20) [5]

mul (умножение на содержимое [e]ax)

Операнды        8088       8086      80286     80386     80486     Pentium
=======================================================
Reg8              70-77      70-77        13         9-14     13-18         11
Reg16           118-133   118-133      21         9-22     13-26         11
Reg32                -             -           -          9-38     13-42         10
Mem8                *            *           16        12-17    13-18         11
Mem16              *             *           24        12-25    13-26         11
Mem32              -             -            -          12-41    13-42         10

* - зависит от адреса в памяти.
- - не поддерживается
Reg8, Reg16, Reg32 - 8-, 16-, 32-битный регистр
Mem8, Mem16, Mem32 - 8-, 16-, 32-битный операнд в памяти.


 
ProgRAMmer Dimonych ©   (2007-01-17 15:25) [6]

div (деление значения [e]ax на операнд)

Операнды        8088       8086      80286     80386     80486     Pentium
=======================================================
Reg8              80-90      80-90       14          14          16            17
Reg16            144-162  144-162     22          22          24            25
Reg32                -            -           -           38          40            41
Mem8                *            *          17          17          16            17
Mem16              *            *          25          25           24            25
Mem32               -            -           -           41          40            41

* - зависит от адреса в памяти.
- - не поддерживается


 
ProgRAMmer Dimonych ©   (2007-01-17 15:29) [7]

dec (уменьшить параметр на 1)

Операнды        8088       8086      80286     80386     80486     Pentium
=======================================================
Reg8              3            3            2            2           1            1
Reg16             3            3           2            2            1            1
Reg32             3             3           2            2           1            1
Mem8              *            *           7            6            3           3
Mem16            *            *           7            6            3           3
Mem32            -             -           -            6            3           3

* - зависит от адреса в памяти.
- - не поддерживается.


 
ProgRAMmer Dimonych ©   (2007-01-17 15:30) [8]

inc (увеличить параметр на 1)

Операнды        8088       8086      80286     80386     80486     Pentium
=======================================================
Reg8              3             2            2            2           1            1
Reg16             3            3           2            2            1            1
Reg32             -             -           -            2           1            1
Mem8              *            *           7            6            3           3
Mem16            *            *           7            6            3           3
Mem32            -             -           -            6            3           3

* - зависит от адреса в памяти.
- - не поддерживается.


 
evvcom ©   (2007-01-17 15:34) [9]

> [7] ProgRAMmer Dimonych ©   (17.01.07 15:29)
> Reg32   3 3 2 2 1 1

Ну эт ты загнул :)


 
ProgRAMmer Dimonych ©   (2007-01-17 15:34) [10]

Корень квадратный - операция из набора SSE, SSE2 или просто из floating-point instructions (в зависимости от того, с каким числами и на основе какой технологии ведутся вычисления). А у меня пока только к general-purose instructions есть такая информация - и то только к 99%.


 
ProgRAMmer Dimonych ©   (2007-01-17 15:36) [11]

> evvcom ©   (17.01.07 15:34) [9]
Это почему? Источник - Art Of Assembly. Appendix D: Instruction Set Reference. Хотя опечатки там я уже видел. Возможно, и здесь тоже. А почему Вы считаете эти данные неверными?


 
evvcom ©   (2007-01-17 15:39) [12]

> [11] ProgRAMmer Dimonych ©   (17.01.07 15:36)

Ну какой Reg32 для 8088,8086,80286? Я думал ты увидишь, потому и смайл воткнул.


 
ProgRAMmer Dimonych ©   (2007-01-17 15:42) [13]

> evvcom ©   (17.01.07 15:39) [12]
А, ну, в принципе...

Действительно.

Хотя фиг их Intel"овцев знает, может придумаи чё-нибудь :)))


 
ProgRAMmer Dimonych ©   (2007-01-17 15:43) [14]

придумали


 
evvcom ©   (2007-01-17 15:48) [15]

> [13] ProgRAMmer Dimonych ©   (17.01.07 15:42)
> Хотя фиг их Intel"овцев знает, может придумаи чё-нибудь
> :)))

Это скорее в типографии придумщики сидят :)))
А Интел, когда придумал Reg32, это в 80386 воплотил, но никак не в 8086 Second Revision :)))


 
Зм1й ©   (2007-01-17 15:59) [16]


> Берешь мануал по архитектуре конкретного процессора конкретного
> производителя

Нужно всреднем для всех процессоров Pentium.

> ProgRAMmer Dimonych ©  

Спасибо большое! но кое-что не ясно. mem8/16/32 - это byte/word/integer? (Пишу на Delphi, asm не знаю)
8088       8086      80286     80386     80486     Pentium - из этого нужен только Pentium.
И ещё хотлось бы информацию по дельфийским функциям sqr, sqrt, sin, cos, abs, log... Если не трудно


 
Зм1й ©   (2007-01-17 16:05) [17]

Получается, что inc и dec работают медленнее, чем sub и add?


 
evvcom ©   (2007-01-17 16:09) [18]

> [17] Зм1й ©   (17.01.07 16:05)

С чего это? Одинаково.


 
Сергей М. ©   (2007-01-17 16:09) [19]


> asm не знаю


Тогда зачем тебе всё это ?

> хотлось бы информацию по дельфийским функциям sqr, sqrt,
>  sin, cos, abs, log


Дельфийские функции и "основные арифметические операции" процессора - вовсе не одно и то же. Вызов той или иной дельфийской функции (если она не относится к in-line) приводит к исполнению процессором более чем одной маш.инструкции.


 
Зм1й ©   (2007-01-17 16:16) [20]


> Дельфийские функции и "основные арифметические операции"
> процессора - вовсе не одно и то же. Вызов той или иной дельфийской
> функции (если она не относится к in-line) приводит к исполнению
> процессором более чем одной маш.инструкции.

Хорошо, возможно я не совсем точно выразился, мне нужно именно скорость функций.


 
Сергей М. ©   (2007-01-17 16:22) [21]


> мне нужно именно скорость функций


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


 
Зм1й ©   (2007-01-17 16:36) [22]

Но есть же какие-то рамки? Мне только важно знать, как относится время выполнения одной функции к времени выполнения другой. То есть информации типа "+ всреднем в 4-11 раз быстрее, чем * и в 20.5 раз быстрее, чем sqrt" мне вполне достаточно


> evvcom ©   (17.01.07 16:09) [18]
> > [17] Зм1й ©   (17.01.07 16:05)
>
> С чего это? Одинаково.

Я думал, inc и dec быcтрее


 
evvcom ©   (2007-01-17 16:47) [23]

> [22] Зм1й ©   (17.01.07 16:36)
> Я думал, inc и dec быcтрее

Что для тебя быстрее к 1 прибавить 1 или 2? Или ты думаешь проц будет двойку в цикле два раза по единице прибавлять? :)


 
ProgRAMmer Dimonych ©   (2007-01-17 16:51) [24]

> Я думал, inc и dec быcтрее
Inc и Dec в Delphi - быстрее в большинстве случаев. Дело вот в чём: a:=a+1 может с равной вероятностью оказаться на выходе компилятора как add [5132DDFD], 1 (например), так и inc [5132DDFD], но если компилятор настроен работать медленнее, но по-умному, то второй вариант - скорее всего + будет автоматически помещено значения ячейки по адресу [5132DDFD] в регистр, т.е. процесс ускорен, хотя и незначительно (плюс процессор не будет разбираться, что же там за единица такая после add). Ну, и читаемость программы лучше с Inc"ом.


 
ProgRAMmer Dimonych ©   (2007-01-17 16:51) [25]

> Я думал, inc и dec быcтрее
Inc и Dec в Delphi - быстрее в большинстве случаев. Дело вот в чём: a:=a+1 может с равной вероятностью оказаться на выходе компилятора как add [5132DDFD], 1 (например), так и inc [5132DDFD], но если компилятор настроен работать медленнее, но по-умному, то второй вариант - скорее всего + будет автоматически помещено значения ячейки по адресу [5132DDFD] в регистр, т.е. процесс ускорен, хотя и незначительно (плюс процессор не будет разбираться, что же там за единица такая после add). Ну, и читаемость программы лучше с Inc"ом.


 
Сергей М. ©   (2007-01-17 16:57) [26]


> Зм1й ©   (17.01.07 16:36) [22]


Можно поинтересоваться, для чего тебе понадобилась такая статистика ? Тем более для сравнительного анализа ф-ций, реализующих в общем случае совершенно разные алгоритмы ? Т.е. ну определил ты, что Sqrt() в среднем выполняется в 1000 раз дольше, нежели, скажем Inc() - что дальше ? Как ты намерен использовать эти стат.данные ?


> Мне только важно знать


Ну если уж так важно, то в общем случае ты можешь произвести интересующие замеры самостоятельно по такому алгоритму:

1. Запретить тек.потоку выполнение более чем на одном ЦП.
2. Повысить приоритеты тек.процесса и тек.потока до критических.
3. Получить значение тек.времени (в чем угодно, хоть в тиках) - это будет нач.временем.
4. Вызвать интересующую ф-цию.
5. Получить значение тек.времени в тех же единицах - это будет конечное время, вычесть из него запомненное на шаге 4 значение нач.времени
6. Восстановить приоритеты тек.процесса и тек.потока с прежними значениями.
7. разрешить тек.потоку, если необходимо, выполнение более чем на одном ЦП.

Ферштейн ?


 
evvcom ©   (2007-01-17 17:03) [27]

> [26] Сергей М. ©   (17.01.07 16:57)
> 4. Вызвать интересующую ф-цию.

Обернуть это дело в длинный цикл, иначе скорее всего [5.] - [3.] будет = 0 :)


 
Зм1й ©   (2007-01-17 17:09) [28]


> Можно поинтересоваться, для чего тебе понадобилась такая
> статистика ?

Понимаешь, допустим у меня есть два алгоритма. Ну например, проверка, лежит ли данная точка внутри треугольника. Один содержин много простых операций (+, -, *), а другой меньше, но 3 arccos - вот и надо теоретичски посчитать, какой алгоритм быстрее. В общем одним словом - оптимизация :)

> у если уж так важно, то в общем случае ты можешь произвести
> интересующие замеры самостоятельно

Попробую, просто я думал, что всё давно подсчитанно до меня...


 
Сергей М. ©   (2007-01-17 17:11) [29]


> evvcom ©   (17.01.07 17:03) [27]


На то, кажись, есть RTDSC - прямой ее вызов из PL3 не запрещен.


 
Сергей М. ©   (2007-01-17 17:14) [30]


> Зм1й ©   (17.01.07 17:09) [28]


Игродел что ли ?)


 
Зм1й ©   (2007-01-17 17:34) [31]


> Сергей М. ©   (17.01.07 17:14) [30]

Да


 
Сергей М. ©   (2007-01-17 17:42) [32]


> Зм1й ©   (17.01.07 17:34) [31]


Нормальные игроделы не заморачиваются этой хренью, а используют фирменные (от производителей ЦП) библиотеки, реализующие нужную функциональность с использованием наборов инструкций MMX, XMM, SSE[2|3], 3DNow и иже с ними. Уж кому как не производителю ЦП лучше знать, как быстрей вычислить десятки тысяч произведений векторов на матрицу вращения)


 
Rial ©   (2007-01-17 17:53) [33]

Навсегда постарайся забыть про все тригонометрические функции.
Они как правило в 10-20 раз медленее умножения и деления.
Поэтому делай все рассчеты в векторном виде без Sin и Cos.


 
ors_archangel ©   (2007-01-17 19:56) [34]

Опять эта проблема sin/cos :(


 
Anatoly Podgoretsky ©   (2007-01-17 20:22) [35]

> Зм1й  (17.01.2007 14:44:00)  [0]

Зависит от типа процессора (Step) и от предыдущих команд, теоритически до 5 команд за такт.


 
Зм1й ©   (2007-01-19 13:35) [36]

В общем, посчитал я, получилось следущее


                Double     Integer

:=, +, -, *, /     7           7
=, <>, >=, <=      9           9
Abs, Sqr           9           7
Round             173         173
Sqrt              194         194
Trunc             254         237
Sin               646         630
Cos               978         985
LogN              1255        1076
ArcSin            1670        1292
ArcCos            1743        1434


Похоже на правду?

P. S. Только не думайте, что я это 2 дня считал, времени нет:)


 
Сергей М. ©   (2007-01-19 13:45) [37]


> Зм1й ©   (19.01.07 13:35) [36]


Результаты измерений в попугаях ?


 
Думкин ©   (2007-01-19 13:47) [38]

А зачем Double? И что есть arcsin от integer(-1,0,1)?


 
Зм1й ©   (2007-01-19 13:55) [39]


> Результаты измерений в попугаях ?

Единицы измерения не важны, важно соотношение. Но в таблице мс на 10 млн. операций, P4-2.26.


> И что есть arcsin от integer(-1,0,1)?

Не понимаю тебя


 
Думкин ©   (2007-01-19 13:59) [40]


> Зм1й ©   (19.01.07 13:55) [39]

Ты написал, что вычислял функции при разных типах аргументов. В частности приведены результаты для arcsin. На пересечении строчки arcsin и столбца integer видим число. Мне вот и интересно что ты считал. Или я все неправильно перепутал?



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2007.02.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.044 c
2-1169740671
dest81
2007-01-25 18:57
2007.02.11
select .... like %


11-1147773413
AlexY
2006-05-16 13:56
2007.02.11
ActiveDirectory + KOLEdb.


6-1157972778
wezzz
2006-09-11 15:06
2007.02.11
Защита почтовых сообщений.


3-1163950706
REM02
2006-11-19 18:38
2007.02.11
D7 = IB 7.5 BLOB


15-1169024822
lookin
2007-01-17 12:07
2007.02.11
ICQ с телефона





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский