首页 > 解决方案 > C中的快速交错操作?

问题描述

我需要将两个数组以四个为一组组合成第三个。具体来说,对于输入数组

    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 语言中最快的去交织操作中提出的去交织问题相反吗?

对于一些额外的乐趣,两个缓冲区包含分别为 8 位和 16 位宽的元素。我已经编写了一些代码来执行此操作,但分析表明它花费了大量时间,因此我正在寻找加快速度的方法。由于我的目标 CPU (LEON) 没有提供它们,所以 SIMD 内在函数不是一个选项。我的 CPU 的字长为 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];
        }       

有更快实施的想法吗?

标签: carraysperformancememcpy

解决方案


优化性能通常是一项非常特定于系统的任务。所以我的观察在你的系统上可能无效。

无论如何,FWIW,在我的系统上,通过pBmemcpy.

我更换了:

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

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

并获得了 > 25% 的性能提升。


推荐阅读