Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: addsub для tms320c6416
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
qxov
abcdefgh --> (a+cool.gif(a-cool.gif(c+d)(c-d)(e+f)(e-f)(g+h)(g-h)
(все восьмибитное)

Результат оптимизации ниже. Лучше пока ничего в голову не приходит.


...
#pragma DATA_ALIGN(8)
double data[DATA_SIZE];
...

for(int i=0;i<DATA_SIZE;i++)
{
double dblVal=_amemd8_const(&data[i]);
int ph=_packh4(_hi(dblVal),_lo(dblVal));
int pl=_packl4(_hi(dblVal),_lo(dblVal));
int a=_add4(ph,pl);
int s=_sub4(ph,pl);
double adde=_mpysu4(a,0x10101010);
double sube=_mpysu4(s,0x01010101);
int hival=_hi(adde)|_hi(sube);
int loval=_lo(adde)|_lo(sube);
_amemd8(&data[i])=_itod(hival,loval);
}
...


PS: давайте делиться своими находками? =)
qxov
Ядро должно быть таким:

double dblVal=_amemd8_const(&metrix[i]);
int ph=_packh4(_hi(dblVal),_lo(dblVal));
int pl=_packl4(_hi(dblVal),_lo(dblVal));
// если разложить в хитром порядке заранее, то будет на 30% быстрее
// int ph=_hi(dblVal);
// int pl=_lo(dblVal);
int a=_add4(pl,ph);
int s=_sub4(pl,ph);
double adde=_mpyu4(a,0x01010101);
double sube=_mpyu4(s,0x01010101);
int hival=(_hi(sube)<<8)|_hi(adde);
int loval=(_lo(sube)<<8)|_lo(adde);
_amemd8(&metrix[i])=_itod(hival,loval);
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.