Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.25;
Скачать: CL | DM;

Вниз

Объясните?   Найти похожие ветки 

 
@!!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]


> @!!ex


procedure 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.019 c
15-1192890186
Petr V. Abramov
2007-10-20 18:23
2007.11.25
посоветуйте программу для работы с Motorola L6


2-1194021209
Riply
2007-11-02 19:33
2007.11.25
Не юникодные платформы.


15-1192992887
@!!ex
2007-10-21 22:54
2007.11.25
Восстановление аккаунта The Bat


3-1184139774
Krants
2007-07-11 11:42
2007.11.25
ADO, найти Key


2-1194089436
timekiller
2007-11-03 14:30
2007.11.25
Делим строку на символы, практически..