Надо протестить насколько плох кодогенератор С++ (предположительно gcc) по сравнению с ручным написанием кода на асме. Естественно результат должен говорить о преимуществах асма) Подскажите какой-нибудь подходящий алгоритм для теста
какойнить алгоритм обработки изображений - фильтрация, наложение с альфа каналом (а если MMX задействовать, прирост в скорости в сравнении с gcc будет весьма существенным), а разницу в скорости можно смерить к примеру rdtsc .. ну или если нечего делать - вычисли число Пи размером в несколько мегабайт...
хм... нда самому стало интересно, главна сделай тест с операциями с числами с плавающей точкой.. мой асм код как-то раз "уделал" дельфишный кодогенератор именно на работе с FPU.. хоть и потом справедливость вострожествовала
GoldFinch Кодогенераторы С++ (MS VS, GCC) с опциями оптимизации по скорости такой код могут выдать. Что вам просто будет бессмысленно с ними соперничать. Здесь на форуме людей, владеющих асмом на таком уровне, чтоб сходу писать код, оптимизируемый по быстродействию - не так много. ИМХО (вдру тут все умнее меня ^_^)
TermoSINteZ Любой кодогенератор генерит по определённым шаблонам не особо разбирая "внешние условия",то есть если разобрать конкретный проц - время выполнения команд, архитектуру кэша, шины и т. п. короче можно написать код который ни один кодогенератор не "опередит", но вопрос в том зачем это нужно, для евридей кодинга это плохо подходит имхо подобная экстремальная оптимизация требует времени и знаний да и будет быстрее работать на какомто определённом типе процов, хотя можно сделать несколько вариантов кода под разные вариации архитектур, но опять же на это надо время...так что смысл есть если в этом только чисто спортивный интерес...
Exp10der Ну вот и я о том. А у автора топика уйдет ой как много времени для осознания : Так что посоветовав ему сжатие\обработку изображений - сильно. Пусть лучше с оптимизирует расчет каких нибудь косинусов, рядов. Вот числа Пи, подойдет. Сортировка - тоже. И кстати сортировка в плане асма выгоднее - хотя опять же, можно написать такой кошмар на С++, компилятор просто ниче не будет оптимейзить, можно даже на асме в лоб писать - будет быстрее. А вообще в разделе A&O Black_mirror кучу задач постил, и показывал офигенные приемы оптимизации.
GoldFinch Преобразование чисел в строки, объект вектор и т.п., и вообще практически любая функция из стандартных библиотек crt, mfc, atl, и т.д. даже топорно написанная на асме будет лучше Правда это не значит что её нельзя хорошо написать на сях, но только кто же из hilevel-щиков этим занимается? )) для них повторное использование готового кода гораздо важнее его качества. Ну и FPU-шное распараллеливание осваивается достаточно легко, чтобы без проблем обходить компиляторы, которые его не только не параллелят, а вообще шибко тупят. Да и в обычном коде "время выполнения команд, архитектуру кэша, шины" знать по полной программе нужно только для "ловли блох", а так читаешь Фога, нахватываешся полезных приёмов и более менее общих принципов и обгонишь всё что угодно
а это ты зря, 5-10% в скорости лишними врядли будут, тут речь идёт о обгоне компилера, а не обычном повседневном кодинге, где это н..х не нужно
Exp10der Во первых я и имел в виду, что обогнать компилятор, можно даже не увлекаясь ловлей блох, которая при очень мелком гребешке иногда может дать и больше чем 5-10% ) А во вторых обгон компилятора в повседневном кодинге это и есть самое интересное ибо именно повседневный кодинг - основной козырь hilevel-щиков )
Интерес исключительно спортивный, кроме того, код для С++ буду писать не я, и способы реализации алгоритма скорее всего будут разные. У меня есть задумка взять такой алгоритм, который можно будет очень эффективно решить на асме например за счет особого выбора диапазона входных данных. Например: требуется в цикле 10000000 раз вычислить некоторую очень сложную функцию float f(float x), причем 0<=x<1, погрешность результата не более 0.5% это значит что x лежит в диапазоне от 0 до 0x3F80000-1, это 2^30 значений загрубим точность отрезав 4 младших разряда, получим 2^26 значений, по которым можно сделать таблицу из 4*2^26 = 256Мб, которая легко влезет в ОЗУ. А чтоб компенсировать отрезанные разряды, младшие разряды результата можно рандомизировать. Думаю ни 1 С++ программист до такой оптимизации не догадается) Осталось только подобрать функцию помедленее, чтоб данные из таблицы в ОЗУ извлекались быстрее чем она считалась
конешно до техники кэширования ни один С++ программист не догадается они все тормазы только оссемблерщеки догадываются честь им и хвала вы бы лучше 3D-шутер написали или офис на осемблере и сравнили его с аналогичным на плюсах а сейчас вы занимаетесь самоудовлетворением, причем подбираете для себя любимого "заранее" выигрышный, какой вам удобнее, ракурс. далее загнете пальцы и скажете что "плюсы гуан, за осемблером будущее".
да лучше уж вообще ОСь (менует ос мягко говоря до названия "ОС" недотягивает.. так прога работающая в защищённом режиме (недоОС), вот что нить типа мандривы или ХРюши на асме бы забацать... чтоб летало всё это...
varnie я прекрасно осознаю преимущества ЯВУ, преимущества асма и области их применения просто мне надо исключительно для спортивного интереса придумать алгоритм который среднестатистический С++ программист слабо знакомый с асмом не сможет хорошо реализовать
GoldFinch что значит "хорошо реализовать"? любой нормальный программист реализует алгоритм. хоть на бейсике. так бы и сказал: хочу померяться своим асм-кодом, пишущимся вручную, с асмом, который генерят мейнстримовые С++ компилеры. сравнивать же асм и ЯВУ, мягко говоря, некорректно. IMHO.
GoldFinch > Надо протестить насколько плох кодогенератор С++ (предположительно gcc) > по сравнению с ручным написанием кода на асме. Естественно результат > должен говорить о преимуществах асма) то есть, ты уже знаешь результат и теперь хочешь подобрать под него подходящий тест? RTTI в плюсах тормозят даже седьмой пень и асм рвет такой код как тузик грелку.