[an error occurred while processing this directive]
Весь проект меня не интересует, вот когда вы опубликуете весь код(:-)...
(«Телесистемы»: Конференция «Цифровые сигнальные процессоры (DSP) и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено GM 24 февраля 2005 г. 14:40
В ответ на: Ответ на все вопросы отправлено nyavro 24 февраля 2005 г. 09:01

Не надо! Это шутка! Мы говорим только о конкретной подпрограмме. Алгоритм вычислений немного кривоват, извините, надо его выпрямлять. В связи с этим я и спрашивал Вас, ЧТО Вы должны делать с входным массивом, а не КАК. Как Вы это реализовали, я уже вижу, не здорово.

В среднем программа на ассемблере работает быстрее в 6-8 раз, чем программа на Си. Так что у Вас есть шанс добиться нужной производительности, возможно на пределе.

Общие принципы таковы. Избавляйтесь от каскадно вложенных циклов, избавляйтесь от передачи аргументов из программы высокого уровня (на Си) в программу низкого уровня (на ассемблере).

Теперь конкретно по оптимизации. Если у Вас массив Н всегда состоит из 5 элементов Н0,Н1,Н2,Н3,Н4, то предлагаю использовать другой массив такого вида Н0;Н1,Н0;Н2,Н1,Н0;Н3,Н2,Н1,Н0;Н4,Н3,Н2,Н1,Н0. Точками с запятой показаны границы для коэффициентов, используемых для вычисления сумм частных произведений. Далее давайте введем указатели hPtr и yPtr на новый массив коэффициентов Нi и входной массив Yi соответственно. Тогда алгоритм можно изобразить примерно так.


mac *hPtr+,*yPtr+,a ;первая частная сумма
;заметьте hPtr указывает на требуемый коэффициент для второй
;частной суммы, не надо ничего складывать или вычитать
mvmm ar1,yPtr ;выставим указатель снова на Y0
mac *hPtr+,*yPtr+,a
mac *hPtr+,*yPtr+,a ;вторая частная сумма
;здесь надо возвести содержимое ассА в квадрат и добавить к ассВ
;затем надо обнулить ассА для новой частной суммы
;hPtr указывает на требуемый коэффициент для третьей суммы
mvmm ar1,yPtr ;выставим указатель снова на Y0
mac *hPtr+,*yPtr+,a
mac *hPtr+,*yPtr+,a
mac *hPtr+,*yPtr+,a ;третья частная сумма
;hPtr указывает на требуемый коэффициент для четвертой суммы
mvmm ar1,yPtr ;выставим указатель снова на Y0
mac *hPtr+,*yPtr+,a
mac *hPtr+,*yPtr+,a
mac *hPtr+,*yPtr+,a
mac *hPtr+,*yPtr+,a ;четвертая частная сумма
;hPtr указывает на требуемый коэффициент для пятой суммы
mvmm ar1,yPtr ;выставим указатель снова на Y0
mac *hPtr+,*yPtr+,a
mac *hPtr+,*yPtr+,a
mac *hPtr+,*yPtr+,a
mac *hPtr+,*yPtr+,a
mac *hPtr+,*yPtr+,a ;пятая частная сумма
;в ассВ должен лежать готовый результат, его надо сохранить
;в массиве Y2(одна инструкция)
;заметьте yPtr указывает теперь на следующую пятерку
;в Вашем входном массиве БЕЗО ВСЯКИХ ДОПОЛНИТЕЛЬНЫХ арифметических
;действий, пожирающих циклы, как свинья апельсины...

Ну вот в итоге мы пришли-таки к одному циклу, что есть правильно.
Конечно, я дал Вам голую идею, хотя и весьма подробно, Вам надо ее
реализовать поточнее и практически. Если вы возьметесь за такую работу, то любопытно было бы узнать, сколько было циклов в исходном варианте и сколько в окончательном, и сравнить сие с циклами из Си.

Можно еще и дальше пофантазировать...

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru