値の小さな2D配列を、はるかに大きな2D値の配列の周りに移動し、小さな配列の対応する値よりも大きい大きな配列の値を小さな配列の値に設定する必要があります。画像合成のようなものですが、フロートの2つの2D配列を使用していると考えてください。私はこれをできるだけ速く何回も行う必要があります。NEON Assembly、Accelerateフレームワーク、または私が聞いたことのない他の方法を使用して最適化する方法があるかどうか疑問に思っています。値を比較して置き換えるための二重ネストされたforループよりもはるかに高速なものはありますか?たとえば、値を2D配列ではなく1D配列として格納する方が速いでしょうか。または、各列を下に移動するのではなく、行全体の値にアクセスする方が高速ですか?私が得ることができる余分な速度を絞り出そうとしているだけですが、方法はわかりません。
2 に答える
Accelerateフレームワークであなたが望むことをする関数を知りません。vmin_f32
アセンブリ言語に直接移動したり、組み込み関数を使用して一度に2ペアのフロートを処理したり、を使用して一度にvminq_f32
4ペアを処理したりすることなく、NEONを使用して高速化できます。
これらのリンクは、組み込み関数の使用を開始するのに役立つ場合がありますが、これ以上のアドバイスはありません。
ARM Cortex-a8で積和演算を使用するにはどうすればよいですか?
ARMインフォメーションセンター-NEON組み込み
関数ARMNEON最適化。例
グーグルで見つけました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次元C配列を比較する必要がある場合は、ループよりも効率的かどうかを確認structs
できます。ある種の配列ハッシュを購入できる場合は、配列が異なる場合のパフォーマンスを劇的に向上させることができます。たとえば、floatの配列がある場合、それらの合計をハッシュとして使用できます。配列のハッシュが異なる場合は、配列を比較する必要はまったくありません。一方、配列が実際にはほとんどの場合等しいと予想される場合、ハッシュの計算は速度を落とすだけです。memcmp()
for
ハッシュ計算を工夫することも役立つかもしれません。2D配列の場合、ハッシュは1D配列ハッシュの多項式である場合もあれば、struct
配列サイズ、1D配列ハッシュのハッシュなどのメタデータを含む場合もあります。
編集:私のマシンでは、最悪のシナリオ(配列が等しい場合)でフロートの大きな配列を比較する場合memcmp()
、単純なシングルスレッドループよりも約2倍高速です。for