iOS
のOpenCV
を使用して、コンピューティングを強化したアプリを完成しました。もちろんそれは遅かったです。しかし、それは私のPCプロトタイプよりも200倍遅いものでした。だから私はそれを最適化していた。非常に最初の15秒から、私は0.4秒のスピードを得ることができました。私はすべてのものと他の人が分かち合うことができるものを見つけたのだろうかと思います。私が何をしたか:IOS/iPad/iPhoneからの最大速度
置き換え "
double
" データ型は、OpenCVの内側に "float
"。ダブルは64ビットで32ビットCPUは簡単に処理できないので、フロートはいくらかスピードを出しました。 OpenCVは非常に頻繁に二重を使用します。"
-mpfu=neon
"をコンパイラオプションに追加しました。副作用は、エミュレータコンパイラがもう動作せず、ネイティブハードウェアのみで何かをテストできるという新しい問題でした。と
cos()
の実装を90値ルックアップテーブルで置き換えました。スピードアップは巨大でした!これは、そのような最適化がスピードアップをもたらさないPCとは幾分反対である。コードは度で作業していましたが、この値はsin()
とcos()
のラジアンに変換されました。このコードも削除されました。しかし、ルックアップテーブルは仕事をしました。有効
"thumb optimizations"
。いくつかのブログ記事は正反対のものを推奨していますが、これは、親指が普通遅くなるからです。armv6
です。armv7
には問題がなく、速くて小さくなります。親指の最適化と
-mfpu=neon
がうまく機能し、クラッシュを引き起こさないように、私はarmv6ターゲットを完全に削除しました。私のコードはすべてarmv7
にコンパイルされており、これもアプリケーションストアの要件として記載されています。つまり、iPhone
は3GS
となります。私は古いものを落とすことはOKだと思います。とにかく古いものはCPUが遅く、CPU使用量の多いアプリケーションは古いデバイスにインストールされていると悪いユーザエクスペリエンスを提供します。もちろん私はOpenCVのから
"dead code"
を削除-O3 flag
を使用しています。 OpenCVを最適化すると、私のプロジェクトには必要ないコードが明らかです。たとえば、ピクセルサイズが8ビットか32ビットかをチェックするために余分にある
"if()"
があります。私は8ビットしか必要ないことを知っています。これによりコードが削除され、オプティマイザは何かを削除したり、定数で置き換えたりすることができます。また、コードはキャッシュに適しています。
その他のトリックとアイデアはありますか?私の親指を有効にし、三角法をルックアップに置き換えることはメーカーを増強し、私を驚かせました。アプリを動かすためにもっとやるべきことが分かっているのでしょうか?
このアクセラレーションは私にとって初めてのものでした。アセンブリレベルの思考が必要なので、まだ使いにくいです。しかし、それでも可能で、おそらく試してみるつもりです。私はここでより有用なヒントを得るかどうかを知りたいので、後で受け入れているとマークします。 –
WWDC 2012ビデオには、Accelerateフレームワークを完全に扱うセッションがあります。あなたはそれを見てください^^ – borrrden
http://adcdownload.apple.com//wwdc_2012/wwdc_2012_session_pdfs/session_708__the_accelerate_framework.pdf と https://developer.apple.com/videos/wwdc/2012/#708はそうですそれのためのリンク –