Форум: "Игры";
Текущий архив: 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