Jump to content

    

Торомоза с БПФ

Добрый день всем!

 

Происходят странные вещи. Работаю с C6670. Необходимо выполнять двумерное комплексное БПФ от матрицы размером NxN, где N=128. По скоростному отчёту (benchmark) TI одно ядро этого проца должно выполянть одномерное комплексное БПФ для N=128 при за 1680 циклов, т.е. при тактовой частоте F=983МГц около 2мкС. Правдоподобно. Но начальство этому не поверило и заставило меня реально в этом убедиться.

 

Взял исходник функции DSP_fft32 из примера fft_example пакета DSPLIB 3.1. Загнал его в цикл NxNxM (для имитации 2D-FFT), где M-взято равным 50, что бы время выполнения было значительным.

Запусаем в отладчике CCS 5.1 на одном ядре. Профилировщиком я даже не стал пользоваться - просто по секундомеру засекали.

26 секунд! Если поделить на NxNxM, то получается, что одно 128-точечное компл. БПФ выполняется около 30мкс!! Но это же, простите, показатели DSP 90х годов!

 

Корифеи помогите, в чём здесь фокус?

Share this post


Link to post
Share on other sites

как настроен CASH? где хранятся исходные данные? куда они уходят? правильно ли настроена тактовая (PLL)?

 

Share this post


Link to post
Share on other sites
как настроен CASH? где хранятся исходные данные? куда они уходят? правильно ли настроена тактовая (PLL)?

 

Добрый день, bav, хоть кто-то ответил :)

 

Кто такой CASH, к стыду своему, не знаю. И исходные данные (один и тот же массив размера 2N) и результаты расчёта (массив такого же размера) храняться в L1D и никуда не передаются.

По поводу PLL: после выбора "Connect Target" консоль сообщает следующее: "PLL1 setup for DSP @ 983.0MHz, ..."

 

Хотя мысль хорошая: а реально ли у меня тактовая частота такова? Надо будет проверить.

Share this post


Link to post
Share on other sites
И исходные данные (один и тот же массив размера 2N) и результаты расчёта (массив такого же размера) храняться в L1D и никуда не передаются.
А как насчёт банков памяти в этом ядре - имеются в нём банки памяти?

Насколько помню из C5502, там были 2-портовые банки памяти, которые допускали не более двух обращений к банку за такт. Соответственно - если требуется больше обращений за такт, то расположение данных в одном банке приводит к тормозам. И приходилось входные/выходные данные фильтров и таблицы коэффициентов разносить по разным банкам памяти для получения полной скорости.

 

Сейчас работаю с ядром C674x и пока ничего не знаю про его банкинг - есть ли он здесь?

 

Взял исходник функции DSP_fft32 из примера fft_example пакета DSPLIB 3.1.
Вы именно исходник DSP_fft32 взяли? Или скомпилённую библиотеку подключили? Если первое - возможно у вас эта функция скомпилялась неоптимально. Попробуйте библиотечную. Я использую второй вариант.

 

Share this post


Link to post
Share on other sites

О. ура, разобрался! Особый фэнкс jcxz'у, он меня навёл на решение этим сообщением:

 

Вы именно исходник DSP_fft32 взяли? Или скомпилённую библиотеку подключили? Если первое - возможно у вас эта функция скомпилялась неоптимально. Попробуйте библиотечную. Я использую второй вариант.

 

просто в настройках проекта пришлось по максимуму поубивать всякие добавки, которые пришлёпывают для отладки. Теперь нельзя посмотреть не переменные, ни память, ничего. Но зато сразу всё ускорилось на порядок, по тестам выполнение одного БПФ - 1,7мкС, у меня получается чуть больше двух микросекунд. Это уже приемлимо.

Хотя остался вопрос, что ж там сборщик такого понадобавлял в отладочный проект, что так всё тормозит?

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this