通过计算复制C数组的更快方法

通过计算复制C数组的更快方法,c,arrays,performance,memory-management,copy,C,Arrays,Performance,Memory Management,Copy,我想将一个C数组数据复制到另一个数组,但要在两个数组之间进行计算(即,不仅要将相同的内容从一个数组复制到另一个数组,还要对数据进行修改): intaaa; int src[ARRAY_SIZE]; int dest[数组大小]; //用数据填充src 用于(aaa=0;aaa

我想将一个C数组数据复制到另一个数组,但要在两个数组之间进行计算(即,不仅要将相同的内容从一个数组复制到另一个数组,还要对数据进行修改):

intaaa;
int src[ARRAY_SIZE];
int dest[数组大小];
//用数据填充src
用于(aaa=0;aaa
这是在大小为520或更大的缓冲区中完成的,因此for循环相当可观

在编码方面有什么方法可以提高性能吗

我对这个主题做了一些研究,但我找不到任何关于这个案例的具体信息,只找到了简单的复制缓冲区到缓冲区(示例:,和)


环境:使用嵌入式Linux的ARM GCC。不过,上面的特定代码用于在专用处理器内运行的用于DSP计算的C项目中。通用处理器是OMAP L138(L138中包括DSP处理器)。

您可以尝试诸如循环展开或达夫设备之类的技术,但如果您启用编译器优化,它可能会在任何情况下为您实现这一点,如果这对您的代码不可读有利的话

依赖编译器优化的优势在于它是特定于体系结构的;在一个目标上工作的源代码级技术可能在另一个目标上工作得不太好,但编译器生成的优化将特定于该目标。例如,没有办法专门为C语言中的SIMD指令编写代码,但编译器可能会生成代码来利用这些指令,为此,最好保持代码的简单和直接,以便编译器能够发现习惯用法。编写奇怪的代码来“手动优化”可能会挫败优化器并阻止它完成其工作

另一种可能对某些目标有利的方法是使用移位避免乘法指令(如果您只为桌面x86目标编码,这可能与此无关):

假设
x*30
相当于
x*32-x*2
,循环中的表达式可以替换为:

input[aaa] = (output[aaa] << 5) - (output[aaa] << 1) ;
移位技术可能对除法运算更为有利,除法运算在大多数目标上的成本要高得多,而且它只适用于常数

这些技术可能会提高未优化代码的性能,但编译器优化可能会做得更好,并且原始代码可能比“手动优化”代码优化得更好


最后,如果这很重要,您必须进行实验并执行计时测试或评测。

OpenMP/线程可能会因各种因素而加速。对于这样一个简单的情况,任何半体面的编译器都应该为您优化它。它将展开循环并使用SIMD。除此之外,还有核心级并行化。例如提到的OpenMP。@EugeneSh。这是一个简单的复制和乘法循环。我认为Duff的设备只会混淆编译器,降低实际执行速度。如果数组大小是固定的,您可以尝试手动展开循环。我假设您已经在编译器中打开了优化。有很多可能的优化,具有不同程度的可移植性(例如,SIMD可能是一个选项)和复杂性(尽管使用多核不太可能为520整数带来回报)。有些,比如简单的展开,编译器可能会帮你。然而,对所有平台/编译器组合上所有可能的优化的调查过于广泛。如果您有实际的性能问题,也许您可以描述您的约束、平台和编译器。
input[aaa] = (output[aaa] << 5) - (output[aaa] << 1) ;
int i = output[aaa] ;
input[aaa] = (i << 5) - (i << 1) ;