Форум: "Прочее";
Текущий архив: 2007.11.25;
Скачать: [xml.tar.bz2];
ВнизОбъясните? Найти похожие ветки
← →
@!!ex © (2007-10-25 23:40) [0]Сегодня основательно увлекся переписыванием частей на asm+SSE и нашел непонятный мне момент в коде, который генерит компилятор Delphi.
Имеем функцию вида:function MagnitudeVector(const Normal: TVector): Single;
begin
Result := Sqrt((Normal.x * Normal.x) + (Normal.y * Normal.y) + (Normal.z * Normal.z));
end;
Смотрим CPU Window и видим странный код:....
faddp st(1)
fsqrt
fstp dword ptp [esp]
wait
fld dword ptr [esp]
Собственно вопрос в последних трех строчка. ЗАЧЕМ?
Зачем мы сначала вытаскиваем значение из стэка, а потом заносим его обратно??
← →
vpbar © (2007-10-25 23:41) [1]А может это просто "оптимизация" делфи такая
ЗЫ с вещественными операциями я на Вы, та что могу быть не прав.
← →
@!!ex © (2007-10-25 23:50) [2]> [1] vpbar © (25.10.07 23:41)
Да уж... Оптимизация. :) Две лишних команды, которые НИКАК не меняют результат. :\
Хоть бери и все функции переписывай... Так в КАЖДОЙ функции, которая возвращает вещественное число. :(
← →
vpbar © (2007-10-25 23:53) [3]>>@!!ex © (25.10.07 23:50) [2]
Нуу. У него бывает. Это я точно знаю. Если нужно очень оптимально - то переписывай на асме. Или бери хороший компилятор Си и пиши там.
← →
Сусл © (2007-10-25 23:54) [4]если есть весомые претензии к компиляции, то советую публичную группу basm на кодгире. там из fastкода бывают люди.
имхо, весьма поучительно.
один недостаток - быстрее нашего форума не найти места - ответ почти сразу!
← →
Ins © (2007-10-26 00:05) [5]
> @!!ex © (25.10.07 23:40)
Бывает. Сам часто наблюдал, как компилятор генерирует код, гоняющий значения из регистров в память и обратно, при этом смысловой нагрузки никакой. Чаще всего на это можно закрыть глаза, но бывает и критично - в этом случае садимся и переписываем на асме. Хотя иногда помогает записать выражение чуть по-другому, например сложное разбить на несколько простых и вычислить постепенно. А иногда не помогает.
← →
Sapersky (2007-10-26 13:25) [6]С floating point дельфийский компилятор не очень дружит:
http://dennishomepage.gugs-cats.dk/CodingForSpeedInDelphi.doc
Вроде я уже давал эту ссылку, в ветке про обращение матриц, нет? :)
← →
@!!ex © (2007-10-26 13:28) [7]> [6] Sapersky (26.10.07 13:25)
Может и давал, но я ее не видел. сейчас смотрю. Спасибо.
← →
Сергей М. © (2007-10-26 13:40) [8]
> @!!exprocedure MagnitudeVector(const x, y, z: Double; out Result: Single);
begin
Result := Sqrt((x * x) + (y * y) + (z * z));
end;
Такая реализация избавит результ.маш.код от бестолковых финальных манипуляций с вершиной FPU-стека.
Касаемо же WAIT - увы и ах, от нее никак не избавиться.
А причем здесь SSE ?
← →
@!!ex © (2007-10-26 13:44) [9]> [8] Сергей М. © (26.10.07 13:40)
Такая реализация - это извращение. ИМХО...
SSE здесь при том, что позволяет выполнять все умножения одной командой без применения FPU.
← →
@!!ex © (2007-10-26 13:45) [10]Собственно вот:
asm
movUps xmm0, [eax]
mulps xmm0, xmm0
movUps [tmp], xmm0
fld tmp.x
fadd tmp.y
fadd tmp.z
fsqrt
wait
end;
← →
DevilDevil © (2007-10-26 13:52) [11]1) поставь в опциях компилятора "оптимизировать"
2) если не поможет, то попробуй:function MagnitudeVector(const Normal: TVector): Single;
begin
MagnitudeVector := Sqrt( sqr(Normal.x) + sqr(Normal.y) + sqr(Normal.z) );
end;
← →
@!!ex © (2007-10-26 14:01) [12]> [11] DevilDevil © (26.10.07 13:52)
Да я уж на асме переписал.
Вопрос не в само вычислении, а в том, как в результат данные кладутся. И кладутся они туда независимо от того, какая функция, всегда через ****
← →
Сергей М. © (2007-10-26 14:19) [13]
> Такая реализация - это извращение
Никакого извращения.
> Собственно вот:
А wait зачем воткнул ?
← →
@!!ex © (2007-10-26 14:29) [14]> [13] Сергей М. © (26.10.07 14:19)
ну это как бы ожидание выполнения действий сопроцессором...
без него низя
← →
Sapersky (2007-10-26 14:31) [15]Ещё можно попробовать inline (BDS2006, может и в 2005 есть, не помню).
← →
Сергей М. © (2007-10-26 14:33) [16]
> без него низя
Ты ж не для 8087/80287 пишешь)
← →
@!!ex © (2007-10-26 14:34) [17]> [16] Сергей М. © (26.10.07 14:33)
Поясните, плиз..
Я просто думал, что wait - это обязательная команда и без нее может возникнуть множество неприятных багов...
← →
@!!ex © (2007-10-26 14:36) [18]> [15] Sapersky (26.10.07 14:31)
1) Спасибо за ссылку, отличная вещь! Правда у меня AMD и vtune не пашет. :((
2) Пишу на D7.. в ней нету inline... думюа написать свой обработчик, который будет запускаться перед компиляцией и заменять указанные функции inline аналогами.
← →
Сергей М. © (2007-10-26 14:41) [19]
> думал, что wait - это обязательная команда
Начиная с Пней она необязательна.
← →
homm © (2007-10-26 14:46) [20]> [19] Сергей М. © (26.10.07 14:41)
> Начиная с Пней она необязательна.
А К5 ?
← →
Сергей М. © (2007-10-26 14:48) [21]
> homm © (26.10.07 14:46) [20]
Не знаю.
Мануал надо почитать.
← →
@!!ex © (2007-10-26 14:51) [22]Сергей М., вашей анкеты не существует...
← →
Сергей М. © (2007-10-26 14:54) [23]
> @!!ex © (26.10.07 14:51) [22]
Мне надоело ее восстанавливать после каждого вселенского катаклизма)
← →
@!!ex © (2007-10-26 14:55) [24]> [23] Сергей М. © (26.10.07 14:54)
Понятно. :) Знакомо. :)
← →
Sapersky (2007-10-26 15:39) [25]В той же ветке про обращение матриц кто-то писал, что при серьёзном намерении бороться за скорость проще не мучиться и взять Intel C++ (писать на нём dll). Он и SIMD может использовать сам, и профилировщик/оптимизатор там встроенный.
← →
Сергей М. © (2007-10-26 15:48) [26]
> взять Intel C++ (писать на нём dll)
Да и писать никакие dll не надо, все уже до нас написано - Intel MKL.
← →
@!!ex © (2007-10-26 15:49) [27]еще одна dll в проекте.. фууу. беее. их там уже и так три!
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2007.11.25;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.043 c