Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的快速交织操作?_C_Arrays_Performance_Memcpy - Fatal编程技术网

C语言中的快速交织操作?

C语言中的快速交织操作?,c,arrays,performance,memcpy,C,Arrays,Performance,Memcpy,我需要将两个数组组合成四块的第三个数组。 具体来说,对于输入数组 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, ..., 从某种意义上说,这与本文中提出的去交织问题相反 为了获得一些额外的乐趣,这两个缓冲区分别包含8位和16位宽的元素。我已经编写了一些代码

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

    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, ...,
从某种意义上说,这与本文中提出的去交织问题相反

为了获得一些额外的乐趣,这两个缓冲区分别包含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];
        }       
#包括
#定义BUFSZ 1024
寄存器int i;
int8_t A[BUFSZ];//第一缓冲区
int16_t B[BUFSZ];//第二缓冲器
int16_t交错[2*BUFSZ];//这两个缓冲器结合在一起
int8_t*pA;
int16_t*pB,*针叶;
针叶=交错;
对于(i=BUFSZ/4,pA=A,pB=B;i-->0;针叶形+=8,pA+=4,pB+=4){
针叶[0]=pA[0];针叶[1]=pA[1];针叶[2]=pA[2];针叶[3]=pA[3];
针叶[4]=pB[0];针叶[5]=pB[1];针叶[6]=pB[2];针叶[7]=pB[3];
}       

有没有更快实施的想法?

优化性能通常是一项非常系统特定的任务。因此,我的观察结果在您的系统上可能无效

无论如何,FWIW,在我的系统上,我看到了性能的提高,用
memcpy
替换了最后4个赋值(使用
pB

我替换了:

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


性能提高了25%以上。

在我看来很难。您是否尝试过一次写入32位而不是16位我的意思是,让
交错
成为
int32\t
的数组。我似乎还记得,某些CPU型号在16位内存写入方面速度较慢-我没有专门的经验。发布编译器为这段代码生成的程序集。我忘了提到我有一个16位CPU,所以使用32位应该会较慢,虽然我还没有测试过。递减的
I
是性能改进的一部分吗?这有点离题,但不是优化此任务,而是检查此任务是否确实必要?难道你不能在程序的后面直接使用A和B,而不是在交错的
中复制所有内容吗?我看不到此副本的附加值,特别是因为两个阵列似乎都包含异构数据。在优化某些代码时,你必须从全局出发,不一定只关注一个函数。这可能有点疯狂,但如果OP受益于
memcpy
,我也会尝试使用temp buffer for 8
uint8\t
,用短值填充适当的位置,然后
memcpy
将其发送到目标:
int8\t[8];  T[1]=pA[0];T[3]=pA[1];T[5]=pA[2];T[7]=pA[3];memcpy(针叶,T,8)
memcpy(pinterleaved + 4, pB, 4 * sizeof *pB);