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

Вниз

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

Наверх




Память: 0.55 MB
Время: 0.031 c
15-1197196071
Kostafey
2007-12-09 13:27
2008.01.13
С днем рождения ! 9 декабря


11-1168193605
Ned
2007-01-07 21:13
2008.01.13
Установка KolRas в Delphi 7


3-1188883302
Ulugbek
2007-09-04 09:21
2008.01.13
Как проверить на существование запись ?


1-1192541995
@Ujin
2007-10-16 17:39
2008.01.13
FastScript как обращаться к объекту?


15-1196885533
Cyrax
2007-12-05 23:12
2008.01.13
Авторизованные дилеры и гарантийный ремонт...