2012-02-19 10 views
4

大規模な2D配列の値を小さな2D配列で移動し、小さい配列の対応する値より大きい値を大きな配列の値に設定する必要がありますより小さいアレイの画像の合成を考えてみましょう。しかし、浮動小数点の2つの2D配列を使用しています。私はできるだけ速くこれを行う必要があります。 NEONアセンブリを使用して最適化する方法があるかどうか疑問に思うだけですが、Accelerateフレームワークや他の方法については聞いたことがありません。値を比較したり置き換えたりするために、二重ネストされたforループよりもはるかに高速になるものはありますか?たとえば、2D配列の代わりに1D配列として値を格納するほうが速いでしょうか?または各列を下ろすのではなく、行間の値にアクセスする方が速いのですか?余分なスピードを搾取しようとしていますが、どうしたらいいか分かりません。iOSの配列の高速比較

答えて

2

私は、Accelerateフレームワークの中で、あなたが望むことをする機能について知りません。一度に2つの浮動小数点数を処理するのにvmin_f32組み込み関数を使用するか、を使用して一度に4つの対を処理することによって、アセンブリ言語に直接進むことなくNEONを使用して高速化できます。

これらのリンクを使用して、組み込み関数を使用して開始し得るのを助けるかもしれないが、私は本当にあなたのために任意のより良いアドバイスを持っていない: ARM NEON Optimization. An Example


ARM Information Center - NEON Intrinsics

How to use the multiply and accumulate intrinsics in ARM Cortex-a8?私はneon intrinsics tutorialをグーグルでそれらを発見しました。 Xcodeの4.3 /Developer/Library/PrivateFrameworks/DTISAReferenceGuide.framework/Versions/A/Resources/ARMISA.pdf

のXcode 4.2:

また、開発者向けツールのパッケージには、いくつかのARMアーキテクチャのドキュメントが含まれて/Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/Frameworks/DTISAReferenceGuide.framework/Versions/A/Resources/ARMISA.pdf

0

あなたがstructsの1次元のC配列を比較する必要がある場合は、あなたが試すことができますループがforループよりも効率的かどうかを調べるにはmemcmp()を使用してください。何らかの配列ハッシュを用意できれば、配列が異なる場合のパフォーマンスが大幅に向上します。たとえば、浮動小数点数の配列がある場合、その合計をハッシュとして使用できます。配列のハッシュが異なる場合は、配列をまったく比較する必要はありません。一方、配列が実際にはほとんど同じであると予想した場合、ハッシュの計算では処理が遅くなります。

ハッシュ計算で創造的に役立つかもしれません。 2D配列の場合、ハッシュは、1D配列ハッシュの多項式、または配列サイズ、1D配列ハッシュのハッシュなどのメタデータを含むstructでさえあります。は、1D配列ハッシュのハッシュよりも約2倍高速です。ワーストケースの大規模な配列(配列が等しい場合)を比較すると、ループが単純な単一スレッドのループになります。