![]() |
|
|
![]()
|
|
| comcon1 |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: нет Всего: 17 |
В общем, занялся профилированием своей проге. Отловил функцию, запускающуюся порядка
миллиардов раз и жрущую процентов 40-30 времени. Больше всех. Я ее чуть подкорячил. Время выполнение ее упало, а других - выросло!! Как такое может быть. Смотрю плоские профили - все функции выполнялись в разных вариантах одинаковое число раз. Но только, суммарное время ВЫРОСЛО! Как такое может быть?? Компилю этим: ============ gcc-3.4.4 cygwin Прога у меня кросс. Но в линухе еще не пробовал. Она компилится и без цигвина, но в ДевЦпп у меня профилер глючит почему-то. Вот было:
Стало:
А в плоском профиле было:
А Стало ВОТ ЧО:!!!
А общее время по профилю выросло на 10%. Как такое получается?? Может, я чо совсем не так делаю.. И еще - Можно ли сделать асм-вставку?? Или нет смысла? |
||||||||
|
|||||||||
| szz |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1289 Регистрация: 31.5.2005 Где: Moscow, Jerusalem Репутация: нет Всего: 33 |
так это же инлайн! Ты порекомендвал компилтору вместо отдельной функции просто вставлять ее тело прям в вызываемое место.
Добавлено @ 02:05 Почитай на википедии поподробнее --------------------
|
|||
|
||||
| vitlic |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 22.2.2007 Где: где home(){return где="тут"} Репутация: нет Всего: 1 |
Согласен с szz
попробуй убрать inline Мейрс о возможных причинах:
Это сообщение отредактировал(а) vitlic - 28.2.2007, 02:17 |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: нет Всего: 17 |
Понял. Попробую.
вставление функции инлайн приводит к разрастанию кода. Но и производительность должна вырасти, вроде. Прога, кстати жрет мало памяти - метра 2-5. |
|||
|
||||
| MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 1 Всего: 207 |
Это сообщение отредактировал(а) MAKCim - 28.2.2007, 11:11 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: нет Всего: 17 |
а не быстрее ли цикл
или там загрузить массив hydro в регистр EDX при помощи стоса и с ним работать?? Поясните плиз, где прочитать про специфику асм вставок в GCC. А то я посл. раз писал лет пять назад в турбо-паскале, дык там как-то просто было. Или хотя бы поясни на примере. |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: нет Всего: 17 |
Все, с GCC-шным ассемблером я разобрался.
Вот мой последний более быстрый вариант.
Модератор, перенесите, пожалуйста в ассемблер. Хочу обсудить дальнейшие ускорения. Или если ускорений больше быть не может, закройте тему) |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 1 Всего: 207 |
comcon1,
я бы сделал вместо loop, dec + jnz -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: нет Всего: 17 |
у меня в доке к 486 стоит такты:
jnz - 3/1 dec - 1 loop - 2 когда циклит loop - 6 когда выходит Таким образом, твой вариант: (1+3)*4 = 16 Мой вариант: 2*3+6 = 12 Что изменилось на 686 принципиально? ЗЫ. + сама инструкция луп занимает меньше памяти, чем jnz+dec Это сообщение отредактировал(а) comcon1 - 2.3.2007, 23:28 |
|||
|
||||
| sgi1981 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 16.3.2006 Репутация: 7 Всего: 10 |
Работает.
При условии, что массив hydro типа char (каждый элемент по 1 байт). Используется расширение SSE. Возможно, разные компиляторы поддерживают разное мнемоническое обозначение MMX-регистров, так что поправляйте...
-------------------- Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства. |
||||
|
|||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 3 Всего: 121 |
C момента 486 процессоры ушли ТАААК далеко, что на данный момент прогнозировать скорость выполнения одной машинной инструкции просто бесполезно, слишком сложна архитектура сейчас. Можно лишь говорить о кол-ве тактов за которые декодируются команды или судить о скорости их выполнения в общей массе. Ну можно предположить, что dec выполнится за один такт совместно с другой командой, т.к. результаты выполнения dec и вышестоящих команд не пересекаются, а дальше уже jnz(где на первых иттерациях будут кэш-промахи, но после процессор может "предсказать" переход), в то время как loop не будет выполнена, пока не выполнятся все команды в цикле. Это сообщение отредактировал(а) W4FhLF - 3.3.2007, 06:48 -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: нет Всего: 17 |
где читать про эти команды?? На взгляд код выглядит очень большим... Что именно ускорится?? |
|||
|
||||
| sgi1981 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 16.3.2006 Репутация: 7 Всего: 10 |
Да, код немного больше, чем коды предыдущие. Но есть преимущества. 1 - Отсутствуют циклы. Часть последовательности инструкций выполняется один раз и все. 2 - Реально выполняется только одна из двух частей последовательности инструкций. Какая именно часть выполнится - зависит от значения exists. 3 - Оператора return не нужно. Функции, возвращающие целочисленный результат, возвращают его в регистре eax. И того, считаем количество инструкций, выполняемых если exists=1 pxor mm2,mm2; cmp exists,0; jz @p1; mov eax,dword ptr hydro; mov edx,01010101h; movd mm0,eax; movd mm1,edx; pcmpeqb mm0,mm1; pand mm0,mm1; psadbw mm0,mm2; movd eax,mm0; jmp @end1; ;------------------------------- @end1:emms; То бишь 13 инструкций. При exists=0 pxor mm2,mm2; cmp exists,0; jz @p1; ;--------------------------- @p1: mov eax,dword ptr hydro; mov edx,0ffffffffh; movd mm0,eax; movd mm1,edx; pcmpeqb mm0,mm1; mov edx,01010101h; movd mm1,edx; pand mm0,mm1; psadbw mm0,mm2; movd eax,mm0; @end1:emms; 14 инструкций. И тут есть преимущества самого кода. Инструкции, результат выполнения которых не влияет на результат выполнения последующей инструкции выполняются параллельно. Добавлено @ 15:38
Про инструкции SSE, SSE2, SSE3, 3DNow! читать в документации по процессору. Документация на английском. http://developer.intel.ru/design/pentium4/documentation.htm Или можно из книги, лучше справочник по ассемблеру, Виктора Юрова, например. Там на русском. -------------------- Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства. |
||||
|
|||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: нет Всего: 17 |
Скачал Юрова и документацию с Intel-а. Ботаю SSE. Всем спасибо.
Осилю - выложу код с гонками. |
|||
|
||||
![]()
|
| Правила форума "Asm: Общие вопросы" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |