Форум: "Потрепаться";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];
Внизexp + ассемблер Найти похожие ветки
← →
Ozone © (2004-03-31 09:38) [0]Подскажите функцию получения exp от комплексного числа на ассемблере.
Спасибо.
← →
Digitman © (2004-03-31 09:47) [1]она у тебя перед носом, в модуле System.pas
procedure _EXP;
asm
{ e**x = 2**(x*log2(e)) }
FLDL2E { y := x*log2e; }
FMUL
FLD ST(0) { i := round(y); }
FRNDINT
FSUB ST(1), ST { f := y - i; }
FXCH ST(1) { z := 2**f }
F2XM1
FLD1
FADD
FSCALE { result := z * 2**i }
FSTP ST(1)
end;
← →
Ozone © (2004-03-31 10:01) [2]Я не понял как ее вызывать.
(и будет ли она работоать правильно с компплексными числами?)
← →
Digitman © (2004-03-31 10:18) [3]пример из JEDI:
type
TComplex = record
Re: Double;
Im: Double;
end;
var
x: Double;
Z: TComplex;
...
x := Exp(Z.Re);
← →
Ozone © (2004-03-31 10:25) [4]Я просто не очень знаком с синтаксисом ассемблеровских процедур - просто хочу уточнить.
Получается, что описаваем как "_EXP()", а вызываем как "EXP()"
← →
Ozone © (2004-03-31 10:25) [5]?
← →
Digitman © (2004-03-31 10:42) [6]тебе вообще зачем это ? для учеб.целей ?
если нет, то Делфи УЖЕ предоставляет ГОТОВЫЙ механизм для вычисления ф-ции .. все что тебе нужно для этого - написать в своей программе код, приведенный в [3]
← →
Digitman © (2004-03-31 10:49) [7]{ ExpZ returns e raised to Z: e^(x + yi) }
function ExpZ(Z: TComplex): TComplex;
var
x: Double;
begin
x := Exp(Z.Re);
Result := ToComplex(x * Cos(Z.Im), x * Sin(Z.Im));
end;
← →
Digitman © (2004-03-31 10:51) [8]{ ToComplex Convert R and I to complex }
function ToComplex(R, I: Double): TComplex;
begin
Result.Re := R;
Result.Im := I;
end;
← →
Ozone © (2004-03-31 10:53) [9]Нет, вообще задача как можно больше ускорить один алгоритм (а именно - БПФ).
Дак все-таки, так оно и есть?
(т.е. описаваем как _exp, а вызываем как exp)?
← →
Digitman © (2004-03-31 11:07) [10]
> задача как можно больше ускорить один алгоритм
ощутимого ускорения можно добиться лишь используя MMX/SSE-инструкции ЦП
здесь же, в теле _EXP, как видишь, ими и не пахнет, ф-ция попросту не "заточена" под БПФ, но что касается вычисления экспоненты как таковой, то делает она это вполне эффективно
← →
Ozone © (2004-03-31 11:09) [11]Поняяятно.... спасибо за информацию.
← →
Digitman © (2004-03-31 11:12) [12]
> описаваем как _exp
не надо ничего "описавать", компилятору уже известен идентификатор ф-ции Exp()
в рез-те вызова тобой ф-ции Exp() компилятор сгенерирует след. код :
- на вершину FPU-стека будет положен аргумент ф-ции
- будет вызвана процедура System._EXP
- результат работы процедуры System._EXP снимается с вершины FPU-стека и помещается в переменную-результат
← →
Ozone © (2004-03-31 11:15) [13]Ааааа, вон оно что! Не знал - спасибо.
← →
Digitman © (2004-03-31 11:16) [14]FLD [Аргумент]
FLDL2E
FMUL
FLD ST(0)
FRNDINT
FSUB ST(1), ST
FXCH ST(1)
F2XM1
FLD1
FADD
FSCALE
FSTP ST(1)
FSTP [Результат]
WAIT
← →
Digitman © (2004-03-31 11:24) [15]реально можно ускорить производительность БПФ-алгоритма, если не использовать FPU вообще (т.е. не использовать FP-представление данных и FP-операции над ними соответственно)
в этом случае следует заранее составить таблицы синусов/косинусов, содержащие целочисленные значения, и использовать искл-но операции целочисленного умножения/деления
в этом случае алгоритм будет в ряде случаев сравним по производительности с алгоритмом, использующим FP-операции и MMX/SSE-интструкции
← →
Digitman © (2004-03-31 11:29) [16]а еще лучше будет не "изобретать велосипед", а задействовать существующие библиотеки, специально "заточеные" под FFT
например, библиотеку, вкодящую в состав пакета IntelSPL (Signal Processing Library) или его более соврем.реализацию - IntelMKL (Math Kernel Library)
согласись, уж кому как не Intel"у лучше знать, как максимально эффективно задействовать MMX/SSE-возможности своих же процессоров для выполнения такого рода задач
← →
Ozone © (2004-03-31 11:37) [17]>>в этом случае следует заранее составить таблицы >>синусов/косинусов, содержащие целочисленные значения, и >>использовать искл-но операции целочисленного умножения/деления
Это ж какая таблица получится!
>>например, библиотеку, вкодящую в состав пакета IntelSPL (Signal
>>Processing Library) или его более соврем.реализацию - IntelMKL
>>(Math Kernel Library)
Хорошо, если я пишу на Си, то как мне ее подключить к проекту?
← →
Digitman © (2004-03-31 11:45) [18]
> Это ж какая таблица получится!
а как ты хотел иначе ?
обычный "закон сохранения" : если в одном месте убыло, значит, где-то в другом месте прибыло
теряешь в размере - выигрываешь в производительности ... и наоборот ..
> если я пишу на Си, то как мне ее подключить к проекту?
точно так же как ты подключаешь к проекту любую иную библиотеку
описание библиотеки и логики ее использования в пакете, например, IntelSPL имеется .. есть и демо-проекты как на С так и на Паскале
← →
Ozone © (2004-03-31 11:49) [19]>>описание библиотеки и логики ее использования в пакете,
>>например, IntelSPL имеется .. есть и демо-проекты как на С так
>>и на Паскале
У Вас есть таковые? (ни в инете, ни у себя ничего не нашел)
← →
Digitman © (2004-03-31 11:58) [20]да, у меня есть ... IntelSPL v4.2 .. 17,1 мб .. качал когда-то с сайта Интела .. сейчас, говорят, недоступна она для скачивания оттуда ... но наверняка есть на других ресурсах сети ... ищи и обрящешь !
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.038 c