|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Evgeny Sharandin 2:5020/755.12 28 Feb 2002 11:22:00 To : Michael Bolotnicov Subject : 8-based FFT -------------------------------------------------------------------------------- Привет Michael! 24 февраля 2002 года (а было тогда 01:45) Michael Bolotnicov в своем письме к All писал: MB> Вопрос1: как-нибудь можно еще ускорить это? Hемного можно, если поменять порядок вычислений и, тем самым, облегчить компайлеру работу. MB> Или уже пора записывать временные данные в регистры CPU, перписывать MB> на асме и прочее? Зачем? Hормальный компилятор (gcc или Intel C сойдут ;) сделает не хуже. Intel C еще и SSE попытается раскрутить. MB> Вопрос2: это портабельно (если договориться о длине float-a) ? Портабельно. А специально договариваться уже давно не требуется - на то ай-яй-яй с ansi и существуют. MB> == Hачало 8FFT.C == MB> #define sq2 0.707106781 MB> void fft8(float *data) { MB> float d[16],e[16]; MB> // precalculations MB> // reusable values 1 MB> d[0]=data[0]+data[8]; // (h0+h4) MB> d[2]=data[4]+data[12]; // (h2+h6) Здесь сразу можно вычислить e[0], e[4]. А так как d[0]/d[2] в дальнейшем не используется, то нет необходимости в их сохранении. Если компилятор достойный, то лобовая запись e[0]=data[0]+...+...+... e[4]=data[0]+...-...-... сгенерится в код без лишних обращений к памяти. MB> d[4]=data[0]-data[8]; // (h0-h4) MB> d[6]=data[4]-data[12]; // (h2-h6) аналогично с e[2]/e[6]. MB> d[8]=data[2]+data[10]; // (h1+h5) MB> d[10]=data[6]+data[14]; // (h3+h7) e[8]/e[12]. Причем, пока они еще в регистрах сопроцессора, то можно сразу вычислить и data[0]. MB> d[12]=data[2]-data[10]; // (h1-h5) MB> d[14]=data[6]-data[14]; // (h3-h7) И.т.д. ;). Просто учти, что дублирование содержимого регистров (коих в х86 всего-то 8 штук) и сложение с вычитанием современные процы делают в разы быстрее загрузки/сохранения содержимого из/в L1 (не говоря уже о l2 или памяти). Да даже умножение (но не деление) куда менее болезненная операция, чем обращение за операндами в память. С уважением, Evgeny 28 февраля 2002 года --- * Origin: LID (2:5020/755.12) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/39153c7e0a97.html, оценка из 5, голосов 10
|