4

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

4

2 回答 2

2

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

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

如何在 ARM Cortex-a8 中使用乘法和累加内在函数?
ARM 信息中心 - NEON 内在
ARM NEON 优化。一个例子

我通过谷歌搜索找到了那些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

于 2012-02-19T05:13:33.670 回答
0

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

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

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

于 2012-02-19T08:46:53.233 回答