【问题标题】:fast comparison of arrays in iOSiOS中数组的快速比较
【发布时间】:2012-03-09 22:49:39
【问题描述】:

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

【问题讨论】:

    标签: iphone arrays optimization neon accelerate-framework


    【解决方案1】:

    我不知道 Accelerate 框架中有任何功能可以满足您的需求。您绝对可以使用 NEON 来加速它,而无需直接使用汇编语言,使用 vmin_f32 内在函数一次处理两对浮点数,或使用 vminq_f32 一次处理四对浮点数。

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

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

    我通过谷歌搜索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

    【讨论】:

      【解决方案2】:

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

      在哈希计算方面发挥创意也可能有所帮助。在二维数组的情况下,哈希可能是一维数组哈希的多项式,甚至是带有元数据的struct,如数组大小、一维数组哈希的哈希等。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-20
        • 2021-02-07
        • 2011-10-02
        相关资源
        最近更新 更多