Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: ASM вставки  (Прочитано 12124 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« : 25-04-2007 16:14 » 

Начало здесь
https://forum.shelek.ru/index.php/topic,10178.msg151988.html#msg151988



LogRus, выпендреж это еще что Улыбаюсь Я видел как люди писали ассемблерную вставку, думая, что add быстрее чем + в С. А после дизассемблирования было отлично видно как всю оптимизацию компилятору этой вставкой порушили и вместо выигрыша в несколько команд получался наоборот проигрыш, и это без учета сохранения регистров в стек.

Ассемблер сам по себе знать полезно, на мой взгляд. Точнее полезно знать принципы работы с процессором. Но реально, кроме микроконтроллеров и дизассемблирования его сейчас негде применить с пользой.
« Последнее редактирование: 26-04-2007 11:18 от Джон » Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 25-04-2007 18:41 » 

Scorp__), совершенно согласен, но есть пару НО... Ассемблер иногда существенно быстрее кода, сделанного компилятором. В некоторых случаях на С просто невозможно что-то сделать процессорозависимое: MMX  и т.п. Кроме того, скажем, gcc неплохо оптимизирует код и с ассемблерными вставками: код ядра Linux изобилует макросами с этими вставками.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 25-04-2007 19:50 » 

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

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

А в среднем, человеку очень сложно держать такой же уровень оптимизации, которого достигают современные компиляторы. Иногда они такие перлы выдают, что кажется сам никогда до этого не додумался бы Улыбаюсь Но при ограниченном объеме кода и неограниченном времени человек, конечно, компилятор обыграет; у меня коллега запихнул тетрис в 300 с небольшим байт, но он жульничал и использовал частные случаи, и добивался того, чтобы некоторые участки кода совпадали с необходимыми данными Улыбаюсь компилятор так не может.
« Последнее редактирование: 25-04-2007 19:55 от Scorp__) » Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 25-04-2007 22:08 » 

IMHO ассемблерные вставки нужно избегать только по одной и большой причине: Переносимость кода на другие системы, с другой картой команд. Все что сделано на ассемблере, лучше не просто выносить в отдельные функции, но и в отдельные модули.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #4 : 26-04-2007 04:59 » 

осторожно флейм!

Как-то раз видел код в котором в массив байт загонялся с компилированный бинарный код фукции и потом после накоторых манипуляции код засунутый в массив использовался как обычная функция. Улыбаюсь я просто выпал в осадок от увиденного
char func[] = {0xFF,0x4b и т.д.}

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

Странно всё это....
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 26-04-2007 11:11 » 

"осторожно флейм!" (с) - "Согласен." (с) Ага

Когда-то в своё время тоже задавался таким вопросом. Просто расскажу о своём "опыте".  Было это в конце 90х прошлого тысячелетия. Тогда компы с 3х GHz  процессорами и 2 GB RAM были не очень распространнены и всё казалось, что прогу надо оптимировать где и как только возможно. Ну а что быстрей асма? Будучи по натуре человеком сумневающимся во всём и вся принялся рыть инет. Сейчас уже не помню, что именно я нарыл (сайт, форум?), но это был какой-то ресурс "игрушечных" программеров. И у них в типсах я нашёл несколько советов по использованию ассемблерных вставок для повышения производительности (если конечно так можно перевести performance) единственно полезной оказалась ф-я "округления" вещественного типа, утверждалось, что она работает быстрей простого кастинга в int
Код:
inline int roundf(float x) 
{
int n = 0;
__asm
{
fld     x
fistp   n
}
return n;
}

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


зы Решил таки проверить, ведь столько лет юзаю.  Для 10 000 000 получил след результаты (для статистики 4 раза Ага )

Код:
inline int roundf2(float x) 
{
int n = 0;
n = (int)(x);
return n;
}

inline int roundf3(float x)
{
int n = 0;
n = (int)(x+0.5);
return n;
}



 да и ещё с ф-ей ceil для сравнения сделал, она округляет в вещественные числа.

Система: P4 2GHz 1GB RAM WinXP Pro VS .NET 2003 Enterpr. Arch. SP1 7.1.6030

Debug компиляция

Res asm: 1109 msec
Res (int): 1500 msec
Res (int)+0.5: 1562 msec
Res ceil: 2235 msec

Res asm: 1079 msec
Res (int): 1500 msec
Res (int)+0.5: 1546 msec
Res ceil: 2219 msec

Res asm: 1062 msec
Res (int): 1516 msec
Res (int)+0.5: 1547 msec
Res ceil: 2250 msec

Res asm: 1094 msec
Res (int): 1485 msec
Res (int)+0.5: 1546 msec
Res ceil: 2219 msec

Release-компиляция

Res asm: 156 msec
Res (int): 406 msec
Res (int)+0.5: 422 msec
Res ceil: 312 msec

Res asm: 156 msec
Res (int): 406 msec
Res (int)+0.5: 422 msec
Res ceil: 312 msec

Res asm: 157 msec
Res (int): 406 msec
Res (int)+0.5: 422 msec
Res ceil: 328 msec

Res asm: 172 msec
Res (int): 406 msec
Res (int)+0.5: 406 msec
Res ceil: 328 msec


"Думайте сами, решайте сами: иметь или не иметь" (с)

* A.zip (72.56 Кб - загружено 1018 раз.)
« Последнее редактирование: 26-04-2007 11:25 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #6 : 28-04-2007 07:39 » 

ну если компилировать с опцией /G7
то результаты значительно лучше.

Res asm: 172 msec
Res (int): 187 msec
Res (int)+0.5: 266 msec
Res ceil: 469 msec

Res asm: 172 msec
Res (int): 266 msec
Res (int)+0.5: 312 msec
Res ceil: 422 msec

Res asm: 172 msec
Res (int): 281 msec
Res (int)+0.5: 266 msec
Res ceil: 453 msec

Res asm: 172 msec
Res (int): 187 msec
Res (int)+0.5: 203 msec
Res ceil: 329 msec

при этом я заменил вызов roundf2
на присваивание
Код:
nAr[i] = fAr[i];
Записан

Странно всё это....
Lara
Гость
« Ответ #7 : 21-04-2008 21:22 » 

Здравствуйте все!
Хотела поинтересоваться как именно осуществлять вставки в с++ с точки зрения синтаксиса языка?

#include "iostream.h"
 main()
{
   Описываю переменные
_asm
   {
         movl     n,%ecx
         xorl     %ebx,%ebx
      arr_input:
         lea     arr(%ebx),%eax
         pusha
   …   …   …     
   }
}

P.S. если можно, очень бы хотелось увидеть рабочий  код какой-нибудь программы со вставкой 
Заранее благодарна)
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #8 : 21-04-2008 23:44 » 

Пример быстрой ф-ции округления до целого:

int roundf(float x)
{
   int n = 0;
   __asm
   {
      fld     x
      fistp   n
   }
   return n;
}
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines