Мне нужно объединить два массива в третий порциями по четыре.В частности, для входных массивов
A0, A1, A2, A3, A4, A5, A6, A7 ...
B0, B1, B2, B3, B4, B5, B6, B7 ...
выходные данные должны быть
A0 A1 A2 A3 B0 B1 B2 B3 A4 A5 A6 A7 B4 B5 B6 B7, ...,
В некотором смысле, это обратный вопрос о обращенном перемежении, заданном в Самое быстрое обратное перемежениеоперация в C?
Для дополнительного удовольствия два буфера содержат элементы шириной соответственно восемь и шестнадцать битов.Я написал некоторый код для этого, но профилирование показывает, что оно тратит много времени, поэтому я ищу способы ускорить его.Поскольку мой целевой процессор (LEON) не предоставляет их, встроенные функции SIMD не подходят.Длина моего процессора составляет 16 бит.
Я пробовал разные способы выполнения цикла, и это самая быстрая версия, которая у меня есть:
#include <stdint.h>
#define BUFSZ 1024
register int i;
int8_t A[BUFSZ]; // 1st buffer
int16_t B[BUFSZ]; // 2nd buffer
int16_t interleaved[2*BUFSZ]; // the two buffers combined
int8_t *pA;
int16_t *pB, *pinterleaved;
pinterleaved=interleaved;
for(i=BUFSZ/4, pA=A, pB=B; i-->0; pinterleaved+=8, pA+=4, pB+=4){
pinterleaved[0]=pA[0]; pinterleaved[1]=pA[1]; pinterleaved[2]=pA[2]; pinterleaved[3]=pA[3];
pinterleaved[4]=pB[0]; pinterleaved[5]=pB[1]; pinterleaved[6]=pB[2]; pinterleaved[7]=pB[3];
}
Любые идеи для более быстрогоосуществление