2014-12-18 16 views
0

之间的计算我想复制C数组到另一个数据,但之间的计算(即不只是复制相同的内容从一个到另一个,但有一个修改数据):更快的方法复制C数组与

int aaa; 
int src[ARRAY_SIZE]; 
int dest[ARRAY_SIZE]; 

//fill src with data 

for (aaa = 0; aaa < ARRAY_SIZE; aaa++) 
{ 
    dest[aaa] = src[aaa] * 30; 
} 

这是520或更高的缓冲区,所以for循环是相当可观的。

有没有什么办法可以提高编码性能?我做了一些关于这个话题的研究,但是我找不到任何关于这个案例的具体内容,只是关于简单的复制缓冲区到缓冲区(例如:here,herehere)。

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

+0

看看达夫设备:http://en.wikipedia.org/wiki/Duff%27s_device –

+1

OpenMP /线程可以加速它的因素。 – Carlise

+0

@Carlise你确定多线程在使用多核时不会产生缓存问题吗?在单一的情况下,你会支付不同线程之间的上下文切换。 – DRC

回答

2

你可以尝试的技术,如循环展开或达夫设备,但如果你打开编译器优化它可能会为你做任何情况下,如果有利,而不使代码不可读。

依赖编译器优化的优点是它是特定于体系结构的;在另一个目标上运行的源代码级技术可能无法在另一个目标上运行得如此之好,但编译器生成的优化将针对目标。例如,没有办法专门为C语言中的SIMD指令编写代码,但编译器可能会生成代码来利用它们,为此,最好保持代码简单直接,以便编译器能够发现成语。编写奇怪的代码来“手动优化”可以击败优化器并停止它的工作。

另一种可能性,即可能是有利的一些目标(如果你永远只能编码桌面x86的目标,这可能是无关紧要的),是通过转移来避免乘法指令:

鉴于x * 30相当于到x * 32 - x * 2,在环路中的表达可以替换为:

input[aaa] = (output[aaa] << 5) - (output[aaa] << 1) ; 

但同样的优化可能为你做的;它也将避免的output[aaa]反复评价,但如果不是这种情况,以下可以是有益的:

int i = output[aaa] ; 
input[aaa] = (i << 5) - (i << 1) ; 

变速技术很可能是对除法运算这是远在大多数更昂贵的更有利的目标,它只适用于常量

这些技术有可能改善的未优化代码的性能,但编译器的优化可能会做的更好,而原来的代码可以优化比“手工优化”代码更好。

最后,如果它很重要,则必须进行实验并执行时序测试或分析。

相关问题