ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
25 апреля
801249 Топик полностью
йцукен (11.12.2017 16:29, просмотров: 111) ответил SciFi на Если там можно применить SIMD, то лучше ручками, компилятор сам вряд ли догадается.
ИАР не догадывается. Вот мой вариант с SIMD; к сожалению, выигрыш по скорости в пределах статистической погрешности. int16_t get2_simd( void ) { static_assert( ( taps%2 == 0 ) && ( buf_sz%2 == 0 ) && ( decim%2 == 0 ), "taps, buf_sz and decimation should all be even" ); int32_t acc = 0; const uint32_t *px = (const uint32_t *)(buf+out); const uint32_t *pc = (const uint32_t *)coeff; uint32_t count1 = ( buf_sz - out )/2; if ( count1 >= taps/2 ) { for ( int j = taps/2; j; j-- ) acc = __SMLAD( *pc++, *px++, acc ); } else { for ( int j = count1; j; j-- ) acc = __SMLAD( *pc++, *px++, acc ); px = (const uint32_t *)buf; for ( int j = taps/2 - count1; j; j-- ) acc = __SMLAD( *pc++, *px++, acc ); } out += decim; if ( out > buf_sz ) out -= buf_sz; return int16_t( __SSAT( acc >> shift_right, 16 ) ); }