在iOS中快速比较数组

时间:2012-02-19 04:56:17

标签: iphone arrays optimization neon accelerate-framework

我需要围绕一个更大的二维值数组移动一个小的二维值数组,并将较大数组中大于较小数组中相应值的任何值设置为较小数组的值。想想图像合成,但是使用两个浮点数的2D数组。我需要尽快完成这么多次。只是想知道是否有一些方法可以优化使用NEON Assembly,Accelerate框架或其他一些我没有听说过的方法。有什么比双嵌套for循环更快比较和替换值?例如,将值存储为1D数组而不是2D数组可能会更快吗?或者更快地访问行而不是每列的值?只是试图挤出我能得到的任何额外速度,但不确定如何。

2 个答案:

答案 0 :(得分:2)

我不知道Accelerate框架中可以执行您想要的任何功能。你绝对可以使用NEON来加速它,而不是直接使用汇编语言,使用vmin_f32内在函数一次处理两对浮点数,或者使用vminq_f32一次处理四对浮点数。 / p>

这些链接可能有助于您开始使用内在函数,但我真的没有更好的建议:

How to use the multiply and accumulate intrinsics in ARM Cortex-a8?
ARM Information Center - NEON Intrinsics
ARM NEON Optimization. An Example

我通过Google搜索neon intrinsics tutorial找到了这些。

此外,开发人员工具包包含一些ARM体系结构文档:

Xcode 4.2:/Developer/Library/PrivateFrameworks/DTISAReferenceGuide.framework/Versions/A/Resources/ARMISA.pdf
Xcode 4.3:/Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/Frameworks/DTISAReferenceGuide.framework/Versions/A/Resources/ARMISA.pdf

答案 1 :(得分:0)

如果您需要比较structs的一维C数组,可以尝试memcmp()查看它是否比for循环更有效。如果您能够提供某种类型的数组哈希,那么在数组不同的情况下,您可以显着提高性能。例如,如果您有一个浮点数组,则可以将它们的和用作哈希值。如果数组的哈希值不同,则根本不必比较数组。另一方面,如果您希望数组实际上大多数时间相等,那么哈希的计算只会减慢速度。

通过哈希计算创造性也可能有所帮助。在2D数组的情况下,散列可以是1D数组散列的多项式,甚至是具有元数据的struct,如数组大小,1D数组散列的散列等。

编辑:在最糟糕的情况下(当阵列相同时)比较大型浮点数时,在我的机器上memcmp()比直接单线程for循环快约2倍)。