Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2008.01.13;
Скачать: [xml.tar.bz2];

Вниз

Sin Cos   Найти похожие ветки 

 
DevilDevil ©   (2006-11-20 16:49) [40]

Выставь в опциях компилятора "Оптимизацию", может поможет... но верить в такую глупость компилятора мне, честно говоря, не хочется...


 
rts111 ©   (2006-11-20 20:22) [41]

Это не глупость, непосредственно загрузить регистр сопроцессора
содержимым регистра общего назначения, насколько я знаю, нельзя.


 
DevilDevil ©   (2006-11-21 12:23) [42]

> регистр сопроцессора
и
> регистр общего назначения

Чем отличаются?

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


 
rts111 ©   (2006-11-21 17:24) [43]

> DevilDevil ©   (17.11.06 19:11) [38]

Не поленился, проверил :)
Работают такие варианты:

// если обявить TFLOAT_int = integer при вызове SinCos1( TFLOAT_int(v1) , v2 , v3 ) компилятор ругается

// А вот так работает:
type TFLOAT_int = pointer;

// !!! Только все равно нужно передавать не адрес, а значение, pointer - только потому
// чтобы Alpha в SinCos1 воспринимался как 32-витное значение


procedure SinCos1( const Alpha :TFLOAT_int; var Sin,Cos :Single ); register;
asm

// FLD EAX   - если так, то не компилится

// можно так сделать
PUSH EAX
FLD  DWORD PTR[ESP]
POP  EAX

FSINCOS
FSTP DWORD PTR[ECX] // Cos
FSTP DWORD PTR[EDX] // Sin
end;

// Здесь компилятор сам добавляет pop...push, как я понял это потому что Alpha - вещественный тип
procedure SinCos2( const Alpha :single; var Sin,Cos :Single ); register;
asm
FLD  Alpha
FSINCOS
FSTP DWORD PTR [EDX]
FSTP DWORD PTR [EAX]
end;

procedure SinCos3( var Alpha {EAX} , Sin {EDX} , Cos {ECX} :Single );
asm
FLD  DWORD PTR[EAX]
FSINCOS
FSTP DWORD PTR[ECX] // Cos
FSTP DWORD PTR[EDX] // Sin
end;

procedure TForm1.Button1Click(Sender: TObject);
var
t0,t1,t2 :int64;
i        :integer;
v1,v2,v3 :single;
begin
QueryPerformanceCounter(t1);

v1:=Pi/2;

for i:=1 to 1000000 do
SinCos1( TFLOAT_int(v1) , v2 , v3 );  // 1 место(самый быстрый)
//SinCos2( v1 , v2 , v3 );            // 3 место
//SinCos3( v1 , v2 , v3 );            // 2 место  

QueryPerformanceCounter(t2);
//QueryPerformanceFrequency(t0);

caption:=inttostr(t2-t1)+"   "+floattostr(v[2]);

end;


 
ors_archangel ©   (2006-12-10 12:33) [44]


> DevilDevil ©   (02.11.06 17:43) [35]
> функции sqr, sqrt, sin, cos, ... в любой версии Delphi
> вызываются инлайнами,

А вот я давно думаю о dcc (уж про v15 точно) крайне пессимистично, и часто правильно:
ведь cos = call @COS, который есть:

procedure       _COS;
asm
       FCOS
       FNSTSW  AX
       SAHF
       JP      @@outOfRange
       RET
@@outOfRange:
       FSTP    st(0)   { for now, return 0. result would }
       FLDZ            { have little significance anyway }
end;
Кстати, ни у кого нет исходников компилера Делфи, хочу сделать там поиск слова optimization, вдруг найду  :\

very fast!

> Сергей М. ©   (02.11.06 11:36) [25]
> приложения используют на полную мощь MMX/XMM/SSE/SSE2/SSE3/3DNow

Кстати, пробовал, ужасно тормозит, видимо, что-то не так делаю! как их юзать то!!! (пытался ускорить DotProduct, никто не делал через SSE2?)
p.s. Тестирование sin/cos таблиц нужно производить не на последовательное их вычисление, а в реальном алгоритме, т.к. так таблица у нас в кэше и всё при тесте, а в реале оно может не совсем так быть.
p.s.s. В DOOMе ещё удобно было, что углы были 0..255 и сами клиппились, удобно...


 
DevilDevil ©   (2006-12-10 21:24) [45]


> ведь cos = call @COS, который есть:


Уренда какая-то. Как я не исполльзовал, вызываются инлайнами. И уж точно не такой код (короче в разы)


> Кстати, пробовал, ужасно тормозит, видимо, что-то не так
> делаю! как их юзать то!!!


Чтобы добиться реального прироста производительности от SSE~, обработку всей последовательности данных в одной подпрограмме. Ещё там фишка с выравниванием данных; в этой подпрограмме как можно реже (а лучше вообще не)  использовать обычные команды процессора.


 
ors_archangel ©   (2006-12-11 01:42) [46]


> DevilDevil ©   (10.12.06 21:24) [45]

Специально проверил, $o+, $a8, $r-, $q-, всё равно компилит вызов на вышеуказанную функцию, у меня Delphi 7 Enterprise build 4.453.
А не можешь пример SSE-кода?


 
DevilDevil ©   (2006-12-11 10:45) [47]

> А не можешь пример SSE-кода?

Не можешь. Советую идти на www.wasm.ru



Страницы: 1 2 вся ветка

Форум: "Игры";
Текущий архив: 2008.01.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.007 c
11-1182424519
LazyBob
2007-06-21 15:15
2008.01.13
Некорректный шрифт на KolGroupBox


2-1197379394
cvg
2007-12-11 16:23
2008.01.13
Как заставить чарт отображать только последний час?


3-1189077558
Farel
2007-09-06 15:19
2008.01.13
Remote locate base


4-1182121776
NOOBIX
2007-06-18 03:09
2008.01.13
Я многого достиг в Delphi


6-1173537006
lego1as
2007-03-10 17:30
2008.01.13
Отослать письмо





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский