[an error occurred while processing this directive]
|
Вот пример линейного кода с программной конвейеризацией:
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: info@telesys.ru