c - 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];
}
有更快实施的想法吗?
解决方案
优化性能通常是一项非常特定于系统的任务。所以我的观察在你的系统上可能无效。
无论如何,FWIW,在我的系统上,通过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% 的性能提升。
推荐阅读
- data-structures - 这个循环如何运行 nlogn 次?(对于 (j = 2; j <= n; j = j * 2) )
- javascript - Angular使用索引名称从json中检索数据
- javascript - 如何摆脱重复的数字
- statistics - 如何检查数据点在其分布中是否重要
- diff - 在希伯来语中使用 diff
- r - aws.s3:获取 S3 文件的版本信息
- c++ - 向量有什么区别
arr 和 int arr[] - php - 我需要帮助获取表格以发送包含结果的电子邮件
- django - 如何分配存储Django Group迁移文件的特定路径
- spring-boot - JPA querydsl加入其他数据库?