IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Как ускорить выполнение программы?
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 23

Репутация: -  0  +


В программе есть цикл, обрабатывающий данные из файла:
Код
repeat
 Read(f_in,d);
 SinCos(j*2*pi*k/N,s1,c1);
 A1:=d.Zn*c1;
 SA:=SA+A1;
 B1:=d.Zn*s1;
 SB:=SB+B1;
 k:=k+1;
until k>N-1;

В файле более 50000 значений. Такой цикл выполняется несколько томительных секунд. Может кто знает: как ускорить его выполнение?

Сообщение отредактировано: volvo -


--------------------
Человек должен думать, а компьютер работать.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Бывалый
***

Группа: Пользователи
Сообщений: 156
Пол: Мужской

Репутация: -  0  +


Привожу FFT-алгоритм, позволяющий оперировать 256 точками данных примерно за 0.008 секунд на P66 (с 72MB, YMMV). Создан на Delphi.

Данный алгоритм я воспроизвел где-то около года назад. Вероятно он не самый оптимальный, но для повышения скорости расчета наверняка потребуются более мощное аппаратное обеспечение.

Но я не думаю что алгоритм слишком плох, в нем заложено немало математических трюков. Имеется некоторое количество рекурсий, но они занимается не копированием данных, а манипуляциями с указателями, если у нас есть массив размером N = 2^d, то глубина рекурсии составит всего d. Возможно имело бы смысл применить развертывающуюся рекурсию, но не пока не ясно, поможет ли ее применение в данном алгоритме. (Но вероятно мы смогли бы достаточно легко получить надежную математическую модель, развертывая в рекурсии один или два нижних слоя, то есть проще говоря:

if Depth < 2 then
{производим какие-либо действия}

вместо текущего 'if Depth = 0 then...' Это должно устранить непродуктивные вызовы функций, что несомненно хорошо в то время, пока развертывающая рекурсия работает с ресурсами.)

Имеется поиск с применением таблиц синусов и косинусов; здесь использован метод золотой середины: данный алгоритм весьма трудоемок, но дает отличные результаты при использовании малых и средних массивов.

Вероятно в машине с большим объемом оперативной памяти следует использовать VirtualAlloc(... PAGE_NOCACHE) для Src, Dest и таблиц поиска.

Если кто-либо обнаружит неверную на ваш взгляд или просто непонятную в данном совете функцию пожалуйста сообщите мне об этом.

Что делает данная технология вкратце. Имеется несколько FFT, образующих 'комплексный FT', который понимает и о котором заботится моя технология. Это означает, что если N = 2^d, Src^ и Dest^ образуют массив из N TComplexes, происходит вызов

FFT(d, Src, Dest)

, далее заполняем Dest с применением 'комплексного FT' после того, как результат вызова Dest^[j] будет равен

1/sqrt(N) * Sum(k=0.. N - 1 ; EiT(2*Pi(j*k/N)) * Src^[k])

, где EiT(t) = cos(t) + i sin(t) . То есть, стандартное преобразование Фурье.

Публикую две версии: в первой версии я использую TComplex с функциями для работы с комплексными числами. Во второй версии все числа реальные - вместо массивов Src и Dest мы используем массивы реальных чисел SrcR, SrcI, DestR, DestI (в блоке вычислений реальных чисел), и вызовы всех функций осуществляются линейно. Первая версия достаточна легка в реализации, зато вторая - значительно быстрее. (Обе версии оперируют 'комплексными FFT'.) Технология работы была опробована на алгоритме Plancherel (также известным как Parseval). Обе версии работоспособны, btw: если это не работает у вас - значит я что-то выбросил вместе со своими глупыми коментариями :-) Итак, сложная версия:

excl.gif Прикрепленный файл  cplx.pas ( 1.71 килобайт ) Кол-во скачиваний: 702

excl.gif Прикрепленный файл  cplxfft1.pas ( 1.91 килобайт ) Кол-во скачиваний: 724

excl.gif Прикрепленный файл  DemoForm.pas ( 1.63 килобайт ) Кол-во скачиваний: 702



**** Версия для работы с реальными числами:

excl.gif Прикрепленный файл  cplxfft2.pas ( 2.46 килобайт ) Кол-во скачиваний: 716

excl.gif Прикрепленный файл  demofrm.pas ( 1.99 килобайт ) Кол-во скачиваний: 710


Взято с www.delphiworld.narod.ru


--------------------
With the best regards Vit

Все всегда уезжают навсегда. Вернуться невозможно-вместо нас всегда возвращается кто-то другой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
SAB   Как ускорить выполнение программы?   10.10.2003 14:50
Nightmare   Re: Как ускорить выполнение программы?   10.10.2003 17:24
SAB   Re: Как ускорить выполнение программы?   11.10.2003 10:07
___ALex___   Re: Как ускорить выполнение программы?   11.10.2003 12:16
Nightmare   Re: Как ускорить выполнение программы?   11.10.2003 14:14
zx1024   Re: Как ускорить выполнение программы?   11.10.2003 14:20
___ALex___   Re: Как ускорить выполнение программы?   12.10.2003 0:48
zx1024   Re: Как ускорить выполнение программы?   12.10.2003 23:40
___ALex___   Re: Как ускорить выполнение программы?   13.10.2003 0:49
SAB   Re: Как ускорить выполнение программы?   13.10.2003 12:11
zx1024   Re: Как ускорить выполнение программы?   13.10.2003 12:34
trminator   Re: Как ускорить выполнение программы?   13.10.2003 19:10
mj   Re: Как ускорить выполнение программы?   15.10.2003 17:27
Vit   Re: Как ускорить выполнение программы?   17.10.2003 21:27
SAB   Re: Как ускорить выполнение программы?   18.10.2003 9:38
Vit   Re: Как ускорить выполнение программы?   20.10.2003 23:58
SAB   Re: Как ускорить выполнение программы?   30.10.2003 15:40


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 10.09.2025 13:05
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name