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

> ВНИМАНИЕ!

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

> Как ускорить выполнение программы?
SAB
сообщение 10.10.2003 10:50
Сообщение #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 - 5.01.2005 14:03


--------------------
Человек должен думать, а компьютер работать.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Vit
сообщение 20.10.2003 19:58
Сообщение #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 килобайт ) Кол-во скачиваний: 423

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

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



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

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

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


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


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

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

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


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

 



- Текстовая версия 13.07.2025 23:23
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"