Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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]


> @!!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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.043 c
15-1193344929
Сусл
2007-10-26 00:42
2007.11.25
корпоративное решение от google


2-1194020500
mufan
2007-11-02 19:21
2007.11.25
Неразрывный пробел и замена в тексте!


15-1193397825
vajo
2007-10-26 15:23
2007.11.25
Нужно внести изменение в текстовом файле на сайте.


2-1193751520
kyn66
2007-10-30 16:38
2007.11.25
Ошибка при высвобождении объекта


2-1193835387
ChaoX
2007-10-31 15:56
2007.11.25
Параметры запроса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский