Быстрая операция чередования в C? - PullRequest
4 голосов
/ 20 сентября 2019

Мне нужно объединить два массива в третий порциями по четыре.В частности, для входных массивов

    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];
        }       

Любые идеи для более быстрогоосуществление

1 Ответ

1 голос
/ 20 сентября 2019

Оптимизация производительности часто является очень специфичной для системы задачей.Поэтому мое наблюдение может быть недействительным в вашей системе.

В любом случае, FWIW, в моей системе я вижу улучшение производительности, заменив 4 последних назначения (использующих pB) на memcpy.

Я заменил:

pinterleaved[4]=pB[0]; pinterleaved[5]=pB[1]; pinterleaved[6]=pB[2]; pinterleaved[7]=pB[3];

на

memcpy(pinterleaved + 4, pB, 4 * sizeof *pB);

и получил повышение производительности> 25%.

...