[an error occurred while processing this directive]
Ответ: (+)
(«Телесистемы»: Конференция «Цифровые сигнальные процессоры (DSP) и их применение»)

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

Отправлено SM 04 марта 2003 г. 11:11
В ответ на: очень интересно про software pipelining отправлено yes 04 марта 2003 г. 10:31

Вот пример линейного кода с программной конвейеризацией:


STW .D2T2 B12,*+SP(28) ; |99|
|| SHR .S1 A11,1,A10
|| CMPLT .L2X A0,0,B2 ; A1 <= (d<0)


STW .D2T2 B13,*+SP(32)
|| LMBD .L1 1,A10,A10


LDW .D2T2 *+B5(40),B6 ;
|| LDW .D1T1 *+A5(72),A6 ;---+
|| SUB .L1 A2,A10,A10


; |
LDW .D2T2 *+B5(36),B6 ;---+--+
|| LDW .D1T1 *+A5(68),A7 ; | |
|| OR .L1 A10,A8,A8


; | |
LDW .D2T2 *+B5(32),B6 ;---+--+--+
|| LDW .D1T1 *+A5(64),A8 ; | | |
|| EXTU .S1 A11,A8,A11


; | | |
LDW .D2T2 *+B5(28),B6 ;------------+
|| LDW .D1T1 *+A5(60),A9 ; | | | |
|| AND .L1 A7,A11,A11
|| SHL .S1 A10,7,A10


; | | | |
LDW .D2T2 *+B5(24),B7 ;---------------+ D1 D2
|| LDW .D1T1 *+A5(56),A10 ; A6 | | | |
|| ADD .L1 A10,A11,A0
|| SHR .S1 A3,2,A11


; B6 | | | |
LDW .D1T1 *+A5(52),A11 ;<--+ | | | | D1 D2
|| LDW .D2T2 *+B5(20),B7 ; | | | | |
|| INTSP .L2 B6,B6 ; | B6 | | |
|| SUB .L1 A0,A11,A0 ; A0 <= dln
|| MVK .S1 CST0,A12
|| MVK .S2 SIZX,B0


; | A7 | | |
STW .D1T1 A6,*+A5(76) ;<-----+ | | | D1 D2
|| INTSP .L2 B6,B6 ; | | | | |
|| LDW .D2T2 *+B5(16),B7 ; | | B6 | |
|| CMPLT .L1 A0,A12,A2
|| ZERO .S2 B1
|| MVK .S1 CST1,A12


; | | A7 | |
STW .D1T1 A7,*+A5(72) ;<--------+ | | D1 D2
|| INTSP .L2 B6,B6 ; | | | | |
|| LDW .D2T2 *+B5(12),B8 ; | | | A9 |
|| [!A2] MVK .S2 1,B1
|| [!A2] CMPLT .L1 A0,A12,A2
|| MVK .S1 CST2,A12

; | | | B6 |
STW .D1T1 A8,*+A5(68) ;<-----------+ | D1 D2 L2
|| INTSP .L2 B6,B6 ; | | | | |
|| LDW .D2T2 *+B5(84),B9 ; | | | | A10
|| [!A2] MVK .S2 2,B1
|| [!A2] CMPLT .L1 A0,A12,A2
|| MVK .S1 CST3,A12


; B6 | | | B7
MPYSP .M1X B6,A6,A6 ;<--+<----------+ D1 D2 L2
|| STW .D1T1 A9,*+A5(64) ; | | | |
|| INTSP .L2 B7,B6 ; | | | |
|| LDW .D2T2 *+B5(80),B10 ; A11 | | |
|| [!A2] MVK .S2 3,B1
|| [!A2] CMPLT .L1 A0,A12,A2
|| MVK .S1 CST4,A12


MPYSP .M1X B6,A7,A7 ;<--+<-+ | | D2 L2
|| STW .D1T1 A10,*+A5(60) ; | | | |
|| INTSP .L2 B7,B6 ; | | | |
|| LDH .D2T2 *+B5(10),B8 ; | | | | --- B8 <= ap
|| [!A2] MVK .S2 4,B1
|| [!A2] CMPLT .L1 A0,A12,A2
|| MVK .S1 CST5,A12

; | B7 B6 |
MPYSP .M1X B6,A8,A6 ;<-----+--+ | D2 L2
|| STW .D1T1 A11,*+A5(56) ; | | | |
|| INTSP .L2 B7,B6 ; | | | |
|| LDH .D2T2 *+B5(4),B9 ; | | | | --- B9 <= yu
|| [!A2] MVK .S2 5,B1
|| [!A2] CMPLT .L1 A0,A12,A2
|| MVK .S1 CST6,A12

Весь код рассчитан на то, что команда произошедшая сколько-то тактов раньше записывает результат на текущем такте. В этом примере хорошо заметны подряд стоящие LDW в один и тот-же регистр, затем с задержкой в 4 delay-слота команды INTSP на этом регистре, затем - еще с задержкой в три слота MPYSP. Если вдруг куда-то вкрадется прерывание - то кирдык программному конвейеру - какая-либо из команд получит вместо ожидаемого данного нечто совсем другое. По-этому на время выполнения такого "конвейеризированного" кода прерывания необходимо запрещать. Прерывания можно разрешить только ВНЕ таких оптимизораванных мест, например между вызовами подпрограмм, или где-то где специально написан код, не зависящий от конвейеризации. То есть такой код, где все операции с командами с delay-слотами производятся не на одном и том-же регистре, а на разных. И в результате прерываний данные не потеряются.

подробнее по а)
Про помощь EDMA в решении моих проблем - это довольно хитро-навороченных механизм пересылок, позволяющий не трогая кеш что-то куда-то переслать, транспонировать, и т.п. По-этому чильно помогает, так как не надо то-же самое делать программно. Да и чем дольше будешь находиться в обработке данных (чем больше буфер с ними), тем меньше будет промахов конвейера, так как самый ресурсо-емкий код все-таки сильнее всего оптимизируется.

по б)
Причины к этому две. Прерывание пакостит в кэше. И, чтобы разрешить где-то прерывание надо почти отказаться в этом месте от оптимизации.

по в)
То-же самое, что и б) - чтобы в кеше все было как на момент до прерывания. Или почти все. Но, к сожалению, кэш вогнать во freeze можно только в 6х0х, а в моих процах (6х1х) с этим облом-с.

Теперь про переходы, кэш и их оптимизацию. Конечно, умеючи недолго пришибить все прелести кэша. Я имел ввиду, конечно не CALL куда-то (точнее, CALLов вообще нет в этих процах), который (в моем коде) - дело редкое по сравнению с software-pipelined кодом. А имел ввиду переходы в циклических структурах, которые не вызывают замены данных в строках кеша, и встречаются на порядок чаще.

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

Ответы


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

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

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

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

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


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

E-mail: info@telesys.ru