[an error occurred while processing this directive]
|
Вы правы, для многих DSP компилеры дают неоптимальный код... Но это не потому, что разработчики плохие, просто система команд у многих DSP очень богата и разнобразна. Иногда ассемблерная команда заменяет пять-десять строк на С и на десяток ассеблерных команд может уйти несколько дней обдумывания и экспериметов (суровая оптимизация при борьбе за каждый такт). DSP имеет кучу команд которые применяются только для специальных алгоритмов.
Вот пример могучей инструкции которая заменяет 12 строк на C
MAXDIFF ACx, ACy, ACz, ACwTRN0 = TRN0 >> #1
TRN1 = TRN1 >> #1
ACw(39–16) = ACy(39–16) – ACx(39–16)
ACw(15–0) = ACy(15–0) – ACx(15–0)
if (ACx(31–16) > ACy(31–16))
{ bit(TRN0, 15) = #0 ; ACz(39–16) = ACx(39–16) }
else
{ bit(TRN0, 15) = #1 ; ACz(39–16) = ACy(39–16) }
if (ACx(15–0) > ACy(15–0))
{ bit(TRN1, 15) = #0 ; ACz(15–0) = ACx(15–0) }
else
{ bit(TRN1, 15) = #1 ; ACz(15–0) = ACy(15–0) }
Или вот какой с компилер может применить вот такую команду
SWAP4 AR4, T0This instruction performs four parallel moves between four auxiliary registers (AR4, AR5, AR6, and AR7) and four temporary registers (T0, T1, T2, and T3) in one cycle
Tmp1=T0;
Tmp2=T1;
Tmp3=T2;
Tmp4=T3;
T0=AR4;
T1=AR5;
T2=AR6;
T4=AR7;
AR4=Tmp1;
AR5=Tmp2;
AR6=Tmp3;
AR7=Tmp4
Столь извращенная система команд - это одновремменно и божья благодать и проклятие DSP. На ассемблере 55xx возможны такие чудеса, от которых C писателям сразу плохо становится - простое переписывание а асме может легко ускорить алгоритм в десять раз, но и цена тоже немалая - скорость разработки снижается во столько раз, во сколько ускоряется скорость работы программы...
Видимо оптимум - делать управляющий код (код без циклов, или с небольшими циклами) на C и код который производит однотипные циклические операции на Asm'е
E-mail: info@telesys.ru