Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.5 MB
Время: 0.356 c
1-1081311737
Shtukos
2004-04-07 08:22
2004.04.25
Способ сделать демо-версию


9-1067193863
dn
2003-10-26 21:44
2004.04.25
Движки


14-1080679041
real_dimedrol
2004-03-31 00:37
2004.04.25
Транслятор интерпретатор


1-1081590998
CCh
2004-04-10 13:56
2004.04.25
Dll в системе


3-1080212110
DimaF
2004-03-25 13:55
2004.04.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
Английский Французский Немецкий Итальянский Португальский Русский Испанский