Nikolay_Po (11.12.2017 15:34, просмотров: 179) ответил SciFi на Если там можно применить SIMD, то лучше ручками, компилятор сам вряд ли догадается.
Пример кода от ARM. За счёт встроенных функций, это больше ассемблер, чем Си. Цикл фильтра функции arm_fir_fast_q15() для Cortex-M4 (комментарии вырезаны для наглядности). Из сишных остались лишь инкремент, декремент и условие цикла: while(tapCnt > 0)
{
c0 = *__SIMD32(pb)++;
acc0 = __SMLAD(x0, c0, acc0);
acc2 = __SMLAD(x2, c0, acc2);
x1 = __PKHBT(x0, x2, 0);
x0 = _SIMD32_OFFSET(px);
acc1 = __SMLADX(x1, c0, acc1);
x1 = __PKHBT(x2, x0, 0);
acc3 = __SMLADX(x1, c0, acc3);
c0 = *__SIMD32(pb)++;
acc0 = __SMLAD(x2, c0, acc0);
x2 = _SIMD32_OFFSET(px + 2u);
acc2 = __SMLAD(x0, c0, acc2);
acc1 = __SMLADX(x1, c0, acc1);
x1 = __PKHBT(x0, x2, 0);
acc3 = __SMLADX(x1, c0, acc3);
px += 4u;
tapCnt--;
}
Код из дистрибутива ARM, CMSIS\DSP_Lib\Source\FilteringFunctions\arm_fir_fast_q15.c